[
  {
    "path": ".editorconfig",
    "content": "root = true\n\n[*]\ncharset=utf-8\ninsert_final_newline=true\nindent_style=space\nindent_size=4\n\n[*.xml]\nindent_size=2\n\n[*.yml]\nindent_size=2\n\n[*.html]\nindent_size=2\n\n[*.properties]\ncharset=latin1\n\n[*.sql]\nindent_size=2\n\n[*.json]\nindent_size=2\n\n[zpa-checks/src/integrationTest/resources/expected/**/*.json]\ninsert_final_newline = false\nij_any_space_before_colon = true\n"
  },
  {
    "path": ".gitattributes",
    "content": "*.sql linguist-language=PLSQL\nzpa-checks/src/integrationTest/resources/sources/** linguist-vendored\n"
  },
  {
    "path": ".github/renovate.json",
    "content": "{\n    \"$schema\": \"https://docs.renovatebot.com/renovate-schema.json\",\n    \"extends\": [\n        \"config:best-practices\",\n        \":automergePatch\",\n        \"schedule:weekly\"\n    ],\n    \"mode\": \"full\",\n    \"ignoreDeps\": [\n        \"org.sonarsource.sonarqube:sonar-plugin-api-impl\",\n        \"org.sonarsource.api.plugin:sonar-plugin-api\",\n        \"org.sonarsource.sonarqube:sonar-ws\"\n    ]\n}\n"
  },
  {
    "path": ".github/workflows/build.yml",
    "content": "name: Build\n\non:\n  push:\n    branches:\n      - \"*\"\n  pull_request:\n    branches:\n      - main\n\nenv:\n  JAVA_VERSION: 21\n\npermissions:\n  contents: read\n\njobs:\n  build:\n    name: Build\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n        with:\n          submodules: true\n\n      - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n        with:\n          distribution: temurin\n          java-version: ${{ env.JAVA_VERSION }}\n\n      - name: Setup Gradle\n        uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6\n\n      - name: Build with Gradle\n        run: ./gradlew build jreleaserAssemble publishToMavenLocal\n\n      - name: Run zpa-checks integration tests\n        run: |\n          ./gradlew :zpa-checks:integrationTest --rerun\n          cat zpa-checks/build/integrationTest/progress-summary.md >> $GITHUB_STEP_SUMMARY\n\n      - name: Build custom rules example\n        run: ./gradlew build -p plsql-custom-rules\n\n      - name: Upload build artifacts\n        uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7\n        with:\n          name: build-artifacts\n          path: |\n            **/build/\n            zpa-checks/tools/\n          retention-days: 1\n\n  integration-tests:\n    name: IT\n    needs: build\n    if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        sqVersion:\n          - 26.2.0.119303\n          - 26.3.0.120487\n          - 26.4.0.121862\n          - 26.5-SNAPSHOT\n    steps:\n      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n\n      - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n        with:\n          distribution: temurin\n          java-version: ${{ env.JAVA_VERSION }}\n\n      - name: Setup Gradle\n        uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6\n\n      - name: Download build artifacts\n        uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8\n        with:\n          name: build-artifacts\n\n      - name: Run plugin integration test\n        run: |\n          if [[ \"$SQ_VERSION\" == *\"SNAPSHOT\"* ]]; then\n            FOLDER=\"snapshots\"\n          else\n            FOLDER=\"releases\"\n          fi\n          \n          FILE_NAME=\"sonar-application-${SQ_VERSION}.zip\"\n          DOWNLOAD_URL=\"https://$OCI_NAMESPACE.objectstorage.sa-saopaulo-1.oci.customer-oci.com/p/$OCI_PAR/n/$OCI_NAMESPACE/b/build-artifacts/o/${FOLDER}/${FILE_NAME}\"\n          \n          curl -s -L -f -o \"sonar-zpa-plugin/${FILE_NAME}\" \"$DOWNLOAD_URL\"\n          ./gradlew :sonar-zpa-plugin:integrationTest -Dsonar.zipFile=$FILE_NAME --rerun --info\n        env:\n          SQ_VERSION: ${{ matrix.sqVersion }}\n          OCI_NAMESPACE: ${{ secrets.OCI_NAMESPACE }}\n          OCI_PAR: ${{ secrets.OCI_PAR }}\n\n  release:\n    name: Release\n    permissions:\n      contents: write\n    needs: integration-tests\n    if: github.ref == 'refs/heads/main'\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n        with:\n          fetch-depth: 0\n\n      - uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5\n        with:\n          distribution: temurin\n          java-version: ${{ env.JAVA_VERSION }}\n\n      - name: Setup Gradle\n        uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6\n\n      - name: Download build artifacts\n        uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8\n        with:\n          name: build-artifacts\n\n      - name: Generate plsql-custom-rules archive\n        run: git archive --format=zip -o build/plsql-custom-rules.zip HEAD:plsql-custom-rules\n\n      - name: Create local Maven repository\n        run: ./gradlew publish\n\n      - name: Run SonarQube Scanner\n        run: ./gradlew sonar --info\n        env:\n          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}\n          SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }}\n\n      - name: Release artifacts\n        run: ./gradlew jreleaserFullRelease\n        env:\n          JRELEASER_MAVENCENTRAL_USERNAME: ${{ secrets.MAVEN_USERNAME }}\n          JRELEASER_MAVENCENTRAL_PASSWORD: ${{ secrets.MAVEN_PASSWORD }}\n          JRELEASER_NEXUS2_USERNAME: ${{ secrets.MAVEN_USERNAME }}\n          JRELEASER_NEXUS2_PASSWORD: ${{ secrets.MAVEN_PASSWORD }}\n          JRELEASER_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n          JRELEASER_GPG_PUBLIC_KEY: ${{ secrets.GPG_PUBLIC_KEY }}\n          JRELEASER_GPG_SECRET_KEY: ${{ secrets.GPG_SECRET_KEY }}\n          JRELEASER_GPG_PASSPHRASE: ${{ secrets.GPG_KEY_PASSWORD }}\n\n  dependency-submission:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n    steps:\n      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6\n\n      - name: Generate and submit dependency graph\n        uses: gradle/actions/dependency-submission@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6\n"
  },
  {
    "path": ".gitignore",
    "content": "*.pydevproject\n.metadata\nbin/\ntmp/\n*.tmp\n*.bak\n*.swp\n*~.nib\nlocal.properties\n.settings/\n.loadpath\ntarget/\ndependency-reduced-pom.xml\n\n# Eclipse Core\n.project\n\n# External tool builders\n.externalToolBuilders/\n\n# Locally stored \"Eclipse launch configurations\"\n*.launch\n\n# CDT-specific\n.cproject\n\n# JDT-specific (Eclipse Java Development Tools)\n.classpath\n\n# Java annotation processor (APT)\n.factorypath\n\n# PDT-specific\n.buildpath\n\n# sbteclipse plugin\n.target\n\n# TeXlipse plugin\n.texlipse\n.sonar\n\n# IntelliJ IDEA\n.idea\n*.iml\n\n# SonarQube\n.scannerwork\n\n# ---- Gradle\n.gradle\n**/build/\n!src/**/build/\n\n# Ignore Gradle GUI config\ngradle-app.setting\n\n# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)\n!gradle-wrapper.jar\n\n# Cache of project\n.gradletasknamecache\n.kotlin/\nzpa-checks/tools/\n"
  },
  {
    "path": ".gitmodules",
    "content": "[submodule \"its/sources/pljson\"]\n\tpath = zpa-checks/src/integrationTest/resources/sources/pljson\n\turl = https://github.com/pljson/pljson.git\n\tignore = dirty\n[submodule \"its/sources/alexandria-plsql-utils\"]\n\tpath = zpa-checks/src/integrationTest/resources/sources/alexandria-plsql-utils\n\turl = https://github.com/mortenbra/alexandria-plsql-utils.git\n\tignore = dirty\n[submodule \"its/sources/utPLSQL\"]\n\tpath = zpa-checks/src/integrationTest/resources/sources/utPLSQL2\n\turl = https://github.com/utPLSQL/utPLSQL.git\n\tignore = dirty\n[submodule \"its/sources/utPLSQL3\"]\n\tpath = zpa-checks/src/integrationTest/resources/sources/utPLSQL3\n\turl = https://github.com/utPLSQL/utPLSQL/\n\tignore = dirty\n[submodule \"its/sources/Doag-Forms\"]\n\tpath = zpa-checks/src/integrationTest/resources/sources/Doag-Forms\n\turl = https://github.com/Doag/Forms.git\n\tignore = dirty\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participation in our\ncommunity a harassment-free experience for everyone, regardless of age, body\nsize, visible or invisible disability, ethnicity, sex characteristics, gender\nidentity and expression, level of experience, education, socio-economic status,\nnationality, personal appearance, race, caste, color, religion, or sexual\nidentity and orientation.\n\nWe pledge to act and interact in ways that contribute to an open, welcoming,\ndiverse, inclusive, and healthy community.\n\n## Our Standards\n\nExamples of behavior that contributes to a positive environment for our\ncommunity include:\n\n* Demonstrating empathy and kindness toward other people\n* Being respectful of differing opinions, viewpoints, and experiences\n* Giving and gracefully accepting constructive feedback\n* Accepting responsibility and apologizing to those affected by our mistakes,\n  and learning from the experience\n* Focusing on what is best not just for us as individuals, but for the overall\n  community\n\nExamples of unacceptable behavior include:\n\n* The use of sexualized language or imagery, and sexual attention or advances of\n  any kind\n* Trolling, insulting or derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or email address,\n  without their explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n  professional setting\n\n## Enforcement Responsibilities\n\nCommunity leaders are responsible for clarifying and enforcing our standards of\nacceptable behavior and will take appropriate and fair corrective action in\nresponse to any behavior that they deem inappropriate, threatening, offensive,\nor harmful.\n\nCommunity leaders have the right and responsibility to remove, edit, or reject\ncomments, commits, code, wiki edits, issues, and other contributions that are\nnot aligned to this Code of Conduct, and will communicate reasons for moderation\ndecisions when appropriate.\n\n## Scope\n\nThis Code of Conduct applies within all community spaces, and also applies when\nan individual is officially representing the community in public spaces.\nExamples of representing our community include using an official email address,\nposting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported to the community leaders responsible for enforcement at\nfelipe@felipezorzo.com.br.\nAll complaints will be reviewed and investigated promptly and fairly.\n\nAll community leaders are obligated to respect the privacy and security of the\nreporter of any incident.\n\n## Enforcement Guidelines\n\nCommunity leaders will follow these Community Impact Guidelines in determining\nthe consequences for any action they deem in violation of this Code of Conduct:\n\n### 1. Correction\n\n**Community Impact**: Use of inappropriate language or other behavior deemed\nunprofessional or unwelcome in the community.\n\n**Consequence**: A private, written warning from community leaders, providing\nclarity around the nature of the violation and an explanation of why the\nbehavior was inappropriate. A public apology may be requested.\n\n### 2. Warning\n\n**Community Impact**: A violation through a single incident or series of\nactions.\n\n**Consequence**: A warning with consequences for continued behavior. No\ninteraction with the people involved, including unsolicited interaction with\nthose enforcing the Code of Conduct, for a specified period of time. This\nincludes avoiding interactions in community spaces as well as external channels\nlike social media. Violating these terms may lead to a temporary or permanent\nban.\n\n### 3. Temporary Ban\n\n**Community Impact**: A serious violation of community standards, including\nsustained inappropriate behavior.\n\n**Consequence**: A temporary ban from any sort of interaction or public\ncommunication with the community for a specified period of time. No public or\nprivate interaction with the people involved, including unsolicited interaction\nwith those enforcing the Code of Conduct, is allowed during this period.\nViolating these terms may lead to a permanent ban.\n\n### 4. Permanent Ban\n\n**Community Impact**: Demonstrating a pattern of violation of community\nstandards, including sustained inappropriate behavior, harassment of an\nindividual, or aggression toward or disparagement of classes of individuals.\n\n**Consequence**: A permanent ban from any sort of public interaction within the\ncommunity.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage],\nversion 2.1, available at\n[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].\n\nCommunity Impact Guidelines were inspired by\n[Mozilla's code of conduct enforcement ladder][Mozilla CoC].\n\nFor answers to common questions about this code of conduct, see the FAQ at\n[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at\n[https://www.contributor-covenant.org/translations][translations].\n\n[homepage]: https://www.contributor-covenant.org\n\n[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html\n\n[Mozilla CoC]: https://github.com/mozilla/diversity\n\n[FAQ]: https://www.contributor-covenant.org/faq\n\n[translations]: https://www.contributor-covenant.org/translations\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing\r\n\r\nThank you for your interest in contributing to our project! We appreciate your time and effort.\r\n\r\n## How to report a bug or issue\r\n\r\nIf you find a bug or issue, please report it by [opening an issue](https://github.com/felipebz/zpa/issues/new) on GitHub. Please include as much detail as possible, including:\r\n\r\n- Steps to reproduce the issue\r\n- Expected behavior\r\n- Actual behavior\r\n- Screenshots (if applicable)\r\n\r\n## How to suggest a new feature\r\n\r\nIf you have an idea for a new feature, please [open an issue](https://github.com/felipebz/zpa/issues/new) on GitHub. Please include as much detail as possible, including:\r\n\r\n- A description of the feature\r\n- Why you think it would be useful\r\n- Any potential drawbacks or limitations\r\n\r\n## Pull Requests\r\n\r\nCurrently, we are not currently accepting pull requests for new features. We appreciate your interest in contributing, but we have limited resources and cannot maintain additional features at this time.\r\n\r\nWe will accept pull requests for minor bug fixes. Please include a detailed description of the bug and the steps to reproduce it.\r\n\r\n## Code of Conduct\r\n\r\nPlease note that we have a [code of conduct](CODE_OF_CONDUCT.md) in place to ensure that our community is welcoming and inclusive. Please read the code of conduct before contributing.\r\n\r\n## License\r\n\r\nBy contributing to this project, you agree to license your contributions under the [LGPL-3.0 license](LICENSE).\r\n"
  },
  {
    "path": "LICENSE",
    "content": "                   GNU LESSER GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n\n  This version of the GNU Lesser General Public License incorporates\nthe terms and conditions of version 3 of the GNU General Public\nLicense, supplemented by the additional permissions listed below.\n\n  0. Additional Definitions.\n\n  As used herein, \"this License\" refers to version 3 of the GNU Lesser\nGeneral Public License, and the \"GNU GPL\" refers to version 3 of the GNU\nGeneral Public License.\n\n  \"The Library\" refers to a covered work governed by this License,\nother than an Application or a Combined Work as defined below.\n\n  An \"Application\" is any work that makes use of an interface provided\nby the Library, but which is not otherwise based on the Library.\nDefining a subclass of a class defined by the Library is deemed a mode\nof using an interface provided by the Library.\n\n  A \"Combined Work\" is a work produced by combining or linking an\nApplication with the Library.  The particular version of the Library\nwith which the Combined Work was made is also called the \"Linked\nVersion\".\n\n  The \"Minimal Corresponding Source\" for a Combined Work means the\nCorresponding Source for the Combined Work, excluding any source code\nfor portions of the Combined Work that, considered in isolation, are\nbased on the Application, and not on the Linked Version.\n\n  The \"Corresponding Application Code\" for a Combined Work means the\nobject code and/or source code for the Application, including any data\nand utility programs needed for reproducing the Combined Work from the\nApplication, but excluding the System Libraries of the Combined Work.\n\n  1. Exception to Section 3 of the GNU GPL.\n\n  You may convey a covered work under sections 3 and 4 of this License\nwithout being bound by section 3 of the GNU GPL.\n\n  2. Conveying Modified Versions.\n\n  If you modify a copy of the Library, and, in your modifications, a\nfacility refers to a function or data to be supplied by an Application\nthat uses the facility (other than as an argument passed when the\nfacility is invoked), then you may convey a copy of the modified\nversion:\n\n   a) under this License, provided that you make a good faith effort to\n   ensure that, in the event an Application does not supply the\n   function or data, the facility still operates, and performs\n   whatever part of its purpose remains meaningful, or\n\n   b) under the GNU GPL, with none of the additional permissions of\n   this License applicable to that copy.\n\n  3. Object Code Incorporating Material from Library Header Files.\n\n  The object code form of an Application may incorporate material from\na header file that is part of the Library.  You may convey such object\ncode under terms of your choice, provided that, if the incorporated\nmaterial is not limited to numerical parameters, data structure\nlayouts and accessors, or small macros, inline functions and templates\n(ten or fewer lines in length), you do both of the following:\n\n   a) Give prominent notice with each copy of the object code that the\n   Library is used in it and that the Library and its use are\n   covered by this License.\n\n   b) Accompany the object code with a copy of the GNU GPL and this license\n   document.\n\n  4. Combined Works.\n\n  You may convey a Combined Work under terms of your choice that,\ntaken together, effectively do not restrict modification of the\nportions of the Library contained in the Combined Work and reverse\nengineering for debugging such modifications, if you also do each of\nthe following:\n\n   a) Give prominent notice with each copy of the Combined Work that\n   the Library is used in it and that the Library and its use are\n   covered by this License.\n\n   b) Accompany the Combined Work with a copy of the GNU GPL and this license\n   document.\n\n   c) For a Combined Work that displays copyright notices during\n   execution, include the copyright notice for the Library among\n   these notices, as well as a reference directing the user to the\n   copies of the GNU GPL and this license document.\n\n   d) Do one of the following:\n\n       0) Convey the Minimal Corresponding Source under the terms of this\n       License, and the Corresponding Application Code in a form\n       suitable for, and under terms that permit, the user to\n       recombine or relink the Application with a modified version of\n       the Linked Version to produce a modified Combined Work, in the\n       manner specified by section 6 of the GNU GPL for conveying\n       Corresponding Source.\n\n       1) Use a suitable shared library mechanism for linking with the\n       Library.  A suitable mechanism is one that (a) uses at run time\n       a copy of the Library already present on the user's computer\n       system, and (b) will operate properly with a modified version\n       of the Library that is interface-compatible with the Linked\n       Version.\n\n   e) Provide Installation Information, but only if you would otherwise\n   be required to provide such information under section 6 of the\n   GNU GPL, and only to the extent that such information is\n   necessary to install and execute a modified version of the\n   Combined Work produced by recombining or relinking the\n   Application with a modified version of the Linked Version. (If\n   you use option 4d0, the Installation Information must accompany\n   the Minimal Corresponding Source and Corresponding Application\n   Code. If you use option 4d1, you must provide the Installation\n   Information in the manner specified by section 6 of the GNU GPL\n   for conveying Corresponding Source.)\n\n  5. Combined Libraries.\n\n  You may place library facilities that are a work based on the\nLibrary side by side in a single library together with other library\nfacilities that are not Applications and are not covered by this\nLicense, and convey such a combined library under terms of your\nchoice, if you do both of the following:\n\n   a) Accompany the combined library with a copy of the same work based\n   on the Library, uncombined with any other library facilities,\n   conveyed under the terms of this License.\n\n   b) Give prominent notice with the combined library that part of it\n   is a work based on the Library, and explaining where to find the\n   accompanying uncombined form of the same work.\n\n  6. Revised Versions of the GNU Lesser General Public License.\n\n  The Free Software Foundation may publish revised and/or new versions\nof the GNU Lesser General Public License from time to time. Such new\nversions will be similar in spirit to the present version, but may\ndiffer in detail to address new problems or concerns.\n\n  Each version is given a distinguishing version number. If the\nLibrary as you received it specifies that a certain numbered version\nof the GNU Lesser General Public License \"or any later version\"\napplies to it, you have the option of following the terms and\nconditions either of that published version or of any later version\npublished by the Free Software Foundation. If the Library as you\nreceived it does not specify a version number of the GNU Lesser\nGeneral Public License, you may choose any version of the GNU Lesser\nGeneral Public License ever published by the Free Software Foundation.\n\n  If the Library as you received it specifies that a proxy can decide\nwhether future versions of the GNU Lesser General Public License shall\napply, that proxy's public statement of acceptance of any version is\npermanent authorization for you to choose that version for the\nLibrary.\n\n"
  },
  {
    "path": "LICENSE_HEADER",
    "content": "Z PL/SQL Analyzer\nCopyright (C) 2015-${year} Felipe Zorzo\nmailto:felipe AT felipezorzo DOT com DOT br\n\nThis program is free software; you can redistribute it and/or\nmodify it under the terms of the GNU Lesser General Public\nLicense as published by the Free Software Foundation; either\nversion 3 of the License, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\nLesser General Public License for more details.\n\nYou should have received a copy of the GNU Lesser General Public License\nalong with this program; if not, write to the Free Software Foundation,\nInc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n"
  },
  {
    "path": "README.md",
    "content": "# ZPA\n\n[![Latest release](https://img.shields.io/github/release/felipebz/zpa.svg) ](https://github.com/felipebz/zpa/releases/latest)\n[![Build](https://github.com/felipebz/zpa/actions/workflows/build.yml/badge.svg?branch=main)](https://github.com/felipebz/zpa/actions/workflows/build.yml)\n[![Quality Gate Status](https://sonarqube.felipebz.com/api/project_badges/measure?project=com.felipebz.zpa%3Azpa&metric=alert_status)](https://sonarqube.felipebz.com/dashboard?id=com.felipebz.zpa%3Azpa)\n\nZPA is parser and static code analysis tool for PL/SQL and Oracle SQL.\n\nYou can use it in a [SonarQube](https://www.sonarqube.org) on-premise instance. SonarQube is an open platform to manage code quality.\n\nSee some examples in our [SonarQube instance](https://sonarqube.felipebz.com/projects?languages=plsqlopen)!\n\nDo you want to use this analyzer in a project hosted on [SonarCloud](https://sonarcloud.io)? Try the [zpa-cli](https://github.com/felipebz/zpa-cli)!\n\n## Installation\n\n- Download the [latest sonar-zpa-plugin release](https://github.com/felipebz/zpa/releases/latest) and copy to the SONARQUBE_HOME/extensions/plugins directory;\n- Restart your SonarQube server;\n- Navigate to the Marketplace (SONARQUBE_URL/marketplace?filter=installed). It should list \"ZPA\" on the tab \"Installed Plugins\";\n- Run an analysis with [SonarScanner](https://docs.sonarsource.com/sonarqube/latest/analyzing-source-code/overview/).\n\n## Compatibility matrix\n\n| ZPA version            | SonarQube version (min/max) |\n|------------------------|-----------------------------|\n| 4.1.0                  | 25.8 / 26.4                 |\n| 4.2.0 (in development) | 26.2 / 26.5                 |\n\n## ZPA Toolkit\n\nThe ZPA Toolkit is visual tool to review the AST (abstract syntax tree) and the symbol table generated by the parser.\n\n![](https://raw.githubusercontent.com/wiki/felipebz/zpa/img/zpa-toolkit.png)\n\nThe latest ZPA Toolkit can be downloaded from the [releases page](https://github.com/felipebz/zpa/releases/latest) and it requires JDK 11 or newer.\n\n## Contribute\n\nEveryone is welcome to contribute. Please read our [contribution guidelines](CONTRIBUTING.md) for more information.\n\nThere are a few things you need to know about the code. It is divided in these modules:\n\n- `plsql-custom-rules` - Demo project showing how to extend ZPA with custom coding rules.\n- `sonar-zpa-plugin` - The SonarQube plugin itself, this module contains all the code necessary to integrate with the SonarQube platform.\n- `zpa-checks` - The built-in coding rules provided by ZPA.\n- `zpa-checks-testkit` - Test helper for coding rules, it can be used to test custom rules.\n- `zpa-core` - The heart of this project. It contains the lexer, the parser and the code required to understand and process PL/SQL code.\n- `zpa-toolkit` - A visual tool to review the AST (abstract syntax tree) generated by the parser.\n\nThe API exposed to custom plugins must be located in the package `org.sonar.plugins.plsqlopen.api` (it's a requirement from the SonarQube server). The classes located outside this package are not prepared for external consumption, so if you use them, your code can break without any further notice.\n\n### Running the integration tests\n\nThere are two sets of integration tests:\n\n- [sonar-zpa-plugin/integrationTest](https://github.com/felipebz/zpa/tree/main/sonar-zpa-plugin/src/integrationTest): checks if the metrics are imported correctly in SonarQube\n- [zpa-checks/integrationTest](https://github.com/felipebz/zpa/tree/main/zpa-checks/src/integrationTest): checks the quality of parser and rules against real-world code\n\nTo run the integrations tests, first update the submodules:\n\n    git submodule update --init --recursive\n    \nBuild the main plugin and the custom rules example:\n\n    ./gradlew build publishToMavenLocal\n    ./gradlew build -p plsql-custom-rules\n\nThen run the tests:\n\n    ./gradlew integrationTest\n\nBy default, the tests will be executed using SonarQube Community Build 25.8. You can change the SonarQube version using the property `sonar.runtimeVersion`, passing a value in the format `LATEST_RELEASE[number]`, like `LATEST_RELEASE[25.3]`, or `a.b.c.d` for an exact release including build number: \n\n    ./gradlew integrationTest -Dsonar.runtimeVersion=LATEST_RELEASE[25.8]\n"
  },
  {
    "path": "build-logic/build.gradle.kts",
    "content": "plugins {\n    `kotlin-dsl`\n}\n\nrepositories {\n    gradlePluginPortal()\n    mavenCentral()\n}\n\ndependencies {\n    implementation(libs.kotlin.gradle.plugin)\n    implementation(libs.license.gradle.plugin)\n    implementation(libs.dokka.javadoc.plugin)\n    implementation(libs.jreleaser.gradle.plugin)\n    implementation(libs.sonarqube.gradle.plugin)\n}\n"
  },
  {
    "path": "build-logic/settings.gradle.kts",
    "content": "dependencyResolutionManagement {\n    // Reuse version catalog from the main build.\n    versionCatalogs {\n        create(\"libs\", { from(files(\"../gradle/libs.versions.toml\")) })\n    }\n}\n\nrootProject.name = \"build-logic\"\n"
  },
  {
    "path": "build-logic/src/main/kotlin/com/felipebz/zpa/build-conventions.gradle.kts",
    "content": "package com.felipebz.zpa\n\nplugins {\n    id(\"com.felipebz.zpa.kotlin-conventions\")\n    id(\"com.felipebz.zpa.testing-conventions\")\n    id(\"com.felipebz.zpa.license-conventions\")\n    id(\"com.felipebz.zpa.publishing-conventions\")\n}\n"
  },
  {
    "path": "build-logic/src/main/kotlin/com/felipebz/zpa/jreleaser-conventions.gradle.kts",
    "content": "package com.felipebz.zpa\n\nplugins {\n    id(\"org.jreleaser\")\n}\n\njreleaser {\n    project {\n        description.set(\"ZPA - Parser and static code analysis tool for PL/SQL and Oracle SQL\")\n        authors.set(listOf(\"felipebz\"))\n        license.set(\"LGPL-3.0\")\n        links {\n            homepage.set(\"https://zpa.felipebz.com\")\n        }\n        inceptionYear.set(\"2015\")\n        snapshot {\n            fullChangelog.set(true)\n        }\n    }\n    release {\n        github {\n            overwrite.set(true)\n            tagName.set(\"{{projectVersion}}\")\n            draft.set(true)\n            changelog {\n                formatted.set(org.jreleaser.model.Active.ALWAYS)\n                preset.set(\"conventional-commits\")\n                contentTemplate.set(file(\"template/changelog.tpl\"))\n                contributors {\n                    enabled.set(false)\n                }\n                hide {\n                    uncategorized.set(true)\n                }\n            }\n        }\n    }\n    distributions {\n        listOf(\"sonar-zpa-plugin\", \"zpa-toolkit\").forEach {\n            create(it) {\n                artifact {\n                    path.set(file(\"{{distributionName}}/build/libs/{{distributionName}}-{{projectVersion}}.jar\"))\n                }\n            }\n        }\n        create(\"plsql-custom-rules\") {\n            artifact {\n                path.set(file(\"build/{{distributionName}}.zip\"))\n            }\n        }\n    }\n    signing {\n        active.set(org.jreleaser.model.Active.ALWAYS)\n        armored.set(true)\n    }\n    deploy {\n        maven {\n            mavenCentral {\n                create(\"sonatype\") {\n                    active.set(org.jreleaser.model.Active.RELEASE)\n                    snapshotSupported.set(true)\n                    url.set(\"https://central.sonatype.com/api/v1/publisher\")\n                    stagingRepository(\"build/staging-deploy\")\n                }\n            }\n            nexus2 {\n                create(\"snapshot-deploy\") {\n                    active.set(org.jreleaser.model.Active.SNAPSHOT)\n                    url.set(\"https://central.sonatype.com/repository/maven-snapshots\")\n                    snapshotUrl.set(\"https://central.sonatype.com/repository/maven-snapshots\")\n                    applyMavenCentralRules.set(true)\n                    snapshotSupported.set(true)\n                    closeRepository.set(true)\n                    releaseRepository.set(true)\n                    stagingRepository(\"build/staging-deploy\")\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "build-logic/src/main/kotlin/com/felipebz/zpa/kotlin-conventions.gradle.kts",
    "content": "package com.felipebz.zpa\n\nplugins {\n    id(\"java\")\n    id(\"org.jetbrains.kotlin.jvm\")\n}\n\nrepositories {\n    mavenCentral()\n    mavenLocal()\n    maven {\n        setUrl(\"https://central.sonatype.com/repository/maven-snapshots/\")\n    }\n}\n\nkotlin {\n    compilerOptions {\n        freeCompilerArgs = listOf(\"-Xconsistent-data-class-copy-visibility\")\n    }\n}\n\njava {\n    withSourcesJar()\n    toolchain {\n        languageVersion = JavaLanguageVersion.of(21)\n    }\n}\n"
  },
  {
    "path": "build-logic/src/main/kotlin/com/felipebz/zpa/license-conventions.gradle.kts",
    "content": "package com.felipebz.zpa\n\nimport com.hierynomus.gradle.license.tasks.LicenseCheck\nimport com.hierynomus.gradle.license.tasks.LicenseFormat\nimport java.io.File\nimport java.util.*\n\nplugins {\n    id(\"com.github.hierynomus.license\")\n}\n\ntasks.withType<LicenseFormat>().configureEach {\n    extra.set(\"year\", Calendar.getInstance().get(Calendar.YEAR))\n    header = File(this.project.rootDir, \"LICENSE_HEADER\")\n    include(\"**/*.kt\")\n}\n\ntasks.withType<LicenseCheck>().configureEach {\n    extra.set(\"year\", Calendar.getInstance().get(Calendar.YEAR))\n    header = File(this.project.rootDir, \"LICENSE_HEADER\")\n    include(\"**/*.kt\")\n}\n"
  },
  {
    "path": "build-logic/src/main/kotlin/com/felipebz/zpa/publishing-conventions.gradle.kts",
    "content": "package com.felipebz.zpa\n\nimport org.gradle.api.publish.maven.MavenPublication\nimport org.gradle.kotlin.dsl.create\nimport org.gradle.kotlin.dsl.get\nimport org.gradle.kotlin.dsl.provideDelegate\nimport org.gradle.kotlin.dsl.register\n\nplugins {\n    id(\"maven-publish\")\n    id(\"org.jetbrains.dokka-javadoc\")\n    id(\"signing\")\n}\n\nval dokka by tasks.register<Jar>(\"dokka\") {\n    dependsOn(tasks.dokkaGenerateModuleJavadoc)\n    from(tasks.dokkaGenerateModuleJavadoc.flatMap { it.outputDirectory })\n    archiveClassifier.set(\"javadoc\")\n}\n\nsigning {\n    setRequired({\n        gradle.taskGraph.hasTask(\"publish\")\n    })\n    val signingKey: String? by project\n    val signingPassword: String? by project\n    useInMemoryPgpKeys(signingKey, signingPassword)\n    sign(publishing.publications)\n}\n\npublishing {\n    repositories {\n        maven {\n            url = rootProject.layout.buildDirectory.dir(\"staging-deploy\").get().asFile.toURI()\n        }\n    }\n    publications {\n        create<MavenPublication>(\"maven\") {\n            from(components[\"java\"])\n            artifact(dokka)\n            pom {\n                name.set(provider { project.description })\n                description.set(provider { project.description })\n                url.set(\"https://zpa.felipebz.com\")\n                organization {\n                    name.set(\"Felipe Zorzo\")\n                    url.set(\"https://felipezorzo.com.br\")\n                }\n                licenses {\n                    license {\n                        name.set(\"GNU LGPL 3\")\n                        url.set(\"https://www.gnu.org/licenses/lgpl.txt\")\n                        distribution.set(\"repo\")\n                    }\n                }\n                scm {\n                    url.set(\"https://github.com/felipebz/zpa\")\n                    connection.set(\"scm:git:https://github.com/felipebz/zpa.git\")\n                    developerConnection.set(\"scm:git:https://github.com/felipebz/zpa.git\")\n                }\n                developers {\n                    developer {\n                        id.set(\"felipebz\")\n                        name.set(\"Felipe Zorzo\")\n                        url.set(\"https://felipezorzo.com.br\")\n                        email.set(\"felipe@felipezorzo.com.br\")\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "build-logic/src/main/kotlin/com/felipebz/zpa/sonarqube-conventions.gradle.kts",
    "content": "package com.felipebz.zpa\n\nplugins {\n    id(\"org.sonarqube\")\n}\n\nsonarqube {\n    properties {\n        property(\"sonar.projectName\", \"ZPA\")\n    }\n}\n"
  },
  {
    "path": "build-logic/src/main/kotlin/com/felipebz/zpa/testing-conventions.gradle.kts",
    "content": "package com.felipebz.zpa\n\nplugins {\n    id(\"com.felipebz.zpa.kotlin-conventions\")\n    id(\"jacoco\")\n}\n\nval libs = extensions.getByType(VersionCatalogsExtension::class.java).named(\"libs\")\n\ndependencies {\n    testImplementation(libs.findLibrary(\"assertj\").get())\n    testImplementation(libs.findLibrary(\"mockito\").get())\n    testImplementation(libs.findLibrary(\"mockito-kotlin\").get())\n}\n\nconfigurations {\n    // include compileOnly dependencies during test\n    testImplementation {\n        extendsFrom(configurations.compileOnly.get())\n    }\n}\n\ntesting {\n    suites {\n        val test by getting(JvmTestSuite::class) {\n            useJUnitJupiter(libs.findVersion(\"junit\").get().requiredVersion)\n        }\n    }\n}\n\ntasks.test {\n    finalizedBy(tasks.jacocoTestReport)\n}\n\ntasks.jacocoTestReport {\n    dependsOn(tasks.test) // tests are required to run before generating the report\n}\n\njacoco {\n    toolVersion = \"0.8.14\"\n}\n\ntasks.jacocoTestReport {\n    reports {\n        xml.required.set(true)\n    }\n}\n"
  },
  {
    "path": "build.gradle.kts",
    "content": "plugins {\n    base\n    id(\"com.felipebz.zpa.jreleaser-conventions\")\n    id(\"com.felipebz.zpa.sonarqube-conventions\")\n}\n"
  },
  {
    "path": "gradle/libs.versions.toml",
    "content": "[versions]\nkotlin = \"2.3.21\"\ndokka = \"2.2.0\"\ndownload = \"5.7.0\"\njreleaser = \"1.23.0\"\nlicense = \"0.16.1\"\nshadow = \"9.4.1\"\nsonarscanner = \"7.2.3.7755\"\n\n# libs\nflatlaf = \"3.7.1\"\nflr = \"1.5.0\"\njackson = \"2.21.3\"\njsoup = \"1.22.2\"\nmin-sonarqube = \"25.8.0.111929\"\nmin-sonarqubeapi = \"13.0.0.3026\"\nwoodstox = \"7.1.1\"\n\n# testing\nassertj = \"3.27.7\"\njunit = \"6.0.3\"\nmockito = \"5.23.0\"\nmockito-kotlin = \"6.3.0\"\nsonarqube-orchestrator = \"6.1.0.3962\"\n\n[libraries]\nassertj = { module = \"org.assertj:assertj-core\", version.ref = \"assertj\" }\nflatlaf = { module = \"com.formdev:flatlaf\", version.ref = \"flatlaf\" }\nflr-core = { module = \"com.felipebz.flr:flr-core\", version.ref = \"flr\" }\nflr-testing-harness = { module = \"com.felipebz.flr:flr-testing-harness\", version.ref = \"flr\" }\nflr-toolkit = { module = \"com.felipebz.flr:flr-toolkit\", version.ref = \"flr\" }\nflr-xpath = { module = \"com.felipebz.flr:flr-xpath\", version.ref = \"flr\" }\njackson = { module = \"com.fasterxml.jackson.core:jackson-databind\", version.ref = \"jackson\" }\njackson-xml = { module = \"com.fasterxml.jackson.dataformat:jackson-dataformat-xml\", version.ref = \"jackson\" }\njsoup = { module = \"org.jsoup:jsoup\", version.ref = \"jsoup\" }\njunit-bom = { module = \"org.junit:junit-bom\", version.ref = \"junit\" }\nmockito = { module = \"org.mockito:mockito-core\", version.ref = \"mockito\" }\nmockito-kotlin = { module = \"org.mockito.kotlin:mockito-kotlin\", version.ref = \"mockito-kotlin\" }\nwoodstox = { module = \"com.fasterxml.woodstox:woodstox-core\", version.ref = \"woodstox\" }\nsonar-plugin-api = { module = \"org.sonarsource.api.plugin:sonar-plugin-api\", version.ref = \"min-sonarqubeapi\" }\nsonar-plugin-api-impl = { module = \"org.sonarsource.sonarqube:sonar-plugin-api-impl\", version.ref = \"min-sonarqube\" }\nsonar-ws = { module = \"org.sonarsource.sonarqube:sonar-ws\", version.ref = \"min-sonarqube\" }\nsonar-orchestrator = { module = \"org.sonarsource.orchestrator:sonar-orchestrator-junit5\", version.ref = \"sonarqube-orchestrator\" }\ndokka-javadoc-plugin = { module = \"org.jetbrains.dokka-javadoc:org.jetbrains.dokka-javadoc.gradle.plugin\", version.ref = \"dokka\" }\nkotlin-gradle-plugin = { module = \"org.jetbrains.kotlin:kotlin-gradle-plugin\", version.ref = \"kotlin\" }\nlicense-gradle-plugin = { module = \"com.github.hierynomus.license:com.github.hierynomus.license.gradle.plugin\", version.ref = \"license\" }\njreleaser-gradle-plugin = { module = \"org.jreleaser:org.jreleaser.gradle.plugin\", version.ref = \"jreleaser\" }\nsonarqube-gradle-plugin = { module = \"org.sonarqube:org.sonarqube.gradle.plugin\", version.ref = \"sonarscanner\" }\n\n[plugins]\ndownload = { id = \"de.undercouch.download\", version.ref = \"download\" }\nshadow = { id = \"com.gradleup.shadow\", version.ref = \"shadow\" }\n"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-9.5.1-bin.zip\nnetworkTimeout=10000\nretries=0\nretryBackOffMs=500\nvalidateDistributionUrl=true\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\n"
  },
  {
    "path": "gradle.properties",
    "content": "group=com.felipebz.zpa\nversion=4.2.0-SNAPSHOT\n\n# Workaround for Dokka issue: https://github.com/Kotlin/dokka/issues/1405\norg.gradle.jvmargs=-XX:MaxMetaspaceSize=1G\nsystemProp.sonar.gradle.skipCompile=true\norg.gradle.parallel=false\norg.gradle.configuration-cache=false\norg.gradle.caching=true\n"
  },
  {
    "path": "gradlew",
    "content": "#!/bin/sh\n\n#\n# Copyright © 2015 the original authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      https://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n# SPDX-License-Identifier: Apache-2.0\n#\n\n##############################################################################\n#\n#   Gradle start up script for POSIX generated by Gradle.\n#\n#   Important for running:\n#\n#   (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is\n#       noncompliant, but you have some other compliant shell such as ksh or\n#       bash, then to run this script, type that shell name before the whole\n#       command line, like:\n#\n#           ksh Gradle\n#\n#       Busybox and similar reduced shells will NOT work, because this script\n#       requires all of these POSIX shell features:\n#         * functions;\n#         * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,\n#           «${var#prefix}», «${var%suffix}», and «$( cmd )»;\n#         * compound commands having a testable exit status, especially «case»;\n#         * various built-in commands including «command», «set», and «ulimit».\n#\n#   Important for patching:\n#\n#   (2) This script targets any POSIX shell, so it avoids extensions provided\n#       by Bash, Ksh, etc; in particular arrays are avoided.\n#\n#       The \"traditional\" practice of packing multiple parameters into a\n#       space-separated string is a well documented source of bugs and security\n#       problems, so this is (mostly) avoided, by progressively accumulating\n#       options in \"$@\", and eventually passing that to Java.\n#\n#       Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,\n#       and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;\n#       see the in-line comments for details.\n#\n#       There are tweaks for specific operating systems such as AIX, CygWin,\n#       Darwin, MinGW, and NonStop.\n#\n#   (3) This script is generated from the Groovy template\n#       https://github.com/gradle/gradle/blob/3d91ce3b8caaf77ad09f381f43615b715b53f72c/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt\n#       within the Gradle project.\n#\n#       You can find Gradle at https://github.com/gradle/gradle/.\n#\n##############################################################################\n\n# Attempt to set APP_HOME\n\n# Resolve links: $0 may be a link\napp_path=$0\n\n# Need this for daisy-chained symlinks.\nwhile\n    APP_HOME=${app_path%\"${app_path##*/}\"}  # leaves a trailing /; empty if no leading path\n    [ -h \"$app_path\" ]\ndo\n    ls=$( ls -ld \"$app_path\" )\n    link=${ls#*' -> '}\n    case $link in             #(\n      /*)   app_path=$link ;; #(\n      *)    app_path=$APP_HOME$link ;;\n    esac\ndone\n\n# This is normally unused\n# shellcheck disable=SC2034\nAPP_BASE_NAME=${0##*/}\n# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)\nAPP_HOME=$( cd -P \"${APP_HOME:-./}\" > /dev/null && printf '%s\\n' \"$PWD\" ) || exit\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=maximum\n\nwarn () {\n    echo \"$*\"\n} >&2\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n} >&2\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"$( uname )\" in                #(\n  CYGWIN* )         cygwin=true  ;; #(\n  Darwin* )         darwin=true  ;; #(\n  MSYS* | MINGW* )  msys=true    ;; #(\n  NONSTOP* )        nonstop=true ;;\nesac\n\n\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=$JAVA_HOME/jre/sh/java\n    else\n        JAVACMD=$JAVA_HOME/bin/java\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=java\n    if ! command -v java >/dev/null 2>&1\n    then\n        die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nfi\n\n# Increase the maximum file descriptors if we can.\nif ! \"$cygwin\" && ! \"$darwin\" && ! \"$nonstop\" ; then\n    case $MAX_FD in #(\n      max*)\n        # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.\n        # shellcheck disable=SC2039,SC3045\n        MAX_FD=$( ulimit -H -n ) ||\n            warn \"Could not query maximum file descriptor limit\"\n    esac\n    case $MAX_FD in  #(\n      '' | soft) :;; #(\n      *)\n        # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.\n        # shellcheck disable=SC2039,SC3045\n        ulimit -n \"$MAX_FD\" ||\n            warn \"Could not set maximum file descriptor limit to $MAX_FD\"\n    esac\nfi\n\n# Collect all arguments for the java command, stacking in reverse order:\n#   * args from the command line\n#   * the main class name\n#   * -classpath\n#   * -D...appname settings\n#   * --module-path (only if needed)\n#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.\n\n# For Cygwin or MSYS, switch paths to Windows format before running java\nif \"$cygwin\" || \"$msys\" ; then\n    APP_HOME=$( cygpath --path --mixed \"$APP_HOME\" )\n\n    JAVACMD=$( cygpath --unix \"$JAVACMD\" )\n\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    for arg do\n        if\n            case $arg in                                #(\n              -*)   false ;;                            # don't mess with options #(\n              /?*)  t=${arg#/} t=/${t%%/*}              # looks like a POSIX filepath\n                    [ -e \"$t\" ] ;;                      #(\n              *)    false ;;\n            esac\n        then\n            arg=$( cygpath --path --ignore --mixed \"$arg\" )\n        fi\n        # Roll the args list around exactly as many times as the number of\n        # args, so each arg winds up back in the position where it started, but\n        # possibly modified.\n        #\n        # NB: a `for` loop captures its iteration list before it begins, so\n        # changing the positional parameters here affects neither the number of\n        # iterations, nor the values presented in `arg`.\n        shift                   # remove old arg\n        set -- \"$@\" \"$arg\"      # push replacement arg\n    done\nfi\n\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS='\"-Xmx64m\" \"-Xms64m\"'\n\n# Collect all arguments for the java command:\n#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,\n#     and any embedded shellness will be escaped.\n#   * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be\n#     treated as '${Hostname}' itself on the command line.\n\nset -- \\\n        \"-Dorg.gradle.appname=$APP_BASE_NAME\" \\\n        -jar \"$APP_HOME/gradle/wrapper/gradle-wrapper.jar\" \\\n        \"$@\"\n\n# Stop when \"xargs\" is not available.\nif ! command -v xargs >/dev/null 2>&1\nthen\n    die \"xargs is not available\"\nfi\n\n# Use \"xargs\" to parse quoted args.\n#\n# With -n1 it outputs one arg per line, with the quotes and backslashes removed.\n#\n# In Bash we could simply go:\n#\n#   readarray ARGS < <( xargs -n1 <<<\"$var\" ) &&\n#   set -- \"${ARGS[@]}\" \"$@\"\n#\n# but POSIX shell has neither arrays nor command substitution, so instead we\n# post-process each arg (as a line of input to sed) to backslash-escape any\n# character that might be a shell metacharacter, then use eval to reverse\n# that process (while maintaining the separation between arguments), and wrap\n# the whole thing up as a single \"set\" statement.\n#\n# This will of course break if any of these variables contains a newline or\n# an unmatched quote.\n#\n\neval \"set -- $(\n        printf '%s\\n' \"$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\" |\n        xargs -n1 |\n        sed ' s~[^-[:alnum:]+,./:=@_]~\\\\&~g; ' |\n        tr '\\n' ' '\n    )\" '\"$@\"'\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@rem\r\n@rem Copyright 2015 the original author or authors.\r\n@rem\r\n@rem Licensed under the Apache License, Version 2.0 (the \"License\");\r\n@rem you may not use this file except in compliance with the License.\r\n@rem You may obtain a copy of the License at\r\n@rem\r\n@rem      https://www.apache.org/licenses/LICENSE-2.0\r\n@rem\r\n@rem Unless required by applicable law or agreed to in writing, software\r\n@rem distributed under the License is distributed on an \"AS IS\" BASIS,\r\n@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n@rem See the License for the specific language governing permissions and\r\n@rem limitations under the License.\r\n@rem\r\n@rem SPDX-License-Identifier: Apache-2.0\r\n@rem\r\n\r\n@if \"%DEBUG%\"==\"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables, and ensure extensions are enabled\r\nsetlocal EnableExtensions\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\"==\"\" set DIRNAME=.\r\n@rem This is normally unused\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Resolve any \".\" and \"..\" in APP_HOME to make it shorter.\r\nfor %%i in (\"%APP_HOME%\") do set APP_HOME=%%~fi\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\"-Xmx64m\" \"-Xms64m\"\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif %ERRORLEVEL% equ 0 goto execute\r\n\r\necho. 1>&2\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2\r\necho. 1>&2\r\necho Please set the JAVA_HOME variable in your environment to match the 1>&2\r\necho location of your Java installation. 1>&2\r\n\r\n\"%COMSPEC%\" /c exit 1\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto execute\r\n\r\necho. 1>&2\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2\r\necho. 1>&2\r\necho Please set the JAVA_HOME variable in your environment to match the 1>&2\r\necho location of your Java installation. 1>&2\r\n\r\n\"%COMSPEC%\" /c exit 1\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\n\r\n\r\n@rem Execute Gradle\r\n@rem endlocal doesn't take effect until after the line is parsed and variables are expanded\r\n@rem which allows us to clear the local environment before executing the java command\r\nendlocal & \"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -jar \"%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\" %* & call :exitWithErrorLevel\r\n\r\n:exitWithErrorLevel\r\n@rem Use \"%COMSPEC%\" /c exit to allow operators to work properly in scripts\r\n\"%COMSPEC%\" /c exit %ERRORLEVEL%\r\n"
  },
  {
    "path": "plsql-custom-rules/README.md",
    "content": "# plsql-custom-rules\n\nThis repository contains examples of custom rules for PL/SQL code analysis using SonarQube. The examples are available as both Gradle and Maven projects. The purpose of this README is to provide information on how to customize and use the examples.\n\n## Getting Started\n\n## Customizing the pom.xml (if you're using Maven)\n\nProperties such as `groupId`, `artifactId`, `version`, `name` and `description` can be freely modified.\n\nIt is important to note that the `sonar-packaging-maven-plugin` is required and it contains the entry point of the plugin, as provided in the property `pluginClass`. If you refactor the code or rename the class extending `org.sonar.api.SonarPlugin`, you will have to change this configuration.\n\n## Customizing the build.gradle.kts (if you're using Gradle)\n\nProperties such as `group`, `version` and `description` can be freely modified.\n\nIt is important to note that you'll may need to update the values in [attributes map](build.gradle.kts#L52) of the `jar` task.\n\n## Dependencies\n\nThe plugin requires two dependencies: `sonar-plugin-api` and `sonar-zpa-plugin`. The `sonar-plugin-api` dependency represents the minimum version of SonarQube your plugin will support. Additionally, a dependency on `zpa-checks-testkit` can be added to make testing easier. These dependencies are already included in the `pom.xml` and `build.gradle.kts` files.\n\n## Compatibility with zpa-cli\n\nTo make the plugin compatible with [zpa-cli](https://github.com/felipebz/zpa-cli), you need to adjust the content of [extensions.idx](src/main/resources/META-INF/extensions.idx) to match your `CustomPlSqlRulesDefinition` subclass.\n"
  },
  {
    "path": "plsql-custom-rules/build.gradle.kts",
    "content": "import java.time.ZoneId\nimport java.time.format.DateTimeFormatter\nimport java.util.*\n\nplugins {\n    java\n}\n\nrepositories {\n    mavenCentral()\n    mavenLocal()\n    maven {\n        url = uri(\"https://central.sonatype.com/repository/maven-snapshots/\")\n    }\n}\n\njava {\n    toolchain {\n        languageVersion.set(JavaLanguageVersion.of(21))\n    }\n}\n\nval minSonarQubeVersion = \"25.8.0.111929\"\nval minSonarQubeApiVersion = \"13.0.0.3026\"\nval junitVersion = \"6.0.3\"\nval zpaVersion = \"4.2.0-SNAPSHOT\"\n\ndependencies {\n    compileOnly(\"org.sonarsource.api.plugin:sonar-plugin-api:$minSonarQubeApiVersion\")\n    compileOnly(\"com.felipebz.zpa:sonar-zpa-plugin:$zpaVersion\")\n    testImplementation(\"org.sonarsource.sonarqube:sonar-plugin-api-impl:$minSonarQubeVersion\")\n    testImplementation(\"com.felipebz.zpa:zpa-checks-testkit:$zpaVersion\")\n    testImplementation(\"org.junit.jupiter:junit-jupiter:$junitVersion\")\n    testRuntimeOnly(\"org.junit.platform:junit-platform-launcher\")\n}\n\nconfigurations {\n    // include compileOnly dependencies during test\n    testImplementation {\n        extendsFrom(configurations.compileOnly.get())\n    }\n}\n\ntasks.named<Test>(\"test\") {\n    useJUnitPlatform()\n    testLogging {\n        events(\"passed\", \"skipped\", \"failed\")\n    }\n}\n\ntasks.jar {\n    manifest {\n        val buildDate = DateTimeFormatter.ofPattern(\"yyyy-MM-dd'T'HH:mm:ssZ\").withZone(ZoneId.systemDefault()).format(\n            Date().toInstant())\n        attributes(mapOf(\n            \"Plugin-BuildDate\" to buildDate,\n            \"Plugin-ChildFirstClassLoader\" to \"false\",\n            \"Plugin-Class\" to \"com.company.plsql.PlSqlCustomRulesPlugin\",\n            \"Plugin-Description\" to \"PL/SQL Custom Rules\",\n            \"Plugin-Developers\" to \"\",\n            \"Plugin-Display-Version\" to project.version,\n            \"Plugin-Key\" to \"myrules\",\n            \"Plugin-License\" to \"\",\n            \"Plugin-Name\" to \"Company PL/SQL Rules\",\n            \"Plugin-Version\" to project.version,\n            \"Sonar-Version\" to minSonarQubeApiVersion,\n            \"SonarLint-Supported\" to \"false\",\n            \"Plugin-RequiredForLanguages\" to \"plsqlopen\"\n        ))\n    }\n}\n\ngroup = \"com.company\"\nversion = \"1.0-SNAPSHOT\"\ndescription = \"Company PL/SQL Rules\"\n\ntasks.withType<JavaCompile>() {\n    options.encoding = \"UTF-8\"\n}\n"
  },
  {
    "path": "plsql-custom-rules/gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-9.5.1-bin.zip\nnetworkTimeout=10000\nretries=0\nretryBackOffMs=500\nvalidateDistributionUrl=true\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\n"
  },
  {
    "path": "plsql-custom-rules/gradlew",
    "content": "#!/bin/sh\n\n#\n# Copyright © 2015 the original authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      https://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n# SPDX-License-Identifier: Apache-2.0\n#\n\n##############################################################################\n#\n#   Gradle start up script for POSIX generated by Gradle.\n#\n#   Important for running:\n#\n#   (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is\n#       noncompliant, but you have some other compliant shell such as ksh or\n#       bash, then to run this script, type that shell name before the whole\n#       command line, like:\n#\n#           ksh Gradle\n#\n#       Busybox and similar reduced shells will NOT work, because this script\n#       requires all of these POSIX shell features:\n#         * functions;\n#         * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,\n#           «${var#prefix}», «${var%suffix}», and «$( cmd )»;\n#         * compound commands having a testable exit status, especially «case»;\n#         * various built-in commands including «command», «set», and «ulimit».\n#\n#   Important for patching:\n#\n#   (2) This script targets any POSIX shell, so it avoids extensions provided\n#       by Bash, Ksh, etc; in particular arrays are avoided.\n#\n#       The \"traditional\" practice of packing multiple parameters into a\n#       space-separated string is a well documented source of bugs and security\n#       problems, so this is (mostly) avoided, by progressively accumulating\n#       options in \"$@\", and eventually passing that to Java.\n#\n#       Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,\n#       and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;\n#       see the in-line comments for details.\n#\n#       There are tweaks for specific operating systems such as AIX, CygWin,\n#       Darwin, MinGW, and NonStop.\n#\n#   (3) This script is generated from the Groovy template\n#       https://github.com/gradle/gradle/blob/3d91ce3b8caaf77ad09f381f43615b715b53f72c/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt\n#       within the Gradle project.\n#\n#       You can find Gradle at https://github.com/gradle/gradle/.\n#\n##############################################################################\n\n# Attempt to set APP_HOME\n\n# Resolve links: $0 may be a link\napp_path=$0\n\n# Need this for daisy-chained symlinks.\nwhile\n    APP_HOME=${app_path%\"${app_path##*/}\"}  # leaves a trailing /; empty if no leading path\n    [ -h \"$app_path\" ]\ndo\n    ls=$( ls -ld \"$app_path\" )\n    link=${ls#*' -> '}\n    case $link in             #(\n      /*)   app_path=$link ;; #(\n      *)    app_path=$APP_HOME$link ;;\n    esac\ndone\n\n# This is normally unused\n# shellcheck disable=SC2034\nAPP_BASE_NAME=${0##*/}\n# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)\nAPP_HOME=$( cd -P \"${APP_HOME:-./}\" > /dev/null && printf '%s\\n' \"$PWD\" ) || exit\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=maximum\n\nwarn () {\n    echo \"$*\"\n} >&2\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n} >&2\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"$( uname )\" in                #(\n  CYGWIN* )         cygwin=true  ;; #(\n  Darwin* )         darwin=true  ;; #(\n  MSYS* | MINGW* )  msys=true    ;; #(\n  NONSTOP* )        nonstop=true ;;\nesac\n\n\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=$JAVA_HOME/jre/sh/java\n    else\n        JAVACMD=$JAVA_HOME/bin/java\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=java\n    if ! command -v java >/dev/null 2>&1\n    then\n        die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nfi\n\n# Increase the maximum file descriptors if we can.\nif ! \"$cygwin\" && ! \"$darwin\" && ! \"$nonstop\" ; then\n    case $MAX_FD in #(\n      max*)\n        # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.\n        # shellcheck disable=SC2039,SC3045\n        MAX_FD=$( ulimit -H -n ) ||\n            warn \"Could not query maximum file descriptor limit\"\n    esac\n    case $MAX_FD in  #(\n      '' | soft) :;; #(\n      *)\n        # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.\n        # shellcheck disable=SC2039,SC3045\n        ulimit -n \"$MAX_FD\" ||\n            warn \"Could not set maximum file descriptor limit to $MAX_FD\"\n    esac\nfi\n\n# Collect all arguments for the java command, stacking in reverse order:\n#   * args from the command line\n#   * the main class name\n#   * -classpath\n#   * -D...appname settings\n#   * --module-path (only if needed)\n#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.\n\n# For Cygwin or MSYS, switch paths to Windows format before running java\nif \"$cygwin\" || \"$msys\" ; then\n    APP_HOME=$( cygpath --path --mixed \"$APP_HOME\" )\n\n    JAVACMD=$( cygpath --unix \"$JAVACMD\" )\n\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    for arg do\n        if\n            case $arg in                                #(\n              -*)   false ;;                            # don't mess with options #(\n              /?*)  t=${arg#/} t=/${t%%/*}              # looks like a POSIX filepath\n                    [ -e \"$t\" ] ;;                      #(\n              *)    false ;;\n            esac\n        then\n            arg=$( cygpath --path --ignore --mixed \"$arg\" )\n        fi\n        # Roll the args list around exactly as many times as the number of\n        # args, so each arg winds up back in the position where it started, but\n        # possibly modified.\n        #\n        # NB: a `for` loop captures its iteration list before it begins, so\n        # changing the positional parameters here affects neither the number of\n        # iterations, nor the values presented in `arg`.\n        shift                   # remove old arg\n        set -- \"$@\" \"$arg\"      # push replacement arg\n    done\nfi\n\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS='\"-Xmx64m\" \"-Xms64m\"'\n\n# Collect all arguments for the java command:\n#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,\n#     and any embedded shellness will be escaped.\n#   * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be\n#     treated as '${Hostname}' itself on the command line.\n\nset -- \\\n        \"-Dorg.gradle.appname=$APP_BASE_NAME\" \\\n        -jar \"$APP_HOME/gradle/wrapper/gradle-wrapper.jar\" \\\n        \"$@\"\n\n# Stop when \"xargs\" is not available.\nif ! command -v xargs >/dev/null 2>&1\nthen\n    die \"xargs is not available\"\nfi\n\n# Use \"xargs\" to parse quoted args.\n#\n# With -n1 it outputs one arg per line, with the quotes and backslashes removed.\n#\n# In Bash we could simply go:\n#\n#   readarray ARGS < <( xargs -n1 <<<\"$var\" ) &&\n#   set -- \"${ARGS[@]}\" \"$@\"\n#\n# but POSIX shell has neither arrays nor command substitution, so instead we\n# post-process each arg (as a line of input to sed) to backslash-escape any\n# character that might be a shell metacharacter, then use eval to reverse\n# that process (while maintaining the separation between arguments), and wrap\n# the whole thing up as a single \"set\" statement.\n#\n# This will of course break if any of these variables contains a newline or\n# an unmatched quote.\n#\n\neval \"set -- $(\n        printf '%s\\n' \"$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\" |\n        xargs -n1 |\n        sed ' s~[^-[:alnum:]+,./:=@_]~\\\\&~g; ' |\n        tr '\\n' ' '\n    )\" '\"$@\"'\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "plsql-custom-rules/gradlew.bat",
    "content": "@rem\r\n@rem Copyright 2015 the original author or authors.\r\n@rem\r\n@rem Licensed under the Apache License, Version 2.0 (the \"License\");\r\n@rem you may not use this file except in compliance with the License.\r\n@rem You may obtain a copy of the License at\r\n@rem\r\n@rem      https://www.apache.org/licenses/LICENSE-2.0\r\n@rem\r\n@rem Unless required by applicable law or agreed to in writing, software\r\n@rem distributed under the License is distributed on an \"AS IS\" BASIS,\r\n@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n@rem See the License for the specific language governing permissions and\r\n@rem limitations under the License.\r\n@rem\r\n@rem SPDX-License-Identifier: Apache-2.0\r\n@rem\r\n\r\n@if \"%DEBUG%\"==\"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables, and ensure extensions are enabled\r\nsetlocal EnableExtensions\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\"==\"\" set DIRNAME=.\r\n@rem This is normally unused\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Resolve any \".\" and \"..\" in APP_HOME to make it shorter.\r\nfor %%i in (\"%APP_HOME%\") do set APP_HOME=%%~fi\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\"-Xmx64m\" \"-Xms64m\"\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif %ERRORLEVEL% equ 0 goto execute\r\n\r\necho. 1>&2\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2\r\necho. 1>&2\r\necho Please set the JAVA_HOME variable in your environment to match the 1>&2\r\necho location of your Java installation. 1>&2\r\n\r\n\"%COMSPEC%\" /c exit 1\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto execute\r\n\r\necho. 1>&2\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2\r\necho. 1>&2\r\necho Please set the JAVA_HOME variable in your environment to match the 1>&2\r\necho location of your Java installation. 1>&2\r\n\r\n\"%COMSPEC%\" /c exit 1\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\n\r\n\r\n@rem Execute Gradle\r\n@rem endlocal doesn't take effect until after the line is parsed and variables are expanded\r\n@rem which allows us to clear the local environment before executing the java command\r\nendlocal & \"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -jar \"%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\" %* & call :exitWithErrorLevel\r\n\r\n:exitWithErrorLevel\r\n@rem Use \"%COMSPEC%\" /c exit to allow operators to work properly in scripts\r\n\"%COMSPEC%\" /c exit %ERRORLEVEL%\r\n"
  },
  {
    "path": "plsql-custom-rules/pom.xml",
    "content": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\n  <modelVersion>4.0.0</modelVersion>\n  <groupId>com.company</groupId>\n  <artifactId>plsql-custom-rules</artifactId>\n  <version>1.0-SNAPSHOT</version>\n  <packaging>sonar-plugin</packaging>\n  \n  <name>Company PL/SQL Rules</name>\n  <description>PL/SQL Custom Rules</description>\n  \n  <properties>\n    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n    <zpa.version>4.2.0-SNAPSHOT</zpa.version>\n    <sonarqube.api.min.version>13.0.0.3026</sonarqube.api.min.version>\n    <sonarqube.min.version>25.8.0.111929</sonarqube.min.version>\n  </properties>\n\n  <dependencies>\n    <dependency>\n      <groupId>org.sonarsource.api.plugin</groupId>\n      <artifactId>sonar-plugin-api</artifactId>\n      <version>${sonarqube.api.min.version}</version>\n      <scope>provided</scope>\n    </dependency>\n\n    <dependency>\n      <groupId>org.sonarsource.sonarqube</groupId>\n      <artifactId>sonar-plugin-api-impl</artifactId>\n      <version>${sonarqube.min.version}</version>\n      <scope>test</scope>\n    </dependency>\n\n    <dependency>\n      <groupId>com.felipebz.zpa</groupId>\n      <artifactId>sonar-zpa-plugin</artifactId>\n      <version>${zpa.version}</version>\n      <scope>provided</scope>\n    </dependency>\n\n    <dependency>\n      <groupId>com.felipebz.zpa</groupId>\n      <artifactId>zpa-checks-testkit</artifactId>\n      <version>${zpa.version}</version>\n      <scope>test</scope>\n    </dependency>\n\n    <dependency>\n      <groupId>org.junit.jupiter</groupId>\n      <artifactId>junit-jupiter</artifactId>\n      <version>6.0.3</version>\n      <scope>test</scope>\n    </dependency>\n  </dependencies>\n\n  <build>\n    <plugins>\n      <plugin>\n        <groupId>org.sonarsource.sonar-packaging-maven-plugin</groupId>\n        <artifactId>sonar-packaging-maven-plugin</artifactId>\n        <version>1.25.1.3002</version>\n        <extensions>true</extensions>\n        <configuration>\n          <pluginClass>com.company.plsql.PlSqlCustomRulesPlugin</pluginClass>\n          <pluginKey>my-rules</pluginKey>\n          <requiredForLanguages>plsqlopen</requiredForLanguages>\n          <sonarLintSupported>false</sonarLintSupported>\n          <pluginApiMinVersion>${sonarqube.api.min.version}</pluginApiMinVersion>\n        </configuration>\n      </plugin>\n\n      <plugin>\n        <groupId>org.apache.maven.plugins</groupId>\n        <artifactId>maven-compiler-plugin</artifactId>\n        <version>3.15.0</version>\n        <configuration>\n          <release>21</release>\n        </configuration>\n      </plugin>\n\n      <plugin>\n        <artifactId>maven-surefire-plugin</artifactId>\n        <version>3.5.5</version>\n      </plugin>\n    </plugins>\n  </build>\n\n  <repositories>\n    <repository>\n      <id>public_feed</id>\n      <url>https://central.sonatype.com/repository/maven-snapshots/</url>\n      <releases>\n        <enabled>true</enabled>\n      </releases>\n      <snapshots>\n        <enabled>true</enabled>\n      </snapshots>\n    </repository>\n  </repositories>\n</project>\n"
  },
  {
    "path": "plsql-custom-rules/settings.gradle.kts",
    "content": "rootProject.name = \"plsql-custom-rules\"\n"
  },
  {
    "path": "plsql-custom-rules/src/main/java/com/company/plsql/ForbiddenDmlCheck.java",
    "content": "package com.company.plsql;\n\nimport org.sonar.plugins.plsqlopen.api.annotations.Priority;\nimport org.sonar.plugins.plsqlopen.api.annotations.Rule;\nimport org.sonar.plugins.plsqlopen.api.DmlGrammar;\nimport org.sonar.plugins.plsqlopen.api.annotations.ActivatedByDefault;\nimport org.sonar.plugins.plsqlopen.api.annotations.ConstantRemediation;\nimport org.sonar.plugins.plsqlopen.api.checks.PlSqlCheck;\nimport org.sonar.plugins.plsqlopen.api.sslr.AstNode;\n\n@Rule(\n    name = \"Avoid DML on table USER\",\n    description = \"You should use the functions from the USER_WRAPPER package.\",\n    key = \"ForbiddenDmlCheck\",\n    priority = Priority.MAJOR\n)\n@ConstantRemediation(\"10min\")\n@ActivatedByDefault\npublic class ForbiddenDmlCheck extends PlSqlCheck {\n    \n    @Override\n    public void init() {\n        subscribeTo(DmlGrammar.DML_TABLE_EXPRESSION_CLAUSE);\n    }\n\n    @Override\n    public void visitNode(AstNode node) {\n        AstNode table = node.getFirstChildOrNull(DmlGrammar.TABLE_REFERENCE);\n        \n        if (table != null && table.getTokenOriginalValue().equalsIgnoreCase(\"user\")) {\n            addIssue(table, \"Replace this query by a function of the USER_WRAPPER package.\");\n        }\n    }\n\n}\n"
  },
  {
    "path": "plsql-custom-rules/src/main/java/com/company/plsql/PlSqlCustomRulesDefinition.java",
    "content": "package com.company.plsql;\n\nimport org.sonar.plugins.plsqlopen.api.CustomPlSqlRulesDefinition;\n\npublic class PlSqlCustomRulesDefinition extends CustomPlSqlRulesDefinition {\n    \n    @Override\n    public String repositoryName() {\n        return \"Company\";\n    }\n\n    @Override\n    public String repositoryKey() {\n        return \"my-rules\";\n    }\n\n    @Override\n    public Class[] checkClasses() {\n        return new Class[] {\n            ForbiddenDmlCheck.class\n        };\n    }\n\n}\n"
  },
  {
    "path": "plsql-custom-rules/src/main/java/com/company/plsql/PlSqlCustomRulesPlugin.java",
    "content": "package com.company.plsql;\n\nimport org.sonar.api.Plugin;\n\npublic class PlSqlCustomRulesPlugin implements Plugin {\n    \n    @Override\n    public void define(Plugin.Context context) {\n        context.addExtension(PlSqlCustomRulesDefinition.class);\n    }\n\n}\n"
  },
  {
    "path": "plsql-custom-rules/src/main/resources/META-INF/extensions.idx",
    "content": "com.company.plsql.PlSqlCustomRulesDefinition\n"
  },
  {
    "path": "plsql-custom-rules/src/test/java/com/company/plsql/ForbiddenDmlCheckTest.java",
    "content": "package com.company.plsql;\n\nimport org.junit.jupiter.api.Test;\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier;\n\npublic class ForbiddenDmlCheckTest {\n\n    @Test\n    public void test() {\n        PlSqlCheckVerifier.verify(\"src/test/resources/forbidden-dml.sql\", new ForbiddenDmlCheck());\n    }\n    \n}\n"
  },
  {
    "path": "plsql-custom-rules/src/test/java/com/company/plsql/PlSqlCustomRulesDefinitionTest.java",
    "content": "package com.company.plsql;\n\nimport org.junit.jupiter.api.Test;\nimport org.sonar.api.Plugin;\nimport org.sonar.api.SonarEdition;\nimport org.sonar.api.SonarQubeSide;\nimport org.sonar.api.internal.SonarRuntimeImpl;\nimport org.sonar.api.utils.Version;\n\nimport static org.junit.jupiter.api.Assertions.assertEquals;\n\npublic class PlSqlCustomRulesDefinitionTest {\n\n    @Test\n    public void test() {\n        Plugin.Context context = new Plugin.Context(SonarRuntimeImpl.forSonarQube(Version.create(6, 0), SonarQubeSide.SERVER, SonarEdition.COMMUNITY));\n        PlSqlCustomRulesPlugin plugin = new PlSqlCustomRulesPlugin();\n        plugin.define(context);\n        assertEquals(1, context.getExtensions().size());\n    }\n\n}\n"
  },
  {
    "path": "plsql-custom-rules/src/test/java/com/company/plsql/PlSqlCustomRulesPluginTest.java",
    "content": "package com.company.plsql;\n\nimport org.junit.jupiter.api.Test;\n\nimport static org.junit.jupiter.api.Assertions.assertEquals;\n\npublic class PlSqlCustomRulesPluginTest {\n\n    @Test\n    public void testRepository() {\n        PlSqlCustomRulesDefinition plugin = new PlSqlCustomRulesDefinition();\n        assertEquals(\"Company\", plugin.repositoryName());\n        assertEquals(\"my-rules\", plugin.repositoryKey());\n        assertEquals(1, plugin.checkClasses().length);\n    }\n\n}\n"
  },
  {
    "path": "plsql-custom-rules/src/test/resources/forbidden-dml.sql",
    "content": "select * \n  from user u inner join profile p on (u.id = p.user_id); -- Noncompliant {{Replace this query by a function of the USER_WRAPPER package.}}\n--     ^^^^\n\nselect *\nfrom (select *\n      from user) -- Noncompliant\n--         ^^^^\n"
  },
  {
    "path": "settings.gradle.kts",
    "content": "pluginManagement {\n    includeBuild(\"build-logic\")\n}\n\nrootProject.name = \"zpa\"\ninclude(\":sonar-zpa-plugin\")\ninclude(\":zpa-checks\")\ninclude(\":zpa-checks-testkit\")\ninclude(\":zpa-core\")\ninclude(\":zpa-toolkit\")\n"
  },
  {
    "path": "sonar-zpa-plugin/build.gradle.kts",
    "content": "import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar\nimport groovy.util.Node\nimport groovy.util.NodeList\nimport java.time.ZoneId\nimport java.time.format.DateTimeFormatter\nimport java.util.*\n\nplugins {\n    id(\"com.felipebz.zpa.build-conventions\")\n    alias(libs.plugins.shadow)\n}\n\ndependencies {\n    implementation(libs.flr.core)\n    implementation(libs.jackson.xml)\n    implementation(libs.woodstox)\n    implementation(project(\":zpa-core\"))\n    implementation(project(\":zpa-checks\"))\n    implementation(project(\":zpa-checks-testkit\"))\n    compileOnly(libs.sonar.plugin.api)\n    compileOnly(libs.sonar.plugin.api.impl)\n}\n\ntesting {\n    suites {\n        register<JvmTestSuite>(\"integrationTest\") {\n            dependencies {\n                implementation(libs.assertj)\n                implementation(libs.sonar.ws)\n                implementation(libs.sonar.orchestrator)\n            }\n\n            targets {\n                all {\n                    testTask.configure {\n                        val zipFile = System.getProperty(\"sonar.zipFile\")\n\n                        val launcher = javaToolchains.launcherFor {\n                            languageVersion.set(JavaLanguageVersion.of(21))\n                        }\n                        javaLauncher.set(launcher)\n\n                        environment(\"JAVA_HOME\", launcher.get().metadata.installationPath.asFile.toString())\n                        systemProperty(\"java.awt.headless\", \"true\")\n                        if (zipFile != null) {\n                            systemProperty(\"sonar.zipFile\", zipFile)\n                        }\n                        outputs.upToDateWhen { false }\n                    }\n                }\n            }\n        }\n    }\n}\n\nval shadowJar = tasks.named<ShadowJar>(\"shadowJar\") {\n    relocate(\"com.felipebz.flr.api\", \"org.sonar.plugins.plsqlopen.api.sslr\")\n    relocate(\"com.felipebz.zpa.api\", \"org.sonar.plugins.plsqlopen.api\")\n    archiveClassifier.set(\"\")\n    manifest {\n        val buildDate = DateTimeFormatter.ofPattern(\"yyyy-MM-dd'T'HH:mm:ssZ\").withZone(ZoneId.systemDefault()).format(Date().toInstant())\n        attributes(mapOf(\n            \"Plugin-BuildDate\" to buildDate,\n            \"Plugin-ChildFirstClassLoader\" to \"false\",\n            \"Plugin-Class\" to \"com.felipebz.zpa.PlSqlPlugin\",\n            \"Plugin-Description\" to \"Enables analysis and reporting on PL/SQL projects.\",\n            \"Plugin-Developers\" to \"Felipe Zorzo\",\n            \"Plugin-Display-Version\" to project.version,\n            \"Plugin-Homepage\" to \"https://zpa.felipebz.com\",\n            \"Plugin-IssueTrackerUrl\" to \"https://github.com/felipebz/zpa/issues\",\n            \"Plugin-Key\" to \"plsqlopen\",\n            \"Plugin-License\" to \"GNU LGPL 3\",\n            \"Plugin-Name\" to \"ZPA Plugin for SonarQube\",\n            \"Plugin-Organization\" to \"Felipe Zorzo\",\n            \"Plugin-OrganizationUrl\" to \"https://felipezorzo.com.br\",\n            \"Plugin-SourcesUrl\" to \"https://github.com/felipebz/zpa\",\n            \"Plugin-Version\" to project.version,\n            \"Sonar-Version\" to libs.versions.min.sonarqubeapi,\n            \"SonarLint-Supported\" to \"false\",\n            \"Plugin-RequiredForLanguages\" to \"plsqlopen\"\n        ))\n    }\n}\n\ntasks.build {\n    dependsOn(shadowJar)\n}\n\ntasks.jar {\n    enabled = false\n}\n\n// Disable Gradle module metadata as it lists wrong dependencies\ntasks.withType<GenerateModuleMetadata> {\n    enabled = false\n}\n\npublishing {\n    publications.withType<MavenPublication> {\n        this.pom.withXml {\n            val pomNode = asNode()\n\n            val dependencyNodes = pomNode.get(\"dependencies\") as NodeList\n            dependencyNodes.forEach {\n                (it as Node).parent().remove(it)\n            }\n        }\n        artifact(shadowJar)\n    }\n}\n\ndescription = \"ZPA Plugin for SonarQube\"\n"
  },
  {
    "path": "sonar-zpa-plugin/src/integrationTest/kotlin/com/felipebz/zpa/it/IssueTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.it\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.assertj.core.api.Assertions.tuple\nimport org.junit.jupiter.api.BeforeAll\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.extension.RegisterExtension\nimport org.sonarqube.ws.client.issues.SearchRequest\nimport java.io.File\n\nclass IssueTest {\n\n    @Test\n    fun issues() {\n        val issues = Tests.newWsClient(orchestrator)\n            .issues()\n            .search(SearchRequest().setComponentKeys(listOf(PROJECT_KEY)))\n            .issuesList\n\n        assertThat(issues).extracting(\"rule\", \"component\")\n                .containsExactlyInAnyOrder(\n                        tuple(\"plsql:EmptyBlock\", \"$PROJECT_KEY:src/source1.sql\"),\n                        tuple(\"my-rules:ForbiddenDmlCheck\", \"$PROJECT_KEY:src/custom_rule.sql\"))\n    }\n\n    companion object {\n        private const val PROJECT_KEY = \"issue\"\n\n        @JvmField\n        @RegisterExtension\n        val orchestrator = Tests.ORCHESTRATOR\n\n        @JvmStatic\n        @BeforeAll\n        fun init() {\n            orchestrator.server.provisionProject(PROJECT_KEY, PROJECT_KEY)\n            orchestrator.server.associateProjectToQualityProfile(PROJECT_KEY, \"plsqlopen\", \"it-profile\")\n\n            val build = Tests.createSonarScanner()\n                .setProjectDir(File(\"src/integrationTest/resources/projects/metrics/\"))\n                .setProjectKey(PROJECT_KEY)\n                .setProjectName(PROJECT_KEY)\n                .setProjectVersion(\"1.0\")\n                .setSourceDirs(\"src\")\n                .setProperty(\"sonar.sourceEncoding\", \"UTF-8\")\n            orchestrator.executeBuild(build)\n        }\n    }\n\n}\n"
  },
  {
    "path": "sonar-zpa-plugin/src/integrationTest/kotlin/com/felipebz/zpa/it/MetricsTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.it\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeAll\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertAll\nimport org.junit.jupiter.api.extension.RegisterExtension\nimport org.sonarqube.ws.Measures\nimport org.sonarqube.ws.client.measures.ComponentRequest\nimport java.io.File\n\nclass MetricsTest {\n\n    @Test\n    fun project_level() {\n        // Size\n        assertAll(\n            // Size\n            { assertThat(getMeasureAsInteger(PROJECT_KEY, \"ncloc\")).isEqualTo(32) },\n            { assertThat(getMeasureAsInteger(PROJECT_KEY, \"lines\")).isEqualTo(33) },\n            { assertThat(getMeasureAsInteger(PROJECT_KEY, \"files\")).isEqualTo(4) },\n            { assertThat(getMeasureAsInteger(PROJECT_KEY, \"statements\")).isEqualTo(7) },\n            // Documentation\n            { assertThat(getMeasureAsInteger(PROJECT_KEY, \"comment_lines\")).isEqualTo(1) },\n            { assertThat(getMeasureAsDouble(PROJECT_KEY, \"comment_lines_density\")).isEqualTo(3.0) },\n            { assertThat(getMeasureAsString(PROJECT_KEY, \"public_documented_api_density\")).isNull() },\n            // Duplication\n            { assertThat(getMeasureAsDouble(PROJECT_KEY, \"duplicated_lines\")).isZero },\n            { assertThat(getMeasureAsDouble(PROJECT_KEY, \"duplicated_blocks\")).isZero },\n            { assertThat(getMeasureAsDouble(PROJECT_KEY, \"duplicated_files\")).isZero },\n            { assertThat(getMeasureAsDouble(PROJECT_KEY, \"duplicated_lines_density\")).isZero },\n            // Rules\n            { assertThat(getMeasureAsDouble(PROJECT_KEY, \"violations\")).isZero },\n            // Tests\n            { assertThat(getMeasureAsInteger(PROJECT_KEY, \"tests\")).isEqualTo(6) },\n            { assertThat(getMeasureAsInteger(PROJECT_KEY, \"skipped_tests\")).isEqualTo(1) },\n            { assertThat(getMeasureAsInteger(PROJECT_KEY, \"test_failures\")).isEqualTo(1) },\n            { assertThat(getMeasureAsInteger(PROJECT_KEY, \"test_errors\")).isEqualTo(1) },\n            { assertThat(getMeasureAsDouble(PROJECT_KEY, \"test_success_density\")).isEqualTo(66.7) },\n            { assertThat(getMeasureAsDouble(PROJECT_KEY, \"test_execution_time\")).isEqualTo(15.0) },\n            // Coverage\n            { assertThat(getMeasureAsDouble(PROJECT_KEY, \"coverage\")).isEqualTo(50.0) },\n            { assertThat(getMeasureAsDouble(PROJECT_KEY, \"line_coverage\")).isEqualTo(50.0) },\n            { assertThat(getMeasureAsDouble(PROJECT_KEY, \"branch_coverage\")).isNull() },\n        )\n    }\n\n    @Test\n    fun file_level() {\n        assertAll(\n            // Size\n            { assertThat(getMeasureAsInteger(FILE_NAME, \"ncloc\")).isEqualTo(7) },\n            { assertThat(getMeasureAsInteger(FILE_NAME, \"lines\")).isEqualTo(7) },\n            { assertThat(getMeasureAsInteger(FILE_NAME, \"statements\")).isEqualTo(2) },\n            // Documentation\n            { assertThat(getMeasureAsInteger(FILE_NAME, \"comment_lines\")).isZero },\n            { assertThat(getMeasureAsDouble(FILE_NAME, \"comment_lines_density\")).isZero },\n            // Duplication\n            { assertThat(getMeasureAsInteger(FILE_NAME, \"duplicated_lines\")).isZero },\n            { assertThat(getMeasureAsInteger(FILE_NAME, \"duplicated_blocks\")).isZero },\n            { assertThat(getMeasureAsInteger(FILE_NAME, \"duplicated_files\")).isZero },\n            { assertThat(getMeasureAsDouble(FILE_NAME, \"duplicated_lines_density\")).isZero },\n            // Rules\n            { assertThat(getMeasureAsInteger(FILE_NAME, \"violations\")).isZero },\n        )\n    }\n\n    @Test\n    fun covered_file() {\n        assertAll(\n            // Size\n            { assertThat(getMeasureAsInteger(COVERED_FILE_NAME, \"ncloc\")).isEqualTo(10) },\n            { assertThat(getMeasureAsInteger(COVERED_FILE_NAME, \"lines\")).isEqualTo(10) },\n            { assertThat(getMeasureAsInteger(COVERED_FILE_NAME, \"statements\")).isEqualTo(3) },\n            // Documentation\n            { assertThat(getMeasureAsInteger(COVERED_FILE_NAME, \"comment_lines\")).isZero },\n            { assertThat(getMeasureAsDouble(COVERED_FILE_NAME, \"comment_lines_density\")).isZero },\n            // Duplication\n            { assertThat(getMeasureAsInteger(COVERED_FILE_NAME, \"duplicated_lines\")).isZero },\n            { assertThat(getMeasureAsInteger(COVERED_FILE_NAME, \"duplicated_blocks\")).isZero },\n            { assertThat(getMeasureAsInteger(COVERED_FILE_NAME, \"duplicated_files\")).isZero },\n            { assertThat(getMeasureAsDouble(COVERED_FILE_NAME, \"duplicated_lines_density\")).isZero },\n            // Rules\n            { assertThat(getMeasureAsInteger(COVERED_FILE_NAME, \"violations\")).isZero },\n            // Coverage\n            { assertThat(getMeasureAsDouble(COVERED_FILE_NAME, \"coverage\")).isEqualTo(100.0) },\n            { assertThat(getMeasureAsDouble(COVERED_FILE_NAME, \"line_coverage\")).isEqualTo(100.0) },\n            { assertThat(getMeasureAsDouble(COVERED_FILE_NAME, \"branch_coverage\")).isNull() },\n        )\n    }\n\n    @Test\n    fun test_file() {\n        assertAll(\n            // Size\n            { assertThat(getMeasureAsInteger(TEST_FILE_NAME, \"ncloc\")).isNull() },\n            { assertThat(getMeasureAsInteger(TEST_FILE_NAME, \"lines\")).isNull() },\n            { assertThat(getMeasureAsInteger(TEST_FILE_NAME, \"statements\")).isNull() },\n            // Documentation\n            { assertThat(getMeasureAsInteger(TEST_FILE_NAME, \"comment_lines\")).isNull() },\n            { assertThat(getMeasureAsDouble(TEST_FILE_NAME, \"comment_lines_density\")).isNull() },\n            // Duplication\n            { assertThat(getMeasureAsInteger(TEST_FILE_NAME, \"duplicated_lines\")).isZero },\n            { assertThat(getMeasureAsInteger(TEST_FILE_NAME, \"duplicated_blocks\")).isZero },\n            { assertThat(getMeasureAsInteger(TEST_FILE_NAME, \"duplicated_files\")).isZero },\n            { assertThat(getMeasureAsDouble(TEST_FILE_NAME, \"duplicated_lines_density\")).isZero },\n            // Rules\n            { assertThat(getMeasureAsInteger(TEST_FILE_NAME, \"violations\")).isZero },\n            // Tests\n            { assertThat(getMeasureAsInteger(TEST_FILE_NAME, \"tests\")).isEqualTo(6) },\n            { assertThat(getMeasureAsInteger(TEST_FILE_NAME, \"skipped_tests\")).isEqualTo(1) },\n            { assertThat(getMeasureAsInteger(TEST_FILE_NAME, \"test_failures\")).isEqualTo(1) },\n            { assertThat(getMeasureAsInteger(TEST_FILE_NAME, \"test_errors\")).isEqualTo(1) },\n            { assertThat(getMeasureAsDouble(TEST_FILE_NAME, \"test_success_density\")).isEqualTo(66.7) },\n            { assertThat(getMeasureAsDouble(TEST_FILE_NAME, \"test_execution_time\")).isEqualTo(15.0) },\n        )\n    }\n\n    /* Helper methods */\n    private fun getMeasure(componentKey: String, metricKey: String): Measures.Measure? {\n        val response = Tests.newWsClient(orchestrator).measures()\n            .component(\n                ComponentRequest()\n                    .setComponent(componentKey)\n                    .setMetricKeys(listOf(metricKey))\n            )\n        val measures = response.component.measuresList\n        return if (measures.size == 1) measures[0] else null\n    }\n\n    private fun getMeasureAsString(componentKey: String, metricKey: String): String? {\n        val measure = getMeasure(componentKey, metricKey)\n        return measure?.value\n    }\n\n    private fun getMeasureAsInteger(componentKey: String, metricKey: String): Int? {\n        val measure = getMeasure(componentKey, metricKey)\n        return if (measure == null) null else Integer.parseInt(measure.value)\n    }\n\n    private fun getMeasureAsDouble(componentKey: String, metricKey: String): Double? {\n        val measure = getMeasure(componentKey, metricKey)\n        return if (measure == null) null else java.lang.Double.parseDouble(measure.value)\n    }\n\n    companion object {\n\n        @JvmField\n        @RegisterExtension\n        var orchestrator = Tests.ORCHESTRATOR\n\n        private const val PROJECT_KEY = \"metrics\"\n        private const val FILE_NAME = \"$PROJECT_KEY:src/source1.sql\"\n        private const val COVERED_FILE_NAME = \"$PROJECT_KEY:src/betwnstr.sql\"\n        private const val TEST_FILE_NAME = \"$PROJECT_KEY:test/test_betwnstr.sql\"\n\n        @JvmStatic\n        @BeforeAll\n        fun init() {\n            orchestrator.server.provisionProject(PROJECT_KEY, PROJECT_KEY)\n            orchestrator.server.associateProjectToQualityProfile(PROJECT_KEY, \"plsqlopen\", \"empty-profile\")\n\n            val build = Tests.createSonarScanner()\n                .setProjectDir(File(\"src/integrationTest/resources/projects/metrics/\"))\n                .setProjectKey(PROJECT_KEY)\n                .setProjectName(PROJECT_KEY)\n                .setProjectVersion(\"1.0\")\n                .setSourceDirs(\"src\")\n                .setTestDirs(\"test\")\n                .setProperty(\"sonar.sourceEncoding\", \"UTF-8\")\n                .setProperty(\"sonar.zpa.tests.reportPaths\", \"test_results.xml\")\n                .setProperty(\"sonar.zpa.coverage.reportPaths\", \"coverage.xml\")\n                .setDebugLogs(true)\n            orchestrator.executeBuild(build)\n        }\n\n    }\n}\n"
  },
  {
    "path": "sonar-zpa-plugin/src/integrationTest/kotlin/com/felipebz/zpa/it/Tests.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.it\n\nimport com.sonar.orchestrator.Orchestrator\nimport com.sonar.orchestrator.build.SonarScanner\nimport com.sonar.orchestrator.junit5.OrchestratorExtension\nimport com.sonar.orchestrator.locator.FileLocation\nimport org.junit.jupiter.api.extension.RegisterExtension\nimport org.sonarqube.ws.client.HttpConnector\nimport org.sonarqube.ws.client.WsClient\nimport org.sonarqube.ws.client.WsClientFactories\nimport java.io.File\n\nobject Tests {\n\n    @JvmField\n    @RegisterExtension\n    val ORCHESTRATOR: OrchestratorExtension =\n        OrchestratorExtension.builderEnv()\n            .useDefaultAdminCredentialsForBuilds(true)\n            .apply {\n                val zipFile = System.getProperty(\"sonar.zipFile\")\n                if (zipFile != null) {\n                    setZipFile(File(zipFile))\n                } else {\n                    setSonarVersion(System.getProperty(\"sonar.runtimeVersion\", \"LATEST_RELEASE[25.8]\"))\n                }\n            }\n            .setOrchestratorProperty(\"orchestrator.artifactory.url\", \"https://repo1.maven.org/maven2\")\n            .addPlugin(FileLocation.byWildcardMavenFilename(\n                    File(\"build/libs\"),\n                    \"sonar-zpa-plugin-*.jar\"))\n            .addPlugin(FileLocation.byWildcardMavenFilename(\n                    File(\"../plsql-custom-rules/build/libs\"),\n                    \"plsql-custom-rules-*.jar\"))\n            .restoreProfileAtStartup(FileLocation.ofClasspath(\"/com/felipebz/zpa/it/it-profile.xml\"))\n            .restoreProfileAtStartup(FileLocation.ofClasspath(\"/com/felipebz/zpa/it/empty-profile.xml\"))\n            .build()\n\n    fun createSonarScanner(): SonarScanner =\n        SonarScanner.create()\n            .setScannerVersion(\"7.0.2.4839\")\n\n    fun newWsClient(orchestrator: Orchestrator): WsClient =\n        WsClientFactories.getDefault()\n                .newClient(HttpConnector.newBuilder()\n                        .url(orchestrator.server.url).build())\n\n}\n"
  },
  {
    "path": "sonar-zpa-plugin/src/integrationTest/resources/com/felipebz/zpa/it/empty-profile.xml",
    "content": "<profile>\n    <name>empty-profile</name>\n    <language>plsqlopen</language>\n    <rules />\n</profile>\n"
  },
  {
    "path": "sonar-zpa-plugin/src/integrationTest/resources/com/felipebz/zpa/it/it-profile.xml",
    "content": "<profile>\n    <name>it-profile</name>\n    <language>plsqlopen</language>\n    <rules>\n        <rule>\n            <repositoryKey>plsql</repositoryKey>\n            <key>EmptyBlock</key>\n            <priority>MAJOR</priority>\n        </rule>\n        <rule>\n            <repositoryKey>my-rules</repositoryKey>\n            <key>ForbiddenDmlCheck</key>\n            <priority>MAJOR</priority>\n        </rule>\n    </rules>\n</profile>\n"
  },
  {
    "path": "sonar-zpa-plugin/src/integrationTest/resources/projects/metrics/coverage.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<coverage version=\"1\">\n  <file path=\"function ut3_demo.betwnstr\">\n    <lineToCover lineNumber=\"2\" covered=\"true\"/>\n    <lineToCover lineNumber=\"4\" covered=\"true\"/>\n    <lineToCover lineNumber=\"5\" covered=\"true\"/>\n    <lineToCover lineNumber=\"7\" covered=\"true\"/>\n  </file>\n</coverage>\n"
  },
  {
    "path": "sonar-zpa-plugin/src/integrationTest/resources/projects/metrics/src/betwnstr.sql",
    "content": "CREATE OR REPLACE FUNCTION BETWNSTR(A_STRING VARCHAR2, A_START_POS INTEGER, A_END_POS INTEGER) RETURN VARCHAR2 IS\n  L_START_POS PLS_INTEGER := A_START_POS;\nBEGIN\n  IF L_START_POS = 0 THEN\n    L_START_POS := 1;\n  END IF;\n  RETURN SUBSTR(A_STRING, L_START_POS, A_END_POS - L_START_POS + 1);\nEND;\n/\n"
  },
  {
    "path": "sonar-zpa-plugin/src/integrationTest/resources/projects/metrics/src/custom_rule.sql",
    "content": "declare\n  x number;\nbegin\n  select x\n    into x\n    from user;\nend;\n"
  },
  {
    "path": "sonar-zpa-plugin/src/integrationTest/resources/projects/metrics/src/source1.sql",
    "content": "begin\n  null;\nend;\nbegin\n  null; -- NOSONAR\nend;\n"
  },
  {
    "path": "sonar-zpa-plugin/src/integrationTest/resources/projects/metrics/src/source2.sql",
    "content": "declare\n  i number;\nbegin\n  -- a comment\n  select count(*)\n    into i\n    from dual;\nend;"
  },
  {
    "path": "sonar-zpa-plugin/src/integrationTest/resources/projects/metrics/test/test_betwnstr.sql",
    "content": "create or replace package test_betwnstr as\n  -- %suite(Between string function)\n\n  -- %test(Returns substring from start position to end position)\n  procedure normal_case;\n\n  -- %test(Returns substring when start position is zero)\n  procedure zero_start_position;\n\n  -- %test(Returns string until end if end position is greater than string length)\n  procedure big_end_position;\n\n  -- %test(Returns null for null input string value)\n  procedure null_string;\n\n  -- %test(A demo of test raising runtime exception)\n  procedure bad_params;\n\n  -- %test(A demo of failing test)\n  procedure bad_test;\n\n  -- %test(Demo of a disabled test)\n  -- %disabled\n  procedure disabled_test;\n\nend;\n/\ncreate or replace package body test_betwnstr as\n\n  procedure normal_case is\n  begin\n    ut.expect(betwnstr('1234567', 2, 5)).to_equal('2345');\n  end;\n\n  procedure zero_start_position is\n  begin\n    ut.expect(betwnstr('1234567', 0, 5)).to_(equal('12345'));\n  end;\n\n  procedure big_end_position is\n  begin\n    ut.expect(betwnstr('1234567', 0, 500)).to_(equal('1234567'));\n  end;\n\n  procedure null_string is\n  begin\n    ut.expect(betwnstr(null, 2, 5)).to_(be_null());\n  end;\n\n  procedure bad_params is\n  begin\n    ut.expect(betwnstr('1234567', 'a', 'b')).to_(be_null());\n  end;\n\n  procedure bad_test\n    is\n  begin\n    ut.expect(betwnstr('1234567', 0, 500)).to_(equal('1'));\n  end;\n\n  procedure disabled_test is\n  begin\n    ut.expect(betwnstr(null, null, null)).not_to(be_null);\n  end;\n\nend;\n/\n"
  },
  {
    "path": "sonar-zpa-plugin/src/integrationTest/resources/projects/metrics/test_results.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<testExecutions version=\"1\">\n  <file path=\"test_betwnstr\">\n    <testCase name=\"normal_case\" duration=\"2\">\n    </testCase>\n    <testCase name=\"zero_start_position\" duration=\"2\">\n    </testCase>\n    <testCase name=\"big_end_position\" duration=\"2\">\n    </testCase>\n    <testCase name=\"null_string\" duration=\"2\">\n    </testCase>\n    <testCase name=\"bad_params\" duration=\"2\">\n      <error message=\"encountered errors\">\n        <![CDATA[\nORA-06502: PL/SQL: erro: erro de conversão de caractere em número numérico ou de valor\nORA-06512: em \"UT3_DEMO.TEST_BETWNSTR\", line 25\nORA-06512: em \"UT3_DEMO.TEST_BETWNSTR\", line 25\nORA-06512: em line 6\n]]>\n      </error>\n    </testCase>\n    <testCase name=\"bad_test\" duration=\"5\">\n      <failure message=\"some expectations have failed\">\n        <![CDATA[\nActual: '1234567' (varchar2) was expected to equal: '1' (varchar2)\nat \"UT3_DEMO.TEST_BETWNSTR.BAD_TEST\", line 31 ut.expect( betwnstr( '1234567', 0, 500 ) ).to_( equal('1') );\n]]>\n      </failure>\n    </testCase>\n    <testCase name=\"disabled_test\" duration=\"0\">\n      <skipped message=\"skipped\"/>\n    </testCase>\n  </file>\n</testExecutions>\n"
  },
  {
    "path": "sonar-zpa-plugin/src/main/kotlin/com/felipebz/zpa/PlSql.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa\n\nimport org.sonar.api.config.Configuration\nimport org.sonar.api.resources.AbstractLanguage\n\nclass PlSql internal constructor(private val settings: Configuration) : AbstractLanguage(KEY, \"PL/SQL (ZPA)\") {\n\n    private val defaultFileSuffixes = arrayOf(\"sql\", \"pkg\", \"pks\", \"pkb\")\n\n    override fun getFileSuffixes(): Array<String> {\n        val suffixes = filterEmptyStrings(settings.getStringArray(PlSqlPlugin.Companion.FILE_SUFFIXES_KEY))\n        return if (suffixes.isEmpty()) defaultFileSuffixes else suffixes\n    }\n\n    private fun filterEmptyStrings(stringArray: Array<String>): Array<String> {\n        val nonEmptyStrings = stringArray\n            .filterNot { it.isBlank() }\n            .map { it.trim() }\n        return nonEmptyStrings.toTypedArray()\n    }\n\n    companion object {\n        const val KEY = \"plsqlopen\"\n    }\n\n}\n"
  },
  {
    "path": "sonar-zpa-plugin/src/main/kotlin/com/felipebz/zpa/PlSqlPlugin.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa\n\nimport org.sonar.api.Plugin\nimport org.sonar.api.PropertyType\nimport org.sonar.api.config.PropertyDefinition\nimport com.felipebz.zpa.symbols.ObjectLocator\nimport com.felipebz.zpa.log.SonarQubeLoggers\nimport com.felipebz.zpa.utils.log.Loggers\nimport com.felipebz.zpa.utplsql.UtPlSqlSensor\n\nclass PlSqlPlugin : Plugin {\n\n    override fun define(context: Plugin.Context) {\n        Loggers.factory = SonarQubeLoggers()\n\n        context.addExtensions(\n            PropertyDefinition.builder(FILE_SUFFIXES_KEY)\n                .deprecatedKey(OLD_FILE_SUFFIXES_KEY)\n                .name(\"File Suffixes\")\n                .description(\"Comma-separated list of suffixes of PL/SQL files to analyze.\")\n                .category(DEFAULT_CATEGORY)\n                .subCategory(GENERAL)\n                .onConfigScopes(PropertyDefinition.ConfigScope.PROJECT)\n                .defaultValue(\"sql,pkg,pks,pkb\")\n                .multiValues(true)\n                .build(),\n            PropertyDefinition.builder(FORMS_METADATA_KEY)\n                .name(\"Oracle Forms metadata file\")\n                .description(\"Path to the JSON file with the Oracle Forms metadata.\")\n                .category(DEFAULT_CATEGORY)\n                .subCategory(GENERAL)\n                .onConfigScopes(PropertyDefinition.ConfigScope.PROJECT)\n                .build(),\n            PropertyDefinition.builder(ERROR_RECOVERY_KEY)\n                .name(\"Parse error recovery\")\n                .description(\"Defines mode for error handling of parsing errors. 'False' (strict) breaks after an error or 'True' (tolerant, default) continues.\")\n                .category(DEFAULT_CATEGORY)\n                .subCategory(GENERAL)\n                .onConfigScopes(PropertyDefinition.ConfigScope.PROJECT)\n                .type(PropertyType.BOOLEAN)\n                .defaultValue(\"true\")\n                .build(),\n            PropertyDefinition.builder(CONCURRENT_EXECUTION_KEY)\n                .name(\"Enable concurrent execution\")\n                .description(\"Enable concurrent analysis of files.\")\n                .category(DEFAULT_CATEGORY)\n                .subCategory(GENERAL)\n                .onConfigScopes(PropertyDefinition.ConfigScope.PROJECT)\n                .type(PropertyType.BOOLEAN)\n                .defaultValue(\"true\")\n                .build(),\n\n            PlSql::class.java,\n            PlSqlProfile::class.java,\n            PlSqlSquidSensor::class.java,\n            PlSqlRuleRepository::class.java,\n            ObjectLocator::class.java,\n        )\n\n        addUtPlSqlExtensions(context)\n    }\n\n    private fun addUtPlSqlExtensions(context: Plugin.Context) {\n        context.addExtensions(\n            PropertyDefinition.builder(UtPlSqlSensor.TEST_REPORT_PATH_KEY)\n                .name(\"Path to the utPLSQL test report(s)\")\n                .description(\"Paths (absolute or relative) to report files with utPLSQL test execution data.\")\n                .category(DEFAULT_CATEGORY)\n                .subCategory(TEST_AND_COVERAGE)\n                .onConfigScopes(PropertyDefinition.ConfigScope.PROJECT)\n                .defaultValue(UtPlSqlSensor.DEFAULT_TEST_REPORT_PATH)\n                .multiValues(true)\n                .build(),\n            PropertyDefinition.builder(UtPlSqlSensor.COVERAGE_REPORT_PATH_KEY)\n                .name(\"Path to the utPLSQL coverage report(s)\")\n                .description(\"Paths (absolute or relative) to report files with utPLSQL coverage data.\")\n                .category(DEFAULT_CATEGORY)\n                .subCategory(TEST_AND_COVERAGE)\n                .onConfigScopes(PropertyDefinition.ConfigScope.PROJECT)\n                .defaultValue(UtPlSqlSensor.DEFAULT_COVERAGE_REPORT_PATH)\n                .multiValues(true)\n                .build(),\n\n            UtPlSqlSensor::class.java,\n        )\n    }\n\n    companion object {\n        private const val DEFAULT_CATEGORY = \"ZPA\"\n        private const val GENERAL = \"General\"\n        private const val TEST_AND_COVERAGE = \"Tests and Coverage\"\n        internal const val FILE_SUFFIXES_KEY = \"sonar.plsqlopen.file.suffixes\"\n        internal const val OLD_FILE_SUFFIXES_KEY = \"sonar.zpa.file.suffixes\"\n        internal const val FORMS_METADATA_KEY = \"sonar.zpa.forms.metadata\"\n        internal const val ERROR_RECOVERY_KEY = \"sonar.zpa.errorRecoveryEnabled\"\n        internal const val CONCURRENT_EXECUTION_KEY = \"sonar.zpa.concurrentExecution\"\n    }\n\n}\n"
  },
  {
    "path": "sonar-zpa-plugin/src/main/kotlin/com/felipebz/zpa/PlSqlProfile.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa\n\nimport org.sonar.api.server.profile.BuiltInQualityProfilesDefinition\nimport org.sonar.api.utils.AnnotationUtils\nimport com.felipebz.zpa.checks.CheckList\nimport com.felipebz.zpa.rules.SonarQubeRuleMetadataLoader\nimport com.felipebz.zpa.api.annotations.ActivatedByDefault\n\nclass PlSqlProfile : BuiltInQualityProfilesDefinition {\n\n    private val ruleMetadataLoader = SonarQubeRuleMetadataLoader()\n\n    override fun define(context: BuiltInQualityProfilesDefinition.Context) {\n        val profile = context.createBuiltInQualityProfile(CheckList.SONAR_WAY_PROFILE, PlSql.KEY)\n        profile.isDefault = true\n\n        for (ruleClass in CheckList.checks) {\n            addRule(ruleClass, profile)\n        }\n\n        profile.done()\n    }\n\n    private fun addRule(ruleClass: Class<*>, profile: BuiltInQualityProfilesDefinition.NewBuiltInQualityProfile) {\n        if (AnnotationUtils.getAnnotation(ruleClass, ActivatedByDefault::class.java) != null) {\n            val ruleKey = CustomAnnotationBasedRulesDefinition.getRuleKey(ruleMetadataLoader, ruleClass)\n            profile.activateRule(PlSqlRuleRepository.KEY, ruleKey)\n        }\n    }\n\n}\n"
  },
  {
    "path": "sonar-zpa-plugin/src/main/kotlin/com/felipebz/zpa/PlSqlRuleRepository.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa\n\nimport com.felipebz.zpa.checks.CheckList\nimport com.felipebz.zpa.rules.SonarQubeRepositoryAdapter\nimport com.felipebz.zpa.rules.SonarQubeRuleMetadataLoader\nimport org.sonar.api.server.rule.RulesDefinition\n\nclass PlSqlRuleRepository : RulesDefinition {\n\n    override fun define(context: RulesDefinition.Context) {\n        val repository = context\n                .createRepository(KEY, PlSql.Companion.KEY)\n                .setName(\"ZPA\")\n        CustomAnnotationBasedRulesDefinition.load(SonarQubeRepositoryAdapter(repository), PlSql.Companion.KEY, CheckList.checks, SonarQubeRuleMetadataLoader())\n        repository.done()\n    }\n\n    companion object {\n        internal val KEY: String\n\n        init {\n            // TODO: remove this code and always use the key \"zpa\"\n            var repositoryKey = \"plsql\"\n            if (SonarQubeUtils.isCommercialEdition) {\n                repositoryKey = \"zpa\"\n            }\n            KEY = repositoryKey\n        }\n    }\n\n}\n"
  },
  {
    "path": "sonar-zpa-plugin/src/main/kotlin/com/felipebz/zpa/PlSqlSquidSensor.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa\n\nimport org.sonar.api.batch.rule.ActiveRules\nimport org.sonar.api.batch.sensor.Sensor\nimport org.sonar.api.batch.sensor.SensorContext\nimport org.sonar.api.batch.sensor.SensorDescriptor\nimport org.sonar.api.config.Configuration\nimport org.sonar.api.issue.NoSonarFilter\nimport org.sonar.api.measures.FileLinesContextFactory\nimport com.felipebz.zpa.checks.CheckList\nimport com.felipebz.zpa.metadata.FormsMetadata\nimport com.felipebz.zpa.rules.SonarQubeActiveRulesAdapter\nimport com.felipebz.zpa.rules.SonarQubeRuleMetadataLoader\nimport com.felipebz.zpa.squid.PlSqlAstScanner\nimport com.felipebz.zpa.squid.ProgressReport\nimport com.felipebz.zpa.symbols.ObjectLocator\nimport com.felipebz.zpa.utils.log.Logger\nimport com.felipebz.zpa.utils.log.Loggers\nimport com.felipebz.zpa.api.ZpaRulesDefinition\nimport java.util.concurrent.TimeUnit\n\nclass PlSqlSquidSensor @JvmOverloads constructor(activeRules: ActiveRules, settings: Configuration, private val noSonarFilter: NoSonarFilter,\n                                                 private val fileLinesContextFactory: FileLinesContextFactory,\n                                                 customRulesDefinition: Array<ZpaRulesDefinition>? = null,\n                                                 private val objectLocator: ObjectLocator) : Sensor {\n\n    private val logger: Logger = Loggers.getLogger(PlSqlSquidSensor::class.java)\n\n    private val checks = PlSqlChecks.createPlSqlCheck(SonarQubeActiveRulesAdapter(activeRules), SonarQubeRuleMetadataLoader())\n            .addChecks(PlSqlRuleRepository.Companion.KEY, CheckList.checks)\n            .addCustomChecks(customRulesDefinition)\n\n    private val isErrorRecoveryEnabled = settings.getBoolean(PlSqlPlugin.Companion.ERROR_RECOVERY_KEY).orElse(false)\n    private val isConcurrentModeEnabled = settings.getBoolean(PlSqlPlugin.Companion.CONCURRENT_EXECUTION_KEY).orElse(true)\n\n    private val formsMetadata = FormsMetadata.loadFromFile(settings.get(PlSqlPlugin.Companion.FORMS_METADATA_KEY)\n        .orElse(null))\n\n    override fun describe(descriptor: SensorDescriptor) {\n        descriptor.name(\"ZPA\").onlyOnLanguage(PlSql.Companion.KEY)\n    }\n\n    override fun execute(context: SensorContext) {\n        val fs = context.fileSystem()\n        val inputFiles = fs.inputFiles(fs.predicates().hasLanguage(PlSql.Companion.KEY)).toList()\n\n        val progressReport = ProgressReport(\"Report about progress of code analyzer\", TimeUnit.SECONDS.toMillis(10))\n        val scanner = PlSqlAstScanner(context, checks, noSonarFilter, formsMetadata, isErrorRecoveryEnabled, fileLinesContextFactory, objectLocator)\n\n        progressReport.start(inputFiles.map { it.toString() })\n\n        val files = if (isConcurrentModeEnabled) {\n            logger.info(\"Concurrent mode enabled\")\n            inputFiles.parallelStream()\n        } else {\n            inputFiles.stream()\n        }\n\n        files.forEach {\n            try {\n                scanner.scanFile(it)\n                progressReport.nextFile()\n            } catch (e: Exception) {\n                logger.error(\"Error during analysis of file $it\", e)\n            }\n        }\n\n        progressReport.stop()\n    }\n\n}\n"
  },
  {
    "path": "sonar-zpa-plugin/src/main/kotlin/com/felipebz/zpa/SonarQubeUtils.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa\n\nobject SonarQubeUtils {\n\n    val isCommercialEdition by lazy {\n        var value = false\n        try {\n            // is it running a commercial edition of SQ?\n            Class.forName(\"com.sonarsource.plugins.license.api.LicensedPluginRegistration\")\n            value = true\n        } catch (e: ClassNotFoundException) {\n            // ignore\n        }\n        value\n    }\n\n}\n"
  },
  {
    "path": "sonar-zpa-plugin/src/main/kotlin/com/felipebz/zpa/api/CustomPlSqlRulesDefinition.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api\n\nimport com.felipebz.zpa.CustomAnnotationBasedRulesDefinition\nimport com.felipebz.zpa.PlSql\nimport com.felipebz.zpa.rules.SonarQubeRepositoryAdapter\nimport com.felipebz.zpa.rules.SonarQubeRuleMetadataLoader\nimport org.sonar.api.ExtensionPoint\nimport org.sonar.api.scanner.ScannerSide\nimport org.sonar.api.server.rule.RulesDefinition\n\n@ExtensionPoint\n@ScannerSide\nabstract class CustomPlSqlRulesDefinition : RulesDefinition, ZpaRulesDefinition {\n\n    override fun define(context: RulesDefinition.Context) {\n        val repo = context.createRepository(repositoryKey(), PlSql.KEY)\n                .setName(repositoryName())\n\n        // Load metadata from check classes' annotations\n        CustomAnnotationBasedRulesDefinition(SonarQubeRepositoryAdapter(repo), PlSql.KEY, SonarQubeRuleMetadataLoader())\n            .addRuleClasses(checkClasses().toList())\n\n        repo.done()\n    }\n\n}\n"
  },
  {
    "path": "sonar-zpa-plugin/src/main/kotlin/com/felipebz/zpa/highlight/PlSqlHighlighterVisitor.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.highlight\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.flr.api.Token\nimport com.felipebz.flr.api.Trivia\nimport org.sonar.api.batch.fs.InputFile\nimport org.sonar.api.batch.sensor.SensorContext\nimport org.sonar.api.batch.sensor.highlighting.NewHighlighting\nimport org.sonar.api.batch.sensor.highlighting.TypeOfText\nimport com.felipebz.zpa.api.PlSqlKeyword\nimport com.felipebz.zpa.api.PlSqlTokenType\nimport com.felipebz.zpa.api.checks.PlSqlCheck\n\nclass PlSqlHighlighterVisitor(context: SensorContext, inputFile: InputFile) : PlSqlCheck() {\n\n    private val highlighting: NewHighlighting = context.newHighlighting().onFile(inputFile)\n\n    override fun visitToken(token: Token) {\n        if (token.type is PlSqlTokenType) {\n            highlight(token, TypeOfText.STRING)\n        }\n        if (token.type is PlSqlKeyword) {\n            highlight(token, TypeOfText.KEYWORD)\n        }\n    }\n\n    override fun visitComment(trivia: Trivia, content: String) {\n        val token = trivia.token\n        if (token.value.startsWith(\"/**\")) {\n            highlight(token, TypeOfText.STRUCTURED_COMMENT)\n        } else {\n            highlight(token, TypeOfText.COMMENT)\n        }\n    }\n\n    override fun leaveFile(node: AstNode) {\n        highlighting.save()\n    }\n\n    private fun highlight(token: Token, code: TypeOfText) {\n        highlighting.highlight(token.line, token.column, token.endLine, token.endColumn, code)\n    }\n\n}\n"
  },
  {
    "path": "sonar-zpa-plugin/src/main/kotlin/com/felipebz/zpa/log/SonarQubeLogger.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.log\n\nimport org.slf4j.Logger\n\nclass SonarQubeLogger internal constructor(private val logger: Logger) : com.felipebz.zpa.utils.log.Logger {\n\n    override fun trace(msg: String) {\n        logger.trace(msg)\n    }\n\n    override fun trace(msg: String, vararg args: Any?) {\n        logger.trace(msg, *args)\n    }\n\n    override fun debug(msg: String) {\n        logger.debug(msg)\n    }\n\n    override fun debug(msg: String, vararg args: Any?) {\n        logger.debug(msg, *args)\n    }\n\n    override fun info(msg: String) {\n        logger.info(msg)\n    }\n\n    override fun info(msg: String, vararg args: Any?) {\n        logger.info(msg, *args)\n    }\n\n    override fun warn(msg: String) {\n        logger.warn(msg)\n    }\n\n    override fun warn(msg: String, vararg args: Any?) {\n        logger.warn(msg, *args)\n    }\n\n    override fun error(msg: String) {\n        logger.error(msg)\n    }\n\n    override fun error(msg: String, vararg args: Any?) {\n        logger.error(msg, *args)\n    }\n\n}\n"
  },
  {
    "path": "sonar-zpa-plugin/src/main/kotlin/com/felipebz/zpa/log/SonarQubeLoggers.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.log\n\nimport org.slf4j.LoggerFactory\nimport com.felipebz.zpa.utils.log.Logger\nimport com.felipebz.zpa.utils.log.Loggers\n\nclass SonarQubeLoggers : Loggers() {\n\n    override fun getLogger(name: String): Logger {\n        return SonarQubeLogger(LoggerFactory.getLogger(name))\n    }\n\n}\n"
  },
  {
    "path": "sonar-zpa-plugin/src/main/kotlin/com/felipebz/zpa/metrics/CpdVisitor.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.metrics\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.flr.api.Token\nimport org.sonar.api.batch.fs.InputFile\nimport org.sonar.api.batch.sensor.SensorContext\nimport org.sonar.api.batch.sensor.cpd.NewCpdTokens\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.checks.PlSqlCheck\n\nclass CpdVisitor(context: SensorContext, inputFile: InputFile) : PlSqlCheck() {\n\n    private val newCpdTokens: NewCpdTokens = context.newCpdTokens().onFile(inputFile)\n\n    override fun init() {\n        subscribeTo(PlSqlGrammar.ANONYMOUS_BLOCK,\n                PlSqlGrammar.CREATE_PROCEDURE,\n                PlSqlGrammar.CREATE_FUNCTION,\n                PlSqlGrammar.CREATE_PACKAGE_BODY,\n                PlSqlGrammar.CREATE_TYPE_BODY)\n    }\n\n    override fun visitNode(node: AstNode) {\n        for (token in node.tokens) {\n            saveCpdTokens(token)\n        }\n    }\n\n    private fun saveCpdTokens(token: Token) {\n        newCpdTokens.addToken(token.line, token.column, token.endLine, token.endColumn, token.value)\n    }\n\n    override fun leaveFile(node: AstNode) {\n        newCpdTokens.save()\n    }\n\n}\n"
  },
  {
    "path": "sonar-zpa-plugin/src/main/kotlin/com/felipebz/zpa/rules/SonarQubeActiveRuleAdapter.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.rules\n\nimport org.sonar.api.batch.rule.ActiveRule\n\nclass SonarQubeActiveRuleAdapter(private val activeRule: ActiveRule) : ZpaActiveRule {\n\n    override val ruleKey: ZpaRuleKey\n        get() = SonarQubeRuleKeyAdapter(activeRule.ruleKey())\n\n    override val severity: String\n        get() = activeRule.severity()\n\n    override val language: String\n        get() = activeRule.language()\n\n    override fun param(key: String): String? = activeRule.param(key)\n\n    override val params: Map<String, String>\n        get() = activeRule.params()\n\n    override val internalKey: String?\n        get() = activeRule.internalKey()\n\n    override val templateRuleKey: String?\n        get() = activeRule.templateRuleKey()\n\n    override val tags: Array<String>\n        get() = throw NotImplementedError()\n\n    override val remediationConstant: String\n        get() = throw NotImplementedError()\n\n    override val name: String\n        get() = throw NotImplementedError()\n\n    override fun toString(): String = activeRule.toString()\n\n    override fun equals(other: Any?): Boolean = activeRule == other\n\n    override fun hashCode(): Int = activeRule.hashCode()\n\n}\n"
  },
  {
    "path": "sonar-zpa-plugin/src/main/kotlin/com/felipebz/zpa/rules/SonarQubeActiveRulesAdapter.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.rules\n\nimport org.sonar.api.batch.rule.ActiveRules\n\nclass SonarQubeActiveRulesAdapter(private val activeRules: ActiveRules) : ZpaActiveRules {\n\n    override fun findByRepository(repository: String): Collection<ZpaActiveRule> =\n        activeRules.findByRepository(repository).map { SonarQubeActiveRuleAdapter(it) }\n\n}\n"
  },
  {
    "path": "sonar-zpa-plugin/src/main/kotlin/com/felipebz/zpa/rules/SonarQubeRepositoryAdapter.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.rules\n\nimport org.sonar.api.server.rule.RulesDefinition\n\nclass SonarQubeRepositoryAdapter(private val repository: RulesDefinition.NewRepository) : ZpaRepository {\n    override val key: String = repository.key()\n\n    override fun createRule(ruleKey: String): ZpaRule =\n        SonarQubeRuleAdapter(repository.createRule(ruleKey))\n\n    override fun rule(ruleKey: String): ZpaRule? {\n        val rule = repository.rule(ruleKey)\n        return if (rule != null) SonarQubeRuleAdapter(rule) else null\n    }\n}\n"
  },
  {
    "path": "sonar-zpa-plugin/src/main/kotlin/com/felipebz/zpa/rules/SonarQubeRuleAdapter.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.rules\n\nimport org.sonar.api.rule.RuleScope\nimport org.sonar.api.server.rule.RulesDefinition\nimport com.felipebz.zpa.api.annotations.RuleInfo\nimport org.sonar.api.rule.RuleStatus as SonarQubeRuleStatus\n\nclass SonarQubeRuleAdapter(private val newRule: RulesDefinition.NewRule) : ZpaRule {\n    override val key: String\n        get() = newRule.key()\n\n    override val params: List<ZpaRuleParam>\n        get() = newRule.params().map { SonarQubeRuleParamAdapter(it) }\n\n    override var name: String\n        get() = throw IllegalAccessException(\"Getter is not available\")\n        set(value) {\n            newRule.setName(value)\n        }\n\n    override var remediationConstant: String\n        get() = throw IllegalAccessException(\"Getter is not available\")\n        set(value) {\n            newRule.setDebtRemediationFunction(newRule.debtRemediationFunctions().constantPerIssue(value))\n        }\n\n    override var scope: RuleInfo.Scope\n        get() = throw IllegalAccessException(\"Getter is not available\")\n        set(value) {\n            newRule.setScope(RuleScope.valueOf(value.name))\n        }\n\n    override var template: Boolean\n        get() = throw IllegalAccessException(\"Getter is not available\")\n        set(value) {\n            newRule.setTemplate(value)\n        }\n\n    override var tags: Array<String>\n        get() = throw IllegalAccessException(\"Getter is not available\")\n        set(value) {\n            newRule.setTags(*value)\n        }\n\n    override var status: RuleStatus\n        get() = throw IllegalAccessException(\"Getter is not available\")\n        set(value) {\n            newRule.setStatus(SonarQubeRuleStatus.valueOf(value.name))\n        }\n\n    override var severity: String\n        get() = throw IllegalAccessException(\"Getter is not available\")\n        set(value) {\n            newRule.setSeverity(value)\n        }\n\n    override var htmlDescription: String\n        get() = throw IllegalAccessException(\"Getter is not available\")\n        set(value) {\n            newRule.setHtmlDescription(value)\n        }\n\n    override var isActivatedByDefault: Boolean\n        get() = throw IllegalAccessException(\"Getter is not available\")\n        set(value) {\n            newRule.setActivatedByDefault(value)\n        }\n\n\n    override fun createParam(fieldKey: String): ZpaRuleParam =\n        SonarQubeRuleParamAdapter(newRule.createParam(fieldKey))\n}\n"
  },
  {
    "path": "sonar-zpa-plugin/src/main/kotlin/com/felipebz/zpa/rules/SonarQubeRuleKeyAdapter.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.rules\n\nimport org.sonar.api.rule.RuleKey\n\nclass SonarQubeRuleKeyAdapter(val ruleKey: RuleKey) : ZpaRuleKey {\n\n    override val rule: String\n        get() = ruleKey.rule()\n\n    override val repository: String\n        get() = ruleKey.repository()\n\n    override fun toString(): String = ruleKey.toString()\n\n    override fun equals(other: Any?): Boolean = ruleKey == (other as SonarQubeRuleKeyAdapter).ruleKey\n\n    override fun hashCode(): Int = ruleKey.hashCode()\n\n    companion object {\n        fun of(repository: String, rule: String): ZpaRuleKey =\n            SonarQubeRuleKeyAdapter(RuleKey.of(repository, rule))\n    }\n\n}\n"
  },
  {
    "path": "sonar-zpa-plugin/src/main/kotlin/com/felipebz/zpa/rules/SonarQubeRuleMetadataLoader.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.rules\n\nimport com.felipebz.zpa.utils.getAnnotation\nimport com.felipebz.zpa.api.annotations.Priority\nimport java.lang.reflect.Field\nimport org.sonar.check.Priority as SonarPriority\nimport org.sonar.check.Rule as SonarRule\nimport org.sonar.check.RuleProperty as SonarRuleProperty\n\nclass SonarQubeRuleMetadataLoader : RuleMetadataLoader() {\n\n    override fun getRuleAnnotation(annotatedClassOrObject: Any): RuleData? {\n        val ruleAnnotation = super.getRuleAnnotation(annotatedClassOrObject)\n        if (ruleAnnotation != null) {\n            return ruleAnnotation\n        }\n\n        val sonarRule = getAnnotation(annotatedClassOrObject, SonarRule::class.java)\n\n        if (sonarRule != null) {\n            val priority = when(sonarRule.priority) {\n                SonarPriority.BLOCKER -> Priority.BLOCKER\n                SonarPriority.CRITICAL -> Priority.CRITICAL\n                SonarPriority.MAJOR -> Priority.MAJOR\n                SonarPriority.MINOR -> Priority.MINOR\n                SonarPriority.INFO -> Priority.INFO\n            }\n            return RuleData(\n                sonarRule.key,\n                sonarRule.name,\n                sonarRule.description,\n                priority,\n                sonarRule.tags,\n                sonarRule.status)\n        }\n\n        return null\n    }\n\n    override fun getRulePropertyAnnotation(field: Field): RulePropertyData? {\n        val rulePropertyAnnotation = super.getRulePropertyAnnotation(field)\n        if (rulePropertyAnnotation != null) {\n            return rulePropertyAnnotation\n        }\n\n        val sonarRuleProperty = field.getAnnotation(SonarRuleProperty::class.java)\n        if (sonarRuleProperty != null) {\n            return RulePropertyData(\n                sonarRuleProperty.key,\n                sonarRuleProperty.description,\n                sonarRuleProperty.defaultValue,\n                sonarRuleProperty.type)\n        }\n\n        return null\n    }\n\n}\n"
  },
  {
    "path": "sonar-zpa-plugin/src/main/kotlin/com/felipebz/zpa/rules/SonarQubeRuleParamAdapter.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.rules\n\nimport org.sonar.api.server.rule.RulesDefinition\n\nclass SonarQubeRuleParamAdapter(private val param: RulesDefinition.NewParam) : ZpaRuleParam {\n    override val key: String\n        get() = param.key()\n\n    override var description: String\n        get() = throw IllegalAccessException(\"Getter is not available\")\n        set(value) {\n            param.setDescription(value)\n        }\n\n    override var defaultValue: String\n        get() = throw IllegalAccessException(\"Getter is not available\")\n        set(value) {\n            param.setDefaultValue(value)\n        }\n\n}\n"
  },
  {
    "path": "sonar-zpa-plugin/src/main/kotlin/com/felipebz/zpa/squid/PlSqlAstScanner.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.squid\n\nimport org.sonar.api.batch.fs.InputFile\nimport org.sonar.api.batch.fs.TextRange\nimport org.sonar.api.batch.measure.Metric\nimport org.sonar.api.batch.sensor.SensorContext\nimport org.sonar.api.batch.sensor.issue.NewIssue\nimport org.sonar.api.batch.sensor.issue.NewIssueLocation\nimport org.sonar.api.issue.NoSonarFilter\nimport org.sonar.api.measures.CoreMetrics\nimport org.sonar.api.measures.FileLinesContextFactory\nimport com.felipebz.zpa.PlSqlChecks\nimport com.felipebz.zpa.checks.IssueLocation\nimport com.felipebz.zpa.highlight.PlSqlHighlighterVisitor\nimport com.felipebz.zpa.metadata.FormsMetadata\nimport com.felipebz.zpa.metrics.CpdVisitor\nimport com.felipebz.zpa.rules.SonarQubeRuleKeyAdapter\nimport com.felipebz.zpa.symbols.ObjectLocator\nimport com.felipebz.zpa.symbols.SonarQubeSymbolTable\nimport com.felipebz.zpa.api.PlSqlFile\nimport com.felipebz.zpa.api.checks.PlSqlVisitor\nimport java.io.Serializable\nimport java.util.concurrent.locks.ReentrantLock\nimport kotlin.concurrent.withLock\n\nclass PlSqlAstScanner(private val context: SensorContext,\n                      checks: Collection<PlSqlVisitor>,\n                      private val noSonarFilter: NoSonarFilter,\n                      formsMetadata: FormsMetadata?,\n                      isErrorRecoveryEnabled: Boolean,\n                      private val fileLinesContextFactory: FileLinesContextFactory?) {\n\n    private val astScanner: AstScanner =\n        AstScanner(checks, formsMetadata, isErrorRecoveryEnabled, context.fileSystem().encoding())\n\n    private lateinit var plsqlChecks: PlSqlChecks\n\n    constructor(context: SensorContext,\n                checks: PlSqlChecks,\n                noSonarFilter: NoSonarFilter,\n                formsMetadata: FormsMetadata?,\n                isErrorRecoveryEnabled: Boolean,\n                fileLinesContextFactory: FileLinesContextFactory,\n                objectLocator: ObjectLocator) : this(context, checks.all(), noSonarFilter, formsMetadata, isErrorRecoveryEnabled, fileLinesContextFactory) {\n        this.plsqlChecks = checks\n        objectLocator.setScope(astScanner.globalScope)\n    }\n\n    fun scanFile(inputFile: InputFile) {\n        val plSqlFile = SonarQubePlSqlFile(inputFile)\n        if (plSqlFile.type() == PlSqlFile.Type.MAIN) {\n            scanMainFile(plSqlFile)\n        } else {\n            scanTestFile(plSqlFile)\n        }\n    }\n\n    private fun scanMainFile(plSqlFile: SonarQubePlSqlFile) {\n        val inputFile = plSqlFile.inputFile\n        val result = try {\n            astScanner.scanFile(\n                plSqlFile,\n                listOf(PlSqlHighlighterVisitor(context, inputFile), CpdVisitor(context, inputFile))\n            )\n        } catch (e: Exception) {\n            e.printStackTrace()\n            throw e\n        }\n\n        noSonarFilter.noSonarInFile(inputFile, result.linesWithNoSonar)\n\n        lock.withLock { // needed because SonarQube 7.6 save this data in a non thread-safe way\n            saveIssues(inputFile, result.issues)\n\n            val symbolSaver = SonarQubeSymbolTable(context, inputFile)\n            symbolSaver.save(result.symbols)\n\n            saveMetricOnFile(inputFile, CoreMetrics.STATEMENTS, result.numberOfStatements)\n            saveMetricOnFile(inputFile, CoreMetrics.NCLOC, result.linesOfCode)\n            saveMetricOnFile(inputFile, CoreMetrics.COMMENT_LINES, result.linesOfComments)\n            saveMetricOnFile(inputFile, CoreMetrics.COMPLEXITY, result.complexity)\n            saveMetricOnFile(inputFile, CoreMetrics.FUNCTIONS, result.numberOfFunctions)\n\n\n            if (fileLinesContextFactory != null) {\n                val fileLinesContext = fileLinesContextFactory.createFor(inputFile)\n                for (line in result.executableLines) {\n                    fileLinesContext.setIntValue(CoreMetrics.EXECUTABLE_LINES_DATA_KEY, line, 1)\n                }\n                fileLinesContext.save()\n            }\n        }\n    }\n\n    private fun scanTestFile(plSqlFile: SonarQubePlSqlFile) {\n        val inputFile = plSqlFile.inputFile\n        val result = astScanner.scanFile(plSqlFile, listOf(PlSqlHighlighterVisitor(context, inputFile)))\n\n        noSonarFilter.noSonarInFile(inputFile, result.linesWithNoSonar)\n\n        lock.withLock { // needed because SonarQube 7.6 save this data in a non thread-safe way\n            saveIssues(inputFile, result.issues)\n\n            val symbolTable = SonarQubeSymbolTable(context, inputFile)\n            symbolTable.save(result.symbols)\n        }\n    }\n\n    private fun saveIssues(inputFile: InputFile, issues: List<ZpaIssue>) {\n        for (issue in issues) {\n            val rule = plsqlChecks.ruleKey(issue.check) as SonarQubeRuleKeyAdapter\n\n            val newIssue = context.newIssue().forRule(rule.ruleKey)\n\n            val cost = issue.cost\n            if (cost != null) {\n                newIssue.gap(cost.toDouble())\n            }\n\n            newIssue.at(newLocation(inputFile, newIssue, issue.primaryLocation))\n\n            for (secondaryLocation in issue.secondaryLocations) {\n                newIssue.addLocation(newLocation(inputFile, newIssue, secondaryLocation))\n            }\n\n            newIssue.save()\n        }\n    }\n\n    private fun <T : Serializable> saveMetricOnFile(inputFile: InputFile, metric: Metric<T>, value: T) {\n        context.newMeasure<T>()\n                .on(inputFile)\n                .forMetric(metric)\n                .withValue(value)\n                .save()\n    }\n\n    private fun newLocation(inputFile: InputFile, issue: NewIssue, location: IssueLocation): NewIssueLocation {\n        val newLocation = issue.newLocation().on(inputFile)\n        if (location.startLine() != IssueLocation.UNDEFINED_LINE) {\n            val range: TextRange = if (location.startLineOffset() == IssueLocation.UNDEFINED_OFFSET) {\n                inputFile.selectLine(location.startLine())\n            } else {\n                inputFile.newRange(location.startLine(), location.startLineOffset(), location.endLine(),\n                        location.endLineOffset())\n            }\n            newLocation.at(range)\n        }\n\n        newLocation.message(location.message())\n        return newLocation\n    }\n\n    companion object {\n        private val lock = ReentrantLock()\n    }\n\n}\n"
  },
  {
    "path": "sonar-zpa-plugin/src/main/kotlin/com/felipebz/zpa/squid/SonarQubePlSqlFile.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.squid\n\nimport org.sonar.api.batch.fs.InputFile\nimport com.felipebz.zpa.api.PlSqlFile\n\nimport java.io.IOException\nimport java.nio.file.Path\nimport kotlin.io.path.toPath\n\nclass SonarQubePlSqlFile(val inputFile: InputFile) : PlSqlFile {\n\n    override fun contents(): String =\n        try {\n            inputFile.contents()\n        } catch (e: IOException) {\n            throw IllegalStateException(\"Could not read contents of input file $inputFile\", e)\n        }\n\n    override fun fileName(): String = inputFile.filename()\n\n    override fun path(): Path = inputFile.uri().toPath()\n\n    override fun type(): PlSqlFile.Type =\n        when (inputFile.type()) {\n            InputFile.Type.MAIN -> PlSqlFile.Type.MAIN\n            InputFile.Type.TEST -> PlSqlFile.Type.TEST\n            else -> PlSqlFile.Type.MAIN\n        }\n\n    override fun toString(): String = inputFile.toString()\n\n}\n"
  },
  {
    "path": "sonar-zpa-plugin/src/main/kotlin/com/felipebz/zpa/symbols/MappedObject.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.symbols\n\nimport com.felipebz.flr.api.AstNodeType\nimport org.sonar.api.batch.fs.InputFile\nimport com.felipebz.zpa.api.PlSqlFile\nimport java.nio.file.Path\n\ndata class MappedObject(\n    val identifier: String,\n    val objectType: AstNodeType,\n    val fileType: PlSqlFile.Type,\n    val path: Path,\n    val inputFile: InputFile,\n    val firstLine: Int = -1,\n    val lastLine: Int = -1\n) {\n    val isMain: Boolean\n        get() = fileType === PlSqlFile.Type.MAIN\n    val isTest: Boolean\n        get() = fileType === PlSqlFile.Type.TEST\n}\n"
  },
  {
    "path": "sonar-zpa-plugin/src/main/kotlin/com/felipebz/zpa/symbols/ObjectLocator.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.symbols\n\nimport com.felipebz.flr.api.AstNodeType\nimport org.sonar.api.scanner.ScannerSide\nimport com.felipebz.zpa.squid.SonarQubePlSqlFile\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.symbols.Scope\n\n@ScannerSide\nclass ObjectLocator {\n    private var scope: Scope = ScopeImpl()\n\n    private val mappedObjects\n        get() = scope.innerScopes\n            .union(scope.innerScopes\n                .flatMap { it.innerScopes }\n                .filter { it.type == PlSqlGrammar.CREATE_PACKAGE_BODY || it.type == PlSqlGrammar.CREATE_TYPE_BODY })\n            .map {\n                val plSqlFile = it.plSqlFile as SonarQubePlSqlFile? ?: return@map null\n                val identifier = it.identifier ?: return@map null\n                val type = it.type ?: return@map null\n                val firstLine = it.firstToken?.line ?: return@map null\n                val lastLine = it.lastToken?.line ?: return@map null\n                MappedObject(\n                    identifier,\n                    type,\n                    plSqlFile.type(),\n                    plSqlFile.path(),\n                    plSqlFile.inputFile,\n                    firstLine,\n                    lastLine\n                )\n            }.filterNotNull()\n\n    fun setScope(scope: Scope) {\n        this.scope = scope\n    }\n\n    fun findMainObject(identifier: String, vararg types: AstNodeType): MappedObject? {\n        return mappedObjects.find { it.isMain && it.identifier.equals(identifier, ignoreCase = true) && it.objectType in types }\n    }\n\n    fun findTestObject(identifier: String, vararg types: AstNodeType): MappedObject? {\n        return mappedObjects.find { it.isTest && it.identifier.equals(identifier, ignoreCase = true) && it.objectType in types }\n    }\n}\n"
  },
  {
    "path": "sonar-zpa-plugin/src/main/kotlin/com/felipebz/zpa/symbols/SonarQubeSymbolTable.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.symbols\n\nimport org.sonar.api.batch.fs.InputFile\nimport org.sonar.api.batch.sensor.SensorContext\nimport org.sonar.api.batch.sensor.symbol.NewSymbolTable\nimport com.felipebz.zpa.api.symbols.Symbol\n\nclass SonarQubeSymbolTable(context: SensorContext, inputFile: InputFile) {\n\n    private val symbolizable: NewSymbolTable = context.newSymbolTable().onFile(inputFile)\n\n    fun save(symbols: List<Symbol>) {\n        for (symbol in symbols) {\n            val symbolNode = symbol.declaration\n\n            val symbolToken = symbolNode.token\n            val newSymbol = symbolizable.newSymbol(symbolToken.line, symbolToken.column,\n                symbolToken.endLine, symbolToken.endColumn)\n\n            for (usage in symbol.usages) {\n                val usageToken = usage.token\n                newSymbol.newReference(usageToken.line, usageToken.column, usageToken.endLine, usageToken.endColumn)\n            }\n        }\n        symbolizable.save()\n    }\n\n}\n"
  },
  {
    "path": "sonar-zpa-plugin/src/main/kotlin/com/felipebz/zpa/utplsql/AbstractReportImporter.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.utplsql\n\nimport org.sonar.api.batch.sensor.SensorContext\nimport org.sonar.api.notifications.AnalysisWarnings\nimport org.sonar.api.utils.WildcardPattern\nimport com.felipebz.zpa.utils.log.Logger\nimport com.felipebz.zpa.utils.log.Loggers\nimport java.io.File\n\nabstract class AbstractReportImporter(private val analysisWarnings: AnalysisWarnings) {\n\n    private val logger: Logger = Loggers.getLogger(AbstractReportImporter::class.java)\n\n    abstract val reportType: String\n    abstract val reportKey: String\n\n    abstract fun processReport(context: SensorContext, report: File)\n\n    fun execute(context: SensorContext) {\n        val reports = files(context)\n\n        for (report in reports) {\n            logger.info(\"Processing $reportType report {}\", report)\n            processReport(context, report)\n        }\n    }\n\n    protected fun files(context: SensorContext) =\n        context.config().getStringArray(reportKey).flatMap {\n            getReports(context, it)\n        }\n\n    private fun getReports(context: SensorContext, reportPath: String): List<File> {\n        val pattern = WildcardPattern.create(reportPath)\n        val baseDir = context.fileSystem().baseDir()\n        val matchingFiles = baseDir\n                .walkTopDown()\n                .filter { it.isFile && pattern.match(it.relativeTo(baseDir).invariantSeparatorsPath) }\n                .toMutableList()\n\n        if (matchingFiles.isEmpty()) {\n            if (context.config().hasKey(reportKey)) {\n                val file = File(reportPath)\n                if (!file.exists()) {\n                    val formattedMessage =\n                        \"No utPLSQL $reportType report was found for ${reportKey} using pattern $reportPath\"\n                    logger.warn(formattedMessage)\n                    analysisWarnings.addUnique(formattedMessage)\n                } else {\n                    matchingFiles.add(file)\n                }\n            } else {\n                logger.info(\"No utPLSQL $reportType report was found for {} using default pattern {}\",\n                    reportKey, reportPath)\n            }\n        }\n        return matchingFiles\n    }\n\n}\n"
  },
  {
    "path": "sonar-zpa-plugin/src/main/kotlin/com/felipebz/zpa/utplsql/CoverageReport.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.utplsql\n\nimport com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper\nimport com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty\nimport com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement\n\n@JacksonXmlRootElement(localName = \"coverage\")\ndata class Coverage @JvmOverloads constructor(\n    @field:JacksonXmlProperty(isAttribute = true, localName = \"version\")\n    var version: Int = 0,\n\n    @field:JacksonXmlElementWrapper(useWrapping = false)\n    @field:JacksonXmlProperty(localName = \"file\")\n    var files: List<CoveredFile>? = null\n)\n\n@JacksonXmlRootElement(localName = \"file\")\ndata class CoveredFile @JvmOverloads constructor(\n    @field:JacksonXmlProperty(isAttribute = true, localName = \"path\")\n    var path: String = \"\",\n\n    @field:JacksonXmlElementWrapper(useWrapping = false)\n    @field:JacksonXmlProperty(localName = \"lineToCover\")\n    var linesToCover: List<LineToCover>? = null\n)\n\n@JacksonXmlRootElement(localName = \"lineToCover\")\ndata class LineToCover @JvmOverloads constructor(\n    @field:JacksonXmlProperty(isAttribute = true, localName = \"lineNumber\")\n    var lineNumber: Int = 0,\n\n    @field:JacksonXmlProperty(isAttribute = true, localName = \"covered\")\n    var covered: Boolean = false,\n\n    @field:JacksonXmlProperty(isAttribute = true, localName = \"branchesToCover\")\n    var branchesToCover: Int? = null,\n\n    @field:JacksonXmlProperty(isAttribute = true, localName = \"coveredBranches\")\n    var coveredBranches: Int? = null\n)\n"
  },
  {
    "path": "sonar-zpa-plugin/src/main/kotlin/com/felipebz/zpa/utplsql/CoverageResultImporter.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.utplsql\n\nimport com.fasterxml.jackson.dataformat.xml.XmlMapper\nimport org.sonar.api.batch.fs.InputFile\nimport org.sonar.api.batch.sensor.SensorContext\nimport org.sonar.api.notifications.AnalysisWarnings\nimport com.felipebz.zpa.symbols.ObjectLocator\nimport com.felipebz.zpa.utils.log.Loggers\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport java.io.File\n\nclass CoverageResultImporter(private val objectLocator: ObjectLocator,\n                             analysisWarnings: AnalysisWarnings) : AbstractReportImporter(analysisWarnings) {\n\n    private val logger = Loggers.getLogger(CoverageResultImporter::class.java)\n    override val reportType = \"coverage\"\n    override val reportKey = UtPlSqlSensor.COVERAGE_REPORT_PATH_KEY\n\n    override fun processReport(context: SensorContext, report: File) {\n        val serializer = XmlMapper()\n        val coverage = serializer.readValue(report, Coverage::class.java)\n\n        coverage.files?.forEach { file ->\n            val filePath = file.path\n            var inputFile = context.fileSystem()\n                .inputFile(context.fileSystem().predicates().hasPath(filePath))\n\n            var lineOffset = 0\n\n            if (inputFile == null) {\n                val objectType = when (filePath.substringBeforeLast(' ')) {\n                    \"package body\" -> PlSqlGrammar.CREATE_PACKAGE_BODY\n                    \"procedure\" -> PlSqlGrammar.CREATE_PROCEDURE\n                    \"function\" -> PlSqlGrammar.CREATE_FUNCTION\n                    \"trigger\" -> PlSqlGrammar.CREATE_TRIGGER\n                    \"type body\" -> PlSqlGrammar.CREATE_TYPE_BODY\n                    else -> error(\"Unknown object type for file \\\"$filePath\\\"\")\n                }\n                val objectName = filePath.substringAfterLast('.')\n\n                val mappedObject = objectLocator.findMainObject(objectName, objectType)\n                if (mappedObject != null) {\n                    inputFile = mappedObject.inputFile\n                    lineOffset = mappedObject.firstLine - 1\n                }\n            }\n\n            if (inputFile != null) {\n                logger.debug(\"The path ${file.path} was mapped to ${inputFile}\")\n                saveCoverage(context, inputFile, file, lineOffset, filePath)\n            } else {\n                logger.warn(\"The path ${file.path} was not found in the project\")\n            }\n        }\n    }\n\n    private fun saveCoverage(\n        context: SensorContext,\n        inputFile: InputFile,\n        file: CoveredFile,\n        lineOffset: Int,\n        filePath: String\n    ) {\n        val linesToCover = file.linesToCover\n        if (linesToCover != null) {\n            if (linesToCover.all { !it.covered }) {\n                // No need to save coverage for files with no covered lines\n                return\n            }\n\n            val newCoverage = context.newCoverage().onFile(inputFile)\n\n            file.linesToCover?.forEach { line ->\n                val lineNumber = line.lineNumber + lineOffset\n                newCoverage.lineHits(lineNumber, if (line.covered) 1 else 0)\n\n                val branchesToCover = line.branchesToCover\n                val coveredBranches = line.coveredBranches ?: 0\n                if (branchesToCover != null) {\n                    check(coveredBranches <= branchesToCover) {\n                        \"\\\"coveredBranches\\\" should not be greater than \\\"branchesToCover\\\" on line \" +\n                            \"${line.lineNumber} for file \\\"$filePath\\\"\"\n                    }\n\n                    newCoverage.conditions(lineNumber, branchesToCover, coveredBranches)\n                }\n            }\n\n            newCoverage.save()\n        }\n    }\n\n\n}\n"
  },
  {
    "path": "sonar-zpa-plugin/src/main/kotlin/com/felipebz/zpa/utplsql/TestExecutionReport.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.utplsql\n\nimport com.fasterxml.jackson.annotation.JsonIgnoreProperties\nimport com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper\nimport com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty\nimport com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement\n\n@JacksonXmlRootElement(localName = \"testExecutions\")\ndata class TestExecutions @JvmOverloads constructor(\n    @field:JacksonXmlProperty(isAttribute = true, localName = \"version\")\n    var version: Int = 0,\n\n    @field:JacksonXmlElementWrapper(useWrapping = false)\n    @field:JacksonXmlProperty(localName = \"file\")\n    var files: List<TestFile>? = null\n)\n\n@JacksonXmlRootElement(localName = \"file\")\ndata class TestFile @JvmOverloads constructor(\n    @field:JacksonXmlProperty(isAttribute = true, localName = \"path\")\n    var path: String = \"\",\n\n    @field:JacksonXmlElementWrapper(useWrapping = false)\n    @field:JacksonXmlProperty(localName = \"testCase\")\n    var testCases: List<TestCase>? = null\n)\n\n@JacksonXmlRootElement(localName = \"testCase\")\ndata class TestCase @JvmOverloads constructor(\n    @field:JacksonXmlProperty(isAttribute = true, localName = \"name\")\n    var name: String = \"\",\n\n    @field:JacksonXmlProperty(isAttribute = true, localName = \"duration\")\n    var duration: Long = 0,\n\n    @field:JacksonXmlProperty(localName = \"skipped\")\n    var skipped: Skipped? = null,\n\n    @field:JacksonXmlProperty(localName = \"failure\")\n    var failure: Failure? = null,\n\n    @field:JacksonXmlProperty(localName = \"error\")\n    var error: Error? = null\n) {\n    val status: TestCaseStatus\n        get() {\n            return when {\n                skipped != null -> TestCaseStatus.SKIPPED\n                failure != null -> TestCaseStatus.FAILED\n                error != null -> TestCaseStatus.ERROR\n                else -> TestCaseStatus.PASSED\n            }\n        }\n}\n\n@JacksonXmlRootElement(localName = \"skipped\")\n@JsonIgnoreProperties(ignoreUnknown = true)\nclass Skipped\n\n@JacksonXmlRootElement(localName = \"failure\")\n@JsonIgnoreProperties(ignoreUnknown = true)\nclass Failure\n\n@JacksonXmlRootElement(localName = \"error\")\n@JsonIgnoreProperties(ignoreUnknown = true)\nclass Error\n\nenum class TestCaseStatus {\n    PASSED,\n    FAILED,\n    SKIPPED,\n    ERROR\n}\n"
  },
  {
    "path": "sonar-zpa-plugin/src/main/kotlin/com/felipebz/zpa/utplsql/TestResultImporter.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.utplsql\n\nimport com.fasterxml.jackson.dataformat.xml.XmlMapper\nimport org.sonar.api.batch.fs.InputFile\nimport org.sonar.api.batch.measure.Metric\nimport org.sonar.api.batch.sensor.SensorContext\nimport org.sonar.api.measures.CoreMetrics\nimport org.sonar.api.notifications.AnalysisWarnings\nimport com.felipebz.zpa.symbols.ObjectLocator\nimport com.felipebz.zpa.utils.log.Loggers\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport java.io.File\nimport java.io.Serializable\n\nclass TestResultImporter(private val objectLocator: ObjectLocator,\n                         analysisWarnings: AnalysisWarnings) : AbstractReportImporter(analysisWarnings) {\n\n    private val logger = Loggers.getLogger(TestResultImporter::class.java)\n    override val reportType = \"test\"\n    override val reportKey = UtPlSqlSensor.TEST_REPORT_PATH_KEY\n\n    override fun processReport(context: SensorContext, report: File) {\n        val serializer = XmlMapper()\n        val testExecutions = serializer.readValue(report, TestExecutions::class.java)\n\n        testExecutions.files?.forEach { file ->\n            val packageName = file.path.substringAfterLast('.')\n            val mappedTest = objectLocator.findTestObject(packageName, PlSqlGrammar.CREATE_PACKAGE)\n            val inputFile = mappedTest?.inputFile ?: context.fileSystem()\n                .inputFile(context.fileSystem().predicates().hasPath(file.path))\n\n            if (inputFile != null) {\n                logger.debug(\"The path ${file.path} was mapped to ${inputFile}\")\n                file.testCases?.let { testCase ->\n                    val testCount = testCase.count { it.status != TestCaseStatus.SKIPPED }\n                    val failureCount = testCase.count { it.status == TestCaseStatus.FAILED }\n                    val errorCount = testCase.count { it.status == TestCaseStatus.ERROR }\n                    val skippedCount = testCase.count { it.status == TestCaseStatus.SKIPPED }\n                    val duration = testCase.sumOf { it.duration }\n\n                    saveMetricOnFile(context, inputFile, CoreMetrics.TESTS, testCount)\n                    saveMetricOnFile(context, inputFile, CoreMetrics.TEST_FAILURES, failureCount)\n                    saveMetricOnFile(context, inputFile, CoreMetrics.TEST_ERRORS, errorCount)\n                    saveMetricOnFile(context, inputFile, CoreMetrics.SKIPPED_TESTS, skippedCount)\n                    saveMetricOnFile(context, inputFile, CoreMetrics.TEST_EXECUTION_TIME, duration)\n                }\n            } else {\n                logger.warn(\"The path ${file.path} was not found in the project\")\n            }\n        }\n    }\n\n    private fun <T : Serializable> saveMetricOnFile(\n        context: SensorContext,\n        inputFile: InputFile,\n        metric: Metric<T>,\n        value: T\n    ) {\n        context.newMeasure<T>()\n            .on(inputFile)\n            .forMetric(metric)\n            .withValue(value)\n            .save()\n    }\n\n}\n"
  },
  {
    "path": "sonar-zpa-plugin/src/main/kotlin/com/felipebz/zpa/utplsql/UtPlSqlSensor.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.utplsql\n\nimport org.sonar.api.batch.sensor.Sensor\nimport org.sonar.api.batch.sensor.SensorContext\nimport org.sonar.api.batch.sensor.SensorDescriptor\nimport org.sonar.api.notifications.AnalysisWarnings\nimport com.felipebz.zpa.PlSql\nimport com.felipebz.zpa.symbols.ObjectLocator\n\nclass UtPlSqlSensor(objectLocator: ObjectLocator, analysisWarnings: AnalysisWarnings) : Sensor {\n\n    private val testResultImporter = TestResultImporter(objectLocator, analysisWarnings)\n    private val coverageResultImporter = CoverageResultImporter(objectLocator, analysisWarnings)\n\n    override fun describe(descriptor: SensorDescriptor) {\n        descriptor.name(\"ZPA - utPLSQL Report Importer\").onlyOnLanguage(PlSql.KEY)\n    }\n\n    override fun execute(context: SensorContext) {\n        testResultImporter.execute(context)\n        coverageResultImporter.execute(context)\n    }\n\n    companion object {\n        const val TEST_REPORT_PATH_KEY = \"sonar.zpa.tests.reportPaths\"\n        const val DEFAULT_TEST_REPORT_PATH = \"utplsql-test.xml\"\n        const val COVERAGE_REPORT_PATH_KEY = \"sonar.zpa.coverage.reportPaths\"\n        const val DEFAULT_COVERAGE_REPORT_PATH = \"utplsql-coverage.xml\"\n    }\n\n}\n"
  },
  {
    "path": "sonar-zpa-plugin/src/test/kotlin/com/felipebz/zpa/CustomAnnotationBasedRulesDefinitionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa\n\nimport org.assertj.core.api.Assertions.*\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport org.sonar.api.server.debt.DebtRemediationFunction.Type\nimport org.sonar.api.server.rule.RulesDefinition\nimport org.sonar.api.server.rule.RulesDefinition.*\nimport org.sonar.check.Rule\nimport org.sonar.check.RuleProperty\nimport com.felipebz.zpa.rules.SonarQubeRepositoryAdapter\nimport com.felipebz.zpa.rules.SonarQubeRuleMetadataLoader\nimport com.felipebz.zpa.api.annotations.ConstantRemediation\nimport java.util.*\n\nclass CustomAnnotationBasedRulesDefinitionTest {\n\n    private val context = Context()\n\n    @BeforeEach\n    fun setup() {\n        Locale.setDefault(Locale.ROOT)\n    }\n\n    @Test\n    fun noClassToAdd() {\n        assertThat(buildRepository().rules()).isEmpty()\n    }\n\n    @Test\n    fun classWithoutRuleAnnotation() {\n        class NotRuleClass\n        assertThatIllegalArgumentException().isThrownBy {\n            buildSingleRuleRepository(NotRuleClass::class.java)\n        }\n    }\n\n    @Test\n    fun ruleAnnotationData() {\n        @Rule(key = \"key1\", name = \"name1\", description = \"description1\", tags = [\"mytag\"])\n        class RuleClass {\n            @RuleProperty(key = \"param1Key\", description = \"param1 description\")\n            var param1 = \"x\"\n        }\n\n        val rule = buildSingleRuleRepository(RuleClass::class.java)\n        assertThat(rule.key()).isEqualTo(\"key1\")\n        assertThat(rule.name()).isEqualTo(\"name1\")\n        assertThat(rule.htmlDescription()).isEqualTo(\"description1\")\n        assertThat(rule.tags()).containsOnly(\"mytag\")\n        assertThat(rule.template()).isFalse\n        assertThat(rule.params()).hasSize(1)\n        assertParam(rule.params()[0], \"param1Key\", \"param1 description\")\n    }\n\n    @Rule(name = \"name1\", description = \"description1\")\n    internal class RuleClassWithoutAnnotationDefinedKey\n\n    @Test\n    fun ruleWithoutExplicitKeyCanBeAcceptable() {\n        val repository = buildRepository(LANGUAGE_KEY_WITH_RESOURCE_BUNDLE, RuleClassWithoutAnnotationDefinedKey::class.java)\n        val rule = repository.rules()[0]\n        assertThat(rule.key()).isEqualTo(RuleClassWithoutAnnotationDefinedKey::class.java.simpleName)\n        assertThat(rule.name()).isEqualTo(\"name1\")\n    }\n\n    @Test\n    fun externalNamesAndDescriptions() {\n        @Rule(key = \"ruleWithExternalInfo\")\n        class RuleClass {\n            @RuleProperty(key = \"param1Key\")\n            var param1 = \"x\"\n            @RuleProperty\n            var param2 = \"x\"\n        }\n\n        val rule = buildSingleRuleRepository(RuleClass::class.java)\n        assertThat(rule.key()).isEqualTo(\"ruleWithExternalInfo\")\n        assertThat(rule.name()).isEqualTo(\"external name for ruleWithExternalInfo\")\n        assertThat(rule.htmlDescription()).isEqualTo(\"description for ruleWithExternalInfo\")\n        assertThat(rule.params()).hasSize(2)\n        assertParam(rule.params()[0], \"param1Key\", \"description for param1\")\n        assertParam(rule.params()[1], \"param2\", null)\n    }\n\n    @Test\n    fun classWithSqaleConstantRemediation() {\n        @Rule(key = \"key1\", name = \"name1\", description = \"description1\")\n        @ConstantRemediation(\"10min\")\n        class RuleClass\n\n        val rule = buildSingleRuleRepository(RuleClass::class.java)\n        assertRemediation(rule, Type.CONSTANT_ISSUE, null, \"10min\", null)\n    }\n\n    @Test\n    fun invalidSqaleAnnotation() {\n        @Rule(key = \"key1\", name = \"name1\", description = \"description1\")\n        @ConstantRemediation(\"xxx\")\n        class MyInvalidRuleClass\n\n        assertThatIllegalArgumentException().isThrownBy {\n            buildSingleRuleRepository(MyInvalidRuleClass::class.java)\n        }\n    }\n\n    @Test\n    fun loadMethodWithClassWithSqaleAnnotations() {\n        @Rule(key = \"key1\", name = \"name1\", description = \"description1\")\n        @ConstantRemediation(\"10min\")\n        class RuleClass\n\n        val repository = load(RuleClass::class.java)\n        assertThat(repository.rules()).hasSize(1)\n    }\n\n    private fun assertRemediation(rule: RulesDefinition.Rule, type: Type, gapMultiplier: String?, baseEffort: String, gapDescription: String?) {\n        val remediationFunction = rule.debtRemediationFunction()\n        assertThat(remediationFunction?.type()).isEqualTo(type)\n        assertThat(remediationFunction?.gapMultiplier()).isEqualTo(gapMultiplier)\n        assertThat(remediationFunction?.baseEffort()).isEqualTo(baseEffort)\n        assertThat(rule.gapDescription()).isEqualTo(gapDescription)\n    }\n\n    private fun assertParam(param: Param, expectedKey: String, expectedDescription: String?) {\n        assertThat(param.key()).isEqualTo(expectedKey)\n        assertThat(param.name()).isEqualTo(expectedKey)\n        assertThat(param.description()).isEqualTo(expectedDescription)\n    }\n\n    private fun buildSingleRuleRepository(ruleClass: Class<*>): RulesDefinition.Rule {\n        val repository = buildRepository(ruleClass)\n        assertThat(repository.rules()).hasSize(1)\n        return repository.rules()[0]\n    }\n\n    private fun buildRepository(vararg classes: Class<*>): Repository {\n        return buildRepository(LANGUAGE_KEY_WITH_RESOURCE_BUNDLE, *classes)\n    }\n\n    private fun buildRepository(languageKey: String, vararg classes: Class<*>): Repository {\n        val newRepository = createRepository(languageKey)\n        CustomAnnotationBasedRulesDefinition(\n            SonarQubeRepositoryAdapter(newRepository),\n            languageKey,\n            SonarQubeRuleMetadataLoader()\n        )\n                .addRuleClasses(classes.toList())\n        newRepository.done()\n        return context.repository(REPO_KEY) ?: fail(\"Should build a repository\")\n    }\n\n    private fun load(vararg classes: Class<*>): Repository {\n        val languageKey = LANGUAGE_KEY_WITH_RESOURCE_BUNDLE\n        val newRepository = createRepository(languageKey)\n        CustomAnnotationBasedRulesDefinition.load(SonarQubeRepositoryAdapter(newRepository), languageKey, classes.toList(), SonarQubeRuleMetadataLoader())\n        newRepository.done()\n        return context.repository(REPO_KEY) ?: fail(\"Should build a repository\")\n    }\n\n    private fun createRepository(languageKey: String): NewRepository {\n        return context.createRepository(REPO_KEY, languageKey)\n    }\n\n    companion object {\n        private const val REPO_KEY = \"plsql\"\n        private const val LANGUAGE_KEY_WITH_RESOURCE_BUNDLE = \"languageKey\"\n    }\n\n}\n"
  },
  {
    "path": "sonar-zpa-plugin/src/test/kotlin/com/felipebz/zpa/PlSqlChecksTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.assertj.core.api.Assertions.fail\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport org.sonar.api.batch.rule.internal.ActiveRulesBuilder\nimport org.sonar.api.batch.rule.internal.NewActiveRule\nimport org.sonar.api.rule.RuleKey\nimport org.sonar.api.server.rule.RulesDefinition\nimport org.sonar.check.Rule\nimport com.felipebz.zpa.rules.SonarQubeActiveRulesAdapter\nimport com.felipebz.zpa.rules.SonarQubeRuleKeyAdapter\nimport com.felipebz.zpa.rules.SonarQubeRuleMetadataLoader\nimport com.felipebz.zpa.api.CustomPlSqlRulesDefinition\nimport com.felipebz.zpa.api.checks.PlSqlCheck\nimport com.felipebz.zpa.api.checks.PlSqlVisitor\n\nclass PlSqlChecksTest {\n\n    private lateinit var activeRules: SonarQubeActiveRulesAdapter\n    private lateinit var customRulesDefinition: MyCustomPlSqlRulesDefinition\n    private val ruleMetadataLoader = SonarQubeRuleMetadataLoader()\n\n    @BeforeEach\n    fun setUp() {\n        activeRules = SonarQubeActiveRulesAdapter(ActiveRulesBuilder()\n                .addRule(NewActiveRule.Builder().setRuleKey(RuleKey.of(DEFAULT_REPOSITORY_KEY, DEFAULT_RULE_KEY)).build())\n                .addRule(NewActiveRule.Builder().setRuleKey(RuleKey.of(CUSTOM_REPOSITORY_KEY, CUSTOM_RULE_KEY)).build())\n                .build())\n\n        customRulesDefinition = MyCustomPlSqlRulesDefinition()\n        val context = RulesDefinition.Context()\n        customRulesDefinition.define(context)\n    }\n\n    @Test\n    fun shouldReturnDefaultChecks() {\n        val checks = PlSqlChecks.createPlSqlCheck(activeRules, ruleMetadataLoader)\n        checks.addChecks(DEFAULT_REPOSITORY_KEY, listOf(MyRule::class.java))\n\n        val defaultVisitor = visitor(checks, DEFAULT_REPOSITORY_KEY, DEFAULT_RULE_KEY)\n\n        assertThat(checks.all()).hasSize(1)\n        assertThat(checks.ruleKey(defaultVisitor)).isNotNull\n        assertThat(checks.ruleKey(defaultVisitor)?.rule).isEqualTo(DEFAULT_RULE_KEY)\n        assertThat(checks.ruleKey(defaultVisitor)?.repository).isEqualTo(DEFAULT_REPOSITORY_KEY)\n    }\n\n    @Test\n    fun shouldReturnCustomChecks() {\n        val checks = PlSqlChecks.createPlSqlCheck(activeRules, ruleMetadataLoader)\n        checks.addCustomChecks(arrayOf(customRulesDefinition))\n\n        val customVisitor = visitor(checks, CUSTOM_REPOSITORY_KEY, CUSTOM_RULE_KEY)\n\n        assertThat(checks.all()).hasSize(1)\n        assertThat(checks.ruleKey(customVisitor)).isNotNull\n        assertThat(checks.ruleKey(customVisitor)?.rule).isEqualTo(CUSTOM_RULE_KEY)\n        assertThat(checks.ruleKey(customVisitor)?.repository).isEqualTo(CUSTOM_REPOSITORY_KEY)\n    }\n\n    @Test\n    fun shouldWorkWithoutCustomChecks() {\n        val checks = PlSqlChecks.createPlSqlCheck(activeRules, ruleMetadataLoader)\n        checks.addCustomChecks(null)\n        assertThat(checks.all()).hasSize(0)\n    }\n\n    @Test\n    fun shouldNotReturnRuleKeyIfCheckDoesNotExists() {\n        val checks = PlSqlChecks.createPlSqlCheck(activeRules, ruleMetadataLoader)\n        checks.addChecks(DEFAULT_REPOSITORY_KEY, listOf(MyRule::class.java))\n\n        assertThat(checks.ruleKey(MyCustomRule())).isNull()\n    }\n\n    private fun visitor(plSqlChecks: PlSqlChecks, repository: String, rule: String): PlSqlVisitor {\n        val key = SonarQubeRuleKeyAdapter.of(repository, rule)\n\n        var visitor: PlSqlVisitor? = null\n\n        for (checks in plSqlChecks.checks) {\n            visitor = checks.of(key)\n\n            if (visitor != null) {\n                return visitor\n            }\n        }\n        return visitor ?: fail(\"Should return a visitor.\")\n    }\n\n    @Rule(key = DEFAULT_RULE_KEY, name = \"This is the default rules\", description = \"desc\")\n    class MyRule : PlSqlCheck()\n\n    @Rule(key = CUSTOM_RULE_KEY, name = \"This is a custom rules\", description = \"desc\")\n    class MyCustomRule : PlSqlCheck()\n\n    class MyCustomPlSqlRulesDefinition : CustomPlSqlRulesDefinition() {\n        override fun repositoryName(): String {\n            return \"Custom Rule Repository\"\n        }\n\n        override fun repositoryKey(): String {\n            return CUSTOM_REPOSITORY_KEY\n        }\n\n        override fun checkClasses(): Array<Class<*>> {\n            return arrayOf(MyCustomRule::class.java)\n        }\n    }\n\n    companion object {\n        private const val DEFAULT_REPOSITORY_KEY = \"DefaultRuleRepository\"\n        private const val DEFAULT_RULE_KEY = \"MyRule\"\n        private const val CUSTOM_REPOSITORY_KEY = \"CustomRuleRepository\"\n        private const val CUSTOM_RULE_KEY = \"MyCustomRule\"\n    }\n}\n"
  },
  {
    "path": "sonar-zpa-plugin/src/test/kotlin/com/felipebz/zpa/PlSqlPluginTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa\n\nimport org.assertj.core.api.Assertions.assertThat\n\nimport org.junit.jupiter.api.Test\nimport org.sonar.api.Plugin\nimport org.sonar.api.SonarEdition\nimport org.sonar.api.SonarQubeSide\nimport org.sonar.api.internal.SonarRuntimeImpl\nimport org.sonar.api.utils.Version\n\nclass PlSqlPluginTest {\n\n    @Test\n    fun testGetExtensions() {\n        val context = Plugin.Context(SonarRuntimeImpl.forSonarQube(Version.create(6, 0), SonarQubeSide.SERVER, SonarEdition.COMMUNITY))\n        val plugin = PlSqlPlugin()\n        plugin.define(context)\n        assertThat(context.extensions).hasSize(12)\n    }\n\n}\n"
  },
  {
    "path": "sonar-zpa-plugin/src/test/kotlin/com/felipebz/zpa/PlSqlProfileTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.sonar.api.server.profile.BuiltInQualityProfilesDefinition.Context\nimport com.felipebz.zpa.checks.CheckList\n\nclass PlSqlProfileTest {\n\n    @Test\n    fun should_create_sonar_way_profile() {\n        val context = Context()\n\n        val definition = PlSqlProfile()\n        definition.define(context)\n\n        val profile = context.profile(PlSql.KEY, CheckList.SONAR_WAY_PROFILE)\n        assertThat(profile).isNotNull\n\n        val activeRules = profile.rules()\n        assertThat(activeRules.size).isGreaterThan(40)\n    }\n\n}\n"
  },
  {
    "path": "sonar-zpa-plugin/src/test/kotlin/com/felipebz/zpa/PlSqlSquidSensorTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport org.mockito.Mockito.*\nimport org.sonar.api.batch.fs.InputFile\nimport org.sonar.api.batch.fs.internal.TestInputFileBuilder\nimport org.sonar.api.batch.rule.internal.ActiveRulesBuilder\nimport org.sonar.api.batch.rule.internal.NewActiveRule\nimport org.sonar.api.batch.sensor.highlighting.TypeOfText\nimport org.sonar.api.batch.sensor.internal.DefaultSensorDescriptor\nimport org.sonar.api.batch.sensor.internal.SensorContextTester\nimport org.sonar.api.config.internal.MapSettings\nimport org.sonar.api.issue.NoSonarFilter\nimport org.sonar.api.measures.CoreMetrics\nimport org.sonar.api.measures.FileLinesContext\nimport org.sonar.api.measures.FileLinesContextFactory\nimport org.sonar.api.rule.RuleKey\nimport com.felipebz.zpa.symbols.ObjectLocator\nimport java.io.File\nimport java.nio.charset.StandardCharsets\nimport java.nio.file.Paths\n\nclass PlSqlSquidSensorTest {\n\n    private lateinit var sensor: PlSqlSquidSensor\n    private lateinit var context: SensorContextTester\n    private lateinit var fileLinesContext: FileLinesContext\n\n    @BeforeEach\n    fun setUp() {\n        val activeRules = ActiveRulesBuilder()\n                .addRule(NewActiveRule.Builder()\n                    .setRuleKey(RuleKey.of(PlSqlRuleRepository.KEY, \"EmptyBlock\"))\n                    .setName(\"Print Statement Usage\").build())\n                .build()\n        context = SensorContextTester.create(File(\".\"))\n\n        val fileLinesContextFactory = mock(FileLinesContextFactory::class.java)\n        fileLinesContext = mock(FileLinesContext::class.java)\n        `when`(fileLinesContextFactory.createFor(any(InputFile::class.java))).thenReturn(fileLinesContext)\n\n        sensor = PlSqlSquidSensor(\n            activeRules,\n            MapSettings().asConfig(),\n            mock(NoSonarFilter::class.java),\n            fileLinesContextFactory,\n            null,\n            ObjectLocator()\n        )\n    }\n\n    @Test\n    fun testDescriptor() {\n        val descriptor = DefaultSensorDescriptor()\n        sensor.describe(descriptor)\n        assertThat(descriptor.name()).isEqualTo(\"ZPA\")\n        assertThat(descriptor.languages()).containsOnly(PlSql.KEY)\n    }\n\n    @Test\n    fun shouldAnalyse() {\n        val relativePath = \"src/test/resources/com/felipebz/zpa/code.sql\"\n        val inputFile = TestInputFileBuilder(\"key\", relativePath)\n                .setLanguage(PlSql.KEY)\n                .setCharset(StandardCharsets.UTF_8)\n                .initMetadata(File(relativePath).readText())\n                .setModuleBaseDir(Paths.get(\"\"))\n                .build()\n\n        context.fileSystem().add(inputFile)\n\n        sensor.execute(context)\n\n        val key = inputFile.key()\n\n        //assertThat(context.measure(key, CoreMetrics.FILES).value()).isEqualTo(1);\n        assertThat(context.measure(key, CoreMetrics.NCLOC).value()).isEqualTo(18)\n        assertThat(context.measure(key, CoreMetrics.COMMENT_LINES).value()).isEqualTo(4)\n        assertThat(context.measure(key, CoreMetrics.COMPLEXITY).value()).isEqualTo(6)\n        assertThat(context.measure(key, CoreMetrics.FUNCTIONS).value()).isEqualTo(2)\n        assertThat(context.measure(key, CoreMetrics.STATEMENTS).value()).isEqualTo(7)\n        verify(fileLinesContext, times(7))\n            .setIntValue(eq(CoreMetrics.EXECUTABLE_LINES_DATA_KEY), anyInt(), eq(1))\n        verify(fileLinesContext).save()\n    }\n\n    @Test\n    fun shouldAnalyseTestFile() {\n        val relativePath = \"src/test/resources/com/felipebz/zpa/test.sql\"\n        val inputFile = TestInputFileBuilder(\"key\", relativePath)\n                .setLanguage(PlSql.KEY)\n                .setType(InputFile.Type.TEST)\n                .setCharset(StandardCharsets.UTF_8)\n                .initMetadata(File(relativePath).readText())\n                .setModuleBaseDir(Paths.get(\"\"))\n                .build()\n\n        context.fileSystem().add(inputFile)\n\n        sensor.execute(context)\n\n        val key = inputFile.key()\n\n        // shouldn't save metrics for test files\n        assertThat(context.measure(key, CoreMetrics.NCLOC)).isNull()\n        assertThat(context.measure(key, CoreMetrics.COMMENT_LINES)).isNull()\n        assertThat(context.measure(key, CoreMetrics.COMPLEXITY)).isNull()\n        assertThat(context.measure(key, CoreMetrics.FUNCTIONS)).isNull()\n        assertThat(context.measure(key, CoreMetrics.STATEMENTS)).isNull()\n        verifyNoInteractions(fileLinesContext)\n\n        // but should save highlighting data\n        assertThat(context.highlightingTypeAt(key, 1, lineOffset(1))).containsExactly(TypeOfText.KEYWORD)\n        assertThat(context.highlightingTypeAt(key, 2, lineOffset(3))).containsExactly(TypeOfText.COMMENT)\n        assertThat(context.highlightingTypeAt(key, 3, lineOffset(3))).containsExactly(TypeOfText.STRUCTURED_COMMENT)\n        assertThat(context.highlightingTypeAt(key, 6, lineOffset(8))).containsExactly(TypeOfText.STRING)\n        assertThat(context.highlightingTypeAt(key, 7, lineOffset(1))).containsExactly(TypeOfText.KEYWORD)\n    }\n\n    private fun lineOffset(offset: Int): Int {\n        return offset - 1\n    }\n\n}\n"
  },
  {
    "path": "sonar-zpa-plugin/src/test/kotlin/com/felipebz/zpa/PlSqlTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.sonar.api.config.internal.MapSettings\n\nclass PlSqlTest {\n\n    @Test\n    fun test() {\n        val language = PlSql(MapSettings().asConfig())\n        assertThat(language.key).isEqualTo(\"plsqlopen\")\n        assertThat(language.name).isEqualTo(\"PL/SQL (ZPA)\")\n        assertThat(language.fileSuffixes)\n                .hasSize(4)\n                .contains(\"sql\")\n                .contains(\"pkg\")\n                .contains(\"pks\")\n                .contains(\"pkb\")\n    }\n\n    @Test\n    fun custom_file_suffixes() {\n        val settings = MapSettings()\n        settings.setProperty(PlSqlPlugin.FILE_SUFFIXES_KEY, \"sql, custom\")\n\n        val language = PlSql(settings.asConfig())\n        assertThat(language.fileSuffixes).hasSize(2).contains(\"custom\")\n    }\n\n}\n"
  },
  {
    "path": "sonar-zpa-plugin/src/test/kotlin/com/felipebz/zpa/api/CustomPlSqlRulesDefinitionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.sonar.api.server.rule.RulesDefinition\nimport org.sonar.check.Rule\nimport org.sonar.check.RuleProperty\nimport com.felipebz.zpa.api.checks.PlSqlCheck\n\nclass CustomPlSqlRulesDefinitionTest {\n\n    @Test\n    fun test() {\n        val rulesDefinition = MyCustomPlSqlRulesDefinition()\n        val context = RulesDefinition.Context()\n        rulesDefinition.define(context)\n        val repository = context.repository(REPOSITORY_KEY)\n        checkNotNull(repository)\n\n        assertThat(repository.name()).isEqualTo(REPOSITORY_NAME)\n        assertThat(repository.language()).isEqualTo(\"plsqlopen\")\n        assertThat(repository.rules()).hasSize(1)\n\n        val alertUseRule = repository.rule(RULE_KEY)\n        assertThat(alertUseRule).isNotNull\n        assertThat(alertUseRule?.name()).isEqualTo(RULE_NAME)\n\n        for (rule in repository.rules()) {\n            for (param in rule.params()) {\n                assertThat(param.description()).`as`(\"description for \" + param.key()).isNotEmpty\n            }\n        }\n    }\n\n    @Rule(key = RULE_KEY, name = RULE_NAME, description = \"desc\", tags = [\"bug\"])\n    inner class MyCustomRule : PlSqlCheck() {\n        @RuleProperty(key = \"customParam\", description = \"Custom parameter\", defaultValue = \"value\")\n        var customParam = \"value\"\n    }\n\n    class MyCustomPlSqlRulesDefinition : CustomPlSqlRulesDefinition() {\n        override fun repositoryName(): String {\n            return REPOSITORY_NAME\n        }\n\n        override fun repositoryKey(): String {\n            return REPOSITORY_KEY\n        }\n\n        override fun checkClasses(): Array<Class<*>> {\n            return arrayOf(MyCustomRule::class.java)\n        }\n    }\n\n    companion object {\n        private const val REPOSITORY_NAME = \"Custom Rule Repository\"\n        private const val REPOSITORY_KEY = \"CustomRuleRepository\"\n\n        private const val RULE_NAME = \"This is my custom rule\"\n        private const val RULE_KEY = \"MyCustomRule\"\n    }\n}\n"
  },
  {
    "path": "sonar-zpa-plugin/src/test/kotlin/com/felipebz/zpa/highlight/PlSqlHighlighterVisitorTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.highlight\n\nimport com.felipebz.zpa.TestPlSqlVisitorRunner\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.io.TempDir\nimport org.sonar.api.batch.fs.internal.TestInputFileBuilder\nimport org.sonar.api.batch.sensor.highlighting.TypeOfText\nimport org.sonar.api.batch.sensor.internal.SensorContextTester\nimport java.io.File\nimport java.nio.charset.StandardCharsets\n\nclass PlSqlHighlighterVisitorTest {\n\n    @Test\n    fun shouldAnalyse_lf(@TempDir dir: File) {\n        verifyHighlighting(dir, \"\\n\")\n    }\n\n    @Test\n    fun shouldAnalyse_crlf(@TempDir dir: File) {\n        verifyHighlighting(dir, \"\\r\\n\")\n    }\n\n    @Test\n    fun shouldAnalyse_cr(@TempDir dir: File) {\n        verifyHighlighting(dir, \"\\r\")\n    }\n\n    private fun verifyHighlighting(baseDir: File, eol: String) {\n        val file = File(baseDir, \"test.sql\")\n        val content = File(\"src/test/resources/highlight/highlight.sql\")\n            .readText()\n            .replace(\"\\r\\n\", \"\\n\")\n            .replace(\"\\n\", eol)\n        file.writeText(content)\n\n        val inputFile = TestInputFileBuilder(\"key\", \"test.sql\")\n                .setLanguage(\"plsqlopen\")\n                .setCharset(StandardCharsets.UTF_8)\n                .initMetadata(content)\n                .setModuleBaseDir(baseDir.toPath())\n                .build()\n\n        val context = SensorContextTester.create(baseDir)\n        context.fileSystem().add(inputFile)\n\n        val visitor = PlSqlHighlighterVisitor(context, inputFile)\n        TestPlSqlVisitorRunner.scanFile(file, null, visitor)\n\n        val key = inputFile.key()\n        assertThat(context.highlightingTypeAt(key, 1, lineOffset(1))).containsExactly(TypeOfText.KEYWORD)\n        assertThat(context.highlightingTypeAt(key, 2, lineOffset(3))).containsExactly(TypeOfText.COMMENT)\n        assertThat(context.highlightingTypeAt(key, 3, lineOffset(3))).containsExactly(TypeOfText.STRUCTURED_COMMENT)\n        assertThat(context.highlightingTypeAt(key, 6, lineOffset(8))).containsExactly(TypeOfText.STRING)\n        assertThat(context.highlightingTypeAt(key, 7, lineOffset(1))).containsExactly(TypeOfText.KEYWORD)\n    }\n\n    private fun lineOffset(offset: Int): Int {\n        return offset - 1\n    }\n}\n"
  },
  {
    "path": "sonar-zpa-plugin/src/test/kotlin/com/felipebz/zpa/metrics/CpdVisitorTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.metrics\n\nimport com.felipebz.zpa.TestPlSqlVisitorRunner\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.sonar.api.batch.fs.internal.DefaultInputFile\nimport org.sonar.api.batch.fs.internal.TestInputFileBuilder\nimport org.sonar.api.batch.sensor.internal.SensorContextTester\nimport java.io.File\nimport java.nio.charset.StandardCharsets\nimport java.nio.file.Paths\n\nclass CpdVisitorTest {\n    private val context = SensorContextTester.create(File(BASE_DIR))\n\n    @Test\n    fun scanFile() {\n        val inputFile = inputFile()\n        context.fileSystem().add(inputFile)\n\n        val visitor = CpdVisitor(context, inputFile)\n        TestPlSqlVisitorRunner.scanFile(File(Paths.get(BASE_DIR, FILE).toString()), null, visitor)\n        val cpdTokenLines = context.cpdTokens(inputFile.key())\n        assertThat(cpdTokenLines).hasSize(17)\n    }\n\n    private fun inputFile(): DefaultInputFile {\n        val inputFile = TestInputFileBuilder(\"key\", \"cpd.sql\")\n                .setLanguage(\"plsqlopen\")\n                .setCharset(StandardCharsets.UTF_8)\n                .initMetadata(File(BASE_DIR, FILE).readText())\n                .setModuleBaseDir(Paths.get(BASE_DIR))\n                .build()\n\n        context.fileSystem().add(inputFile)\n\n        return inputFile\n    }\n\n    companion object {\n        private const val BASE_DIR = \"src/test/resources/metrics\"\n        private const val FILE = \"cpd.sql\"\n    }\n\n}\n"
  },
  {
    "path": "sonar-zpa-plugin/src/test/kotlin/com/felipebz/zpa/symbols/SonarQubeSymbolTableTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.symbols\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.flr.api.GenericTokenType\nimport com.felipebz.flr.api.Token\nimport com.felipebz.zpa.api.symbols.Scope\nimport com.felipebz.zpa.api.symbols.Symbol\nimport org.assertj.core.api.Assertions.assertThat\nimport org.assertj.core.api.Assertions.tuple\nimport org.junit.jupiter.api.Test\nimport org.mockito.Mockito.mock\nimport org.sonar.api.batch.fs.internal.TestInputFileBuilder\nimport org.sonar.api.batch.sensor.internal.SensorContextTester\nimport java.io.File\nimport java.nio.charset.StandardCharsets\n\nclass SonarQubeSymbolTableTest {\n\n    @Test\n    fun test() {\n        val inputFile = TestInputFileBuilder(\"key\", File(\"test.sql\").path)\n                .setContents(\"abcde\")\n                .setLanguage(\"plsqlopen\")\n                .setCharset(StandardCharsets.UTF_8)\n                .build()\n        val key = inputFile.key()\n\n        val context = SensorContextTester.create(File(\"\"))\n        context.fileSystem().add(inputFile)\n\n        val symbol = createSymbol(createNode(1))\n        symbol.addUsage(createNode(2))\n        symbol.addUsage(createNode(3))\n\n        val symbolTable = SonarQubeSymbolTable(context, inputFile)\n        symbolTable.save(listOf(symbol))\n\n        assertThat(context.referencesForSymbolAt(key, 1, 1))\n                .extracting(\"start.line\", \"start.lineOffset\")\n                .containsExactly(tuple(1, 2), tuple(1, 3))\n    }\n\n    private fun createNode(character: Int): AstNode {\n        val token = Token.builder()\n                .setLine(1)\n                .setColumn(character)\n                .setValueAndOriginalValue(\" \")\n                .setType(GenericTokenType.IDENTIFIER)\n                .build()\n\n        val lastToken = Token.builder()\n                .setLine(1)\n                .setColumn(character + 2)\n                .setValueAndOriginalValue(\" \")\n                .setType(GenericTokenType.IDENTIFIER)\n                .build()\n\n        val node = AstNode(token)\n        node.addChild(AstNode(token))\n        node.addChild(AstNode(lastToken))\n\n        return node\n    }\n\n    private fun createSymbol(node: AstNode): Symbol {\n        return Symbol(node, Symbol.Kind.VARIABLE, mock(Scope::class.java), null)\n    }\n\n}\n"
  },
  {
    "path": "sonar-zpa-plugin/src/test/kotlin/com/felipebz/zpa/utplsql/UtPlSqlSensorTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.utplsql\n\nimport com.felipebz.zpa.PlSql\nimport com.felipebz.zpa.api.PlSqlFile\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.symbols.MappedObject\nimport com.felipebz.zpa.symbols.ObjectLocator\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport org.mockito.kotlin.*\nimport org.sonar.api.batch.fs.InputFile\nimport org.sonar.api.batch.fs.internal.TestInputFileBuilder\nimport org.sonar.api.batch.sensor.internal.DefaultSensorDescriptor\nimport org.sonar.api.batch.sensor.internal.SensorContextTester\nimport org.sonar.api.measures.CoreMetrics\nimport org.sonar.api.notifications.AnalysisWarnings\nimport java.io.File\nimport java.nio.charset.StandardCharsets\n\nclass UtPlSqlSensorTest {\n\n    private lateinit var sensor: UtPlSqlSensor\n    private lateinit var context: SensorContextTester\n    private lateinit var objectLocator: ObjectLocator\n    private lateinit var analysisWarnings: AnalysisWarnings\n\n    @BeforeEach\n    fun setUp() {\n        context = SensorContextTester.create(File(\"src/test/resources/com/felipebz/zpa/utplsql/\"))\n        objectLocator = mock()\n        analysisWarnings = spy()\n        sensor = UtPlSqlSensor(objectLocator, analysisWarnings)\n    }\n\n    @Test\n    fun testDescriptor() {\n        val descriptor = DefaultSensorDescriptor()\n        sensor.describe(descriptor)\n        assertThat(descriptor.name()).isEqualTo(\"ZPA - utPLSQL Report Importer\")\n        assertThat(descriptor.languages()).containsOnly(PlSql.KEY)\n    }\n\n    @Test\n    fun shouldImportTestReportWithPaths() {\n        val testFile = TestInputFileBuilder(\"moduleKey\", \"path/to/file.sql\")\n            .setType(InputFile.Type.TEST)\n            .build()\n        context.fileSystem().add(testFile)\n\n        whenever(objectLocator.findTestObject(any(), any())).thenReturn(null)\n\n        context.settings().setProperty(UtPlSqlSensor.TEST_REPORT_PATH_KEY, \"test-report-with-paths.xml\")\n        sensor.execute(context)\n\n        val key = testFile.key()\n        assertThat(context.measure(key, CoreMetrics.TESTS).value()).isEqualTo(4)\n        assertThat(context.measure(key, CoreMetrics.TEST_FAILURES).value()).isEqualTo(1)\n        assertThat(context.measure(key, CoreMetrics.TEST_ERRORS).value()).isEqualTo(1)\n        assertThat(context.measure(key, CoreMetrics.SKIPPED_TESTS).value()).isEqualTo(1)\n        assertThat(context.measure(key, CoreMetrics.TEST_EXECUTION_TIME).value()).isEqualTo(5L)\n    }\n\n    @Test\n    fun shouldImportTestReportWithoutPaths() {\n        val testFile = TestInputFileBuilder(\"moduleKey\", \"path/to/file.sql\")\n            .setType(InputFile.Type.TEST)\n            .build()\n        context.fileSystem().add(testFile)\n\n        whenever(objectLocator.findTestObject(eq(\"test_package\"), any())).thenReturn(\n            MappedObject(\"\", PlSqlGrammar.CREATE_PACKAGE_BODY, PlSqlFile.Type.TEST, testFile.path(), testFile)\n        )\n\n        context.settings().setProperty(UtPlSqlSensor.TEST_REPORT_PATH_KEY, \"test-report-with-paths.xml\")\n        sensor.execute(context)\n\n        val key = testFile.key()\n        assertThat(context.measure(key, CoreMetrics.TESTS).value()).isEqualTo(4)\n        assertThat(context.measure(key, CoreMetrics.TEST_FAILURES).value()).isEqualTo(1)\n        assertThat(context.measure(key, CoreMetrics.TEST_ERRORS).value()).isEqualTo(1)\n        assertThat(context.measure(key, CoreMetrics.SKIPPED_TESTS).value()).isEqualTo(1)\n        assertThat(context.measure(key, CoreMetrics.TEST_EXECUTION_TIME).value()).isEqualTo(5L)\n    }\n\n    @Test\n    fun invalidTestReport() {\n        context.settings().setProperty(UtPlSqlSensor.TEST_REPORT_PATH_KEY, \"doesnotexists.xml\")\n        sensor.execute(context)\n        verify(analysisWarnings).addUnique(\"No utPLSQL test report was found for sonar.zpa.tests.reportPaths using pattern doesnotexists.xml\")\n    }\n\n    @Test\n    fun shouldImportCoverageReportWithPaths() {\n        val relativePath = \"award_bonus.sql\"\n        val mainFile = TestInputFileBuilder(\"moduleKey\", relativePath)\n            .setType(InputFile.Type.MAIN)\n            .setCharset(StandardCharsets.UTF_8)\n            .initMetadata(File(context.fileSystem().baseDir(), relativePath).readText())\n            .build()\n        context.fileSystem().add(mainFile)\n\n        whenever(objectLocator.findMainObject(any(), any())).thenReturn(null)\n\n        context.settings().setProperty(UtPlSqlSensor.COVERAGE_REPORT_PATH_KEY, \"coverage-report-with-paths.xml\")\n        sensor.execute(context)\n\n        val key = mainFile.key()\n        assertThat(context.lineHits(key, 5)).isOne()\n        assertThat(context.lineHits(key, 10)).isOne()\n        assertThat(context.lineHits(key, 11)).isOne()\n        assertThat(context.lineHits(key, 13)).isOne()\n\n        assertThat(context.conditions(key, 10)).isEqualTo(2)\n        assertThat(context.coveredConditions(key, 10)).isEqualTo(2)\n    }\n\n    @Test\n    fun shouldImportCoverageReportWithoutPaths() {\n        val relativePath = \"betwnstr.sql\"\n        val mainFile = TestInputFileBuilder(\"moduleKey\", relativePath)\n            .setType(InputFile.Type.MAIN)\n            .setCharset(StandardCharsets.UTF_8)\n            .initMetadata(File(context.fileSystem().baseDir(), relativePath).readText())\n            .build()\n        context.fileSystem().add(mainFile)\n\n        whenever(objectLocator.findMainObject(any(), any())).thenReturn(\n            MappedObject(\n                identifier = \"\",\n                objectType = PlSqlGrammar.CREATE_FUNCTION,\n                fileType = PlSqlFile.Type.MAIN,\n                path = mainFile.path(),\n                inputFile = mainFile,\n                firstLine = 3,\n                lastLine = 10\n            )\n        )\n\n        context.settings().setProperty(UtPlSqlSensor.COVERAGE_REPORT_PATH_KEY, \"coverage-report-without-paths.xml\")\n        sensor.execute(context)\n\n        val key = mainFile.key()\n        assertThat(context.lineHits(key, 4)).isOne()\n        assertThat(context.lineHits(key, 6)).isOne()\n        assertThat(context.lineHits(key, 7)).isOne()\n        assertThat(context.lineHits(key, 9)).isOne()\n    }\n\n    @Test\n    fun invalidCoverageReport() {\n        context.settings().setProperty(UtPlSqlSensor.COVERAGE_REPORT_PATH_KEY, \"doesnotexists.xml\")\n        sensor.execute(context)\n        verify(analysisWarnings).addUnique(\"No utPLSQL coverage report was found for sonar.zpa.coverage.reportPaths using pattern doesnotexists.xml\")\n    }\n\n    @Test\n    fun shouldNotImportCoverageIfFileDoesNotContainCoveredLined() {\n        val relativePath = \"betwnstr.sql\"\n        val mainFile = TestInputFileBuilder(\"moduleKey\", relativePath)\n            .setType(InputFile.Type.MAIN)\n            .setCharset(StandardCharsets.UTF_8)\n            .build()\n        context.fileSystem().add(mainFile)\n\n        whenever(objectLocator.findMainObject(any(), any())).thenReturn(\n            MappedObject(\n                identifier = \"\",\n                objectType = PlSqlGrammar.CREATE_FUNCTION,\n                fileType = PlSqlFile.Type.MAIN,\n                path = mainFile.path(),\n                inputFile = mainFile,\n                firstLine = 3,\n                lastLine = 10\n            )\n        )\n\n        context.settings().setProperty(UtPlSqlSensor.COVERAGE_REPORT_PATH_KEY, \"coverage-report-all-uncovered.xml\")\n        sensor.execute(context)\n\n        val key = mainFile.key()\n        assertThat(context.lineHits(key, 1)).isNull()\n        assertThat(context.lineHits(key, 2)).isNull()\n        assertThat(context.lineHits(key, 3)).isNull()\n        assertThat(context.lineHits(key, 4)).isNull()\n    }\n}\n"
  },
  {
    "path": "sonar-zpa-plugin/src/test/resources/com/felipebz/zpa/code.sql",
    "content": "begin\n  -- this is a comment\n  /*\n   * another comment\n   */\n  for i in 1..2 loop\n  \n    dbms_output.put_line(i);\n  \n  end loop;\n  \n  begin\n    null;\n  end;\nexception\n  when no_data_found then\n    null;\n  when too_many_rows then\n    null; \nend;\n/\ncreate procedure test is begin null; end;\n/\ncreate function foo return number is begin null; end;\n/"
  },
  {
    "path": "sonar-zpa-plugin/src/test/resources/com/felipebz/zpa/test.sql",
    "content": "begin\n  -- this is a comment\n  /**\n   * another comment\n   */\n  x := 1;\nend;"
  },
  {
    "path": "sonar-zpa-plugin/src/test/resources/com/felipebz/zpa/utplsql/award_bonus.sql",
    "content": "create or replace procedure award_bonus(emp_id number, sales_amt number) as\n  commission real;\n  comm_missing exception;\nbegin\n  select commission_pct\n    into commission\n    from employees_test\n   where employee_id = emp_id;\n\n  if commission is null then\n    raise comm_missing;\n  else\n    update employees_test\n       set salary = nvl(salary, 0) + sales_amt * commission\n     where employee_id = emp_id;\n  end if;\nend;\n/\n"
  },
  {
    "path": "sonar-zpa-plugin/src/test/resources/com/felipebz/zpa/utplsql/betwnstr.sql",
    "content": "/* comment before the code\n   so the lines in the coverage report don't match the file */\ncreate or replace function betwnstr(a_string varchar2, a_start_pos integer, a_end_pos integer) return varchar2 is\n  l_start_pos pls_integer := a_start_pos;\nbegin\n  if l_start_pos = 0 then\n    l_start_pos := 1;\n  end if;\n  return substr(a_string, l_start_pos, a_end_pos - l_start_pos + 1);\nend;\n/\n"
  },
  {
    "path": "sonar-zpa-plugin/src/test/resources/com/felipebz/zpa/utplsql/coverage-report-all-uncovered.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<coverage version=\"1\">\n  <file path=\"function ut3_demo.betwnstr\">\n    <lineToCover lineNumber=\"1\" covered=\"false\"/>\n    <lineToCover lineNumber=\"2\" covered=\"false\"/>\n    <lineToCover lineNumber=\"3\" covered=\"false\"/>\n    <lineToCover lineNumber=\"4\" covered=\"false\"/>\n  </file>\n</coverage>\n"
  },
  {
    "path": "sonar-zpa-plugin/src/test/resources/com/felipebz/zpa/utplsql/coverage-report-with-paths.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<coverage version=\"1\">\n  <file path=\"award_bonus.sql\">\n    <lineToCover lineNumber=\"5\" covered=\"true\"/>\n    <lineToCover lineNumber=\"10\" covered=\"true\" branchesToCover=\"2\" coveredBranches=\"2\"/>\n    <lineToCover lineNumber=\"11\" covered=\"true\"/>\n    <lineToCover lineNumber=\"13\" covered=\"true\"/>\n  </file>\n</coverage>\n"
  },
  {
    "path": "sonar-zpa-plugin/src/test/resources/com/felipebz/zpa/utplsql/coverage-report-without-paths.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<coverage version=\"1\">\n  <file path=\"function ut3_demo.betwnstr\">\n    <lineToCover lineNumber=\"2\" covered=\"true\"/>\n    <lineToCover lineNumber=\"4\" covered=\"true\"/>\n    <lineToCover lineNumber=\"5\" covered=\"true\"/>\n    <lineToCover lineNumber=\"7\" covered=\"true\"/>\n  </file>\n</coverage>\n"
  },
  {
    "path": "sonar-zpa-plugin/src/test/resources/com/felipebz/zpa/utplsql/test-report-with-paths.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<testExecutions version=\"1\">\n  <file path=\"path/to/file.sql\">\n    <testCase name=\"test_1\" duration=\"1\">\n    </testCase>\n    <testCase name=\"test_2\" duration=\"1\">\n    </testCase>\n    <testCase name=\"failure\" duration=\"1\">\n      <failure/>\n    </testCase>\n    <testCase name=\"skipped\" duration=\"1\">\n      <skipped/>\n    </testCase>\n    <testCase name=\"error\" duration=\"1\">\n      <error/>\n    </testCase>\n  </file>\n</testExecutions>\n"
  },
  {
    "path": "sonar-zpa-plugin/src/test/resources/com/felipebz/zpa/utplsql/test-report-without-paths.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<testExecutions version=\"1\">\n  <file path=\"my.suite.test_package\">\n    <testCase name=\"test_1\" duration=\"1\">\n    </testCase>\n    <testCase name=\"test_2\" duration=\"1\">\n    </testCase>\n    <testCase name=\"failure\" duration=\"1\">\n      <failure/>\n    </testCase>\n    <testCase name=\"skipped\" duration=\"1\">\n      <skipped/>\n    </testCase>\n    <testCase name=\"error\" duration=\"1\">\n      <error/>\n    </testCase>\n  </file>\n</testExecutions>\n"
  },
  {
    "path": "sonar-zpa-plugin/src/test/resources/highlight/highlight.sql",
    "content": "begin\n  -- this is a comment\n  /**\n   * another comment\n   */\n  x := 1;\nend;"
  },
  {
    "path": "sonar-zpa-plugin/src/test/resources/metrics/cpd.sql",
    "content": "begin\n null;\nend;\ncreate package body pkg is\n  procedure foo is\n  begin\n    null;\n  end;\nend;\ncreate procedure foo is\nbegin\n  null;\nend;\ncreate function foo return number is\nbegin\n  null;\nend;\n-- package specification should not be considered for duplication detection\ncreate package pkg is\n  procedure foo;\nend;\n\ncreate view foo as\nselect * from dual;\n\ncreate trigger foo \nbefore insert on tab\nbegin \n  null;\nend;\n"
  },
  {
    "path": "sonar-zpa-plugin/src/test/resources/org/sonar/l10n/languageKey/rules/plsql/ruleWithExternalInfo.html",
    "content": "description for ruleWithExternalInfo"
  },
  {
    "path": "sonar-zpa-plugin/src/test/resources/org/sonar/l10n/languageKey/rules/repoKey/ruleWithExternalInfo.html",
    "content": "description for ruleWithExternalInfo"
  },
  {
    "path": "sonar-zpa-plugin/src/test/resources/org/sonar/l10n/languageKey.properties",
    "content": "ruleWithExternalInfo.name=external name for ruleWithExternalInfo\nruleWithExternalInfo.param.param1Key=description for param1\n"
  },
  {
    "path": "sonar-zpa-plugin/src/test/resources/org/sonar/l10n/languageWithoutBundle/empty.txt",
    "content": ""
  },
  {
    "path": "template/changelog.tpl",
    "content": "## SonarQube compatibility\n\nThis release is compatible with SonarQube Community Build 26.2 and newer and it has been tested on versions 26.2 to 26.5.\n\nSonarQube commercial builds are not supported. For that, consider using [zpa-cli](https://github.com/felipebz/zpa-cli) instead.\n\n## Install/update instructions\n\n* Download the {{#f_release_download_url}}sonar-zpa-plugin-{{projectVersion}}.jar{{/f_release_download_url}} and copy it to the SONARQUBE_HOME/extensions/plugins.\n* Remove the older plugin from that directory.\n* Restart the SonarQube instance.\n\n## For custom plugin developers\n\nBinary compatibility is not guaranteed either in between any version number change. Custom plugins should be recompiled against the same version of `sonar-zpa-plugin`.\n\nDownload the {{#f_release_download_url}}zpa-toolkit-{{projectVersion}}.jar{{/f_release_download_url}} (requires Java 17+) to test the parser and view the AST.\n\n## Full changelog\n\n{{changelogChanges}}\n"
  },
  {
    "path": "zpa-checks/build.gradle.kts",
    "content": "import de.undercouch.gradle.tasks.download.Download\n\nplugins {\n    id(\"com.felipebz.zpa.build-conventions\")\n    alias(libs.plugins.download)\n}\n\ndependencies {\n    implementation(libs.flr.core)\n    implementation(libs.flr.xpath)\n    implementation(project(\":zpa-core\"))\n    testImplementation(project(\":zpa-checks-testkit\"))\n}\n\ntesting {\n    suites {\n        register<JvmTestSuite>(\"integrationTest\") {\n            val downloadZipFile by tasks.registering(Download::class, fun Download.() {\n                val sqlclVersion = \"25.3.0.274.1210\"\n                src(\"https://download.oracle.com/otn_software/java/sqldeveloper/sqlcl-$sqlclVersion.zip\")\n                overwrite(false)\n                dest(layout.projectDirectory.dir(\"tools\").file(\"sqlcl-$sqlclVersion.zip\"))\n            })\n\n            val downloadAndUnzipFile = tasks.register<Copy>(\"downloadAndUnzipFile\") {\n                dependsOn(downloadZipFile)\n                from(zipTree(downloadZipFile.get().dest))\n                into(layout.projectDirectory.dir(\"tools\"))\n            }\n\n            tasks.named(\"compileIntegrationTestKotlin\") {\n                dependsOn(downloadAndUnzipFile)\n            }\n\n            tasks.named(\"integrationTest\") {\n                dependsOn(downloadAndUnzipFile)\n            }\n\n            dependencies {\n                implementation(layout.projectDirectory.dir(\"tools/sqlcl/lib\").asFileTree)\n                implementation(project())\n                implementation(libs.jackson)\n                implementation(project(\":zpa-core\"))\n                implementation(libs.jsoup)\n            }\n        }\n    }\n}\n\ndescription = \"ZPA Checks\"\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/kotlin/com/felipebz/zpa/it/InputFile.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.it\n\nimport com.felipebz.zpa.api.PlSqlFile\nimport java.io.File\nimport java.nio.charset.Charset\nimport java.nio.file.Path\nimport kotlin.io.path.invariantSeparatorsPathString\n\nclass InputFile(private val type: PlSqlFile.Type,\n                baseDirPath: Path,\n                private val file: File,\n                private val charset: Charset\n) : PlSqlFile {\n\n    override fun contents(): String =\n        file.inputStream().use {\n            return it.bufferedReader(charset).use { r -> r.readText() }\n        }\n\n    override fun fileName(): String  = file.name\n\n    override fun path(): Path = file.toPath()\n\n    override fun type(): PlSqlFile.Type = type\n\n    val pathRelativeToBase: String = baseDirPath.relativize(path()).invariantSeparatorsPathString\n\n    override fun hashCode(): Int {\n        return file.hashCode()\n    }\n\n    override fun equals(other: Any?): Boolean {\n        if (other == null || other !is InputFile) return false\n        return file == other.file\n    }\n\n    override fun toString(): String {\n        return pathRelativeToBase\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/kotlin/com/felipebz/zpa/it/OracleDocsExtractor.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.it\n\nimport oracle.dbtools.parser.Lexer\nimport oracle.dbtools.parser.plsql.SyntaxError\nimport oracle.dbtools.raptor.newscriptrunner.ScriptParser\nimport org.jsoup.Jsoup\nimport java.io.File\nimport java.nio.file.Paths\nimport java.util.zip.ZipFile\n\nfun main() {\n    OracleDocsExtractor().extract()\n}\n\nclass OracleDocsExtractor {\n\n    fun extract() {\n        // you need to get the file from https://docs.oracle.com/en/database/oracle/oracle-database/23/zip/oracle-database_23.zip\n        val zipFile = ZipFile(System.getProperty(\"oracleDocs\"))\n        val outputDir = File(\"zpa-checks/src/integrationTest/resources/sources/oracle-database_23\")\n\n        if (outputDir.exists()) {\n            outputDir.deleteRecursively()\n        }\n        outputDir.mkdirs()\n\n        val entries = zipFile.entries()\n\n        val booksToExtract = listOf(\n            \"adjsn\", // JSON Developer's Guide\n            \"lnpls\", // PL/SQL Language Reference\n            \"sqlrf\", // SQL Language Reference\n            )\n\n        entries.asSequence()\n            .filter { !it.isDirectory }\n            .map { Pair(it, File(it.name).parentFile.name) }\n            .forEach { (entry, parent) ->\n                if (parent in booksToExtract) {\n                    zipFile.getInputStream(entry).use { stream ->\n                        Jsoup.parse(stream, Charsets.UTF_8.name(), \"\").run {\n                            select(\"pre.oac_no_warn, pre.codeblock code\").forEachIndexed { index, element ->\n                                var text = element.text()\n                                    .replace('’', '\\'')\n\n                                val name = \"${File(entry.name).nameWithoutExtension}-$index.sql\"\n\n                                val fileContent = extractValidStatementsFrom(text)\n\n                                if (fileContent.isNotEmpty()) {\n                                    val path = entry.name.substring(entry.name.indexOf(parent))\n                                    text = \"-- https://docs.oracle.com/en/database/oracle/oracle-database/23/$path\\n$fileContent\"\n\n                                    val pathOutput = Paths.get(outputDir.absolutePath, parent, name).toFile()\n                                    pathOutput.parentFile.mkdirs()\n                                    pathOutput.writeText(text, Charsets.UTF_8)\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n    }\n\n    private fun extractValidStatementsFrom(text: String): String {\n        val alteredText =\n            if (text.startsWith(\"PACKAGE\")) {\n                \"CREATE $text\"\n            } else {\n                text\n            }\n\n        val parser = ScriptParser(alteredText)\n        var validText = \"\"\n        while (true) {\n            val cmd = try {\n                parser.next() ?: break\n            } catch (_: NullPointerException) {\n                // the dbtools-common from SQLcl 25.x throws a NullPointerException when parsing invalid code\n                break\n            }\n            val sql = cmd.sqlOrigWithTerminator\n            val syntaxError = SyntaxError.checkSyntax(\n                sql,\n                arrayOf(\"select\", \"sql_statement\", \"sql_statements\")\n            )\n            if (syntaxError == null) {\n                val tokens = Lexer.parse(sql)\n\n                // ignore the command if it doesn't have any token (e.g. comment line)\n                if (tokens.isNotEmpty()) {\n                    if (validText.isNotEmpty()) {\n                        validText += \"\\n\"\n                    }\n                    validText += sql\n                }\n            }\n        }\n        return validText\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/kotlin/com/felipebz/zpa/it/PlSqlRulingTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.it\n\nimport com.fasterxml.jackson.core.util.DefaultIndenter\nimport com.fasterxml.jackson.core.util.DefaultPrettyPrinter\nimport com.fasterxml.jackson.databind.JsonNode\nimport com.fasterxml.jackson.databind.ObjectMapper\nimport org.junit.jupiter.api.AfterAll\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.fail\nimport com.felipebz.zpa.checks.CheckList\nimport com.felipebz.zpa.checks.ParsingErrorCheck\nimport com.felipebz.zpa.metadata.FormsMetadata\nimport com.felipebz.zpa.squid.AstScanner\nimport com.felipebz.zpa.api.PlSqlFile\nimport com.felipebz.zpa.api.checks.PlSqlVisitor\nimport java.io.File\nimport java.nio.charset.StandardCharsets\nimport java.nio.file.Paths\nimport java.util.*\nimport kotlin.io.path.exists\n\nclass PlSqlRulingTest {\n\n    private val mapper = ObjectMapper()\n    private val prettyPrinter = DefaultPrettyPrinter().apply {\n        indentArraysWith(DefaultIndenter.SYSTEM_LINEFEED_INSTANCE)\n    }\n\n    @Test\n    fun alexandria_plsql_utils() {\n        analyze(\"alexandria-plsql-utils\")\n    }\n\n    @Test\n    fun pljson() {\n        analyze(\"pljson\")\n    }\n\n    @Test\n    fun antlr() {\n        analyze(\"antlr-grammars-v4\")\n    }\n\n    @Test\n    fun utPLSQL2() {\n        analyze(\"utPLSQL2\")\n    }\n\n    @Test\n    fun utPLSQL3() {\n        analyze(\"utPLSQL3\")\n    }\n\n    @Test\n    fun demo0001() {\n        analyze(\"demo0001\", \"Doag-Forms-extracted/demo0001/WEBUTIL_DEMO\")\n    }\n\n    @Test\n    fun demo0002() {\n        analyze(\"demo0002\", \"Doag-Forms-extracted/demo0002/DEMO0002\")\n    }\n\n    @Test\n    fun demo0002_2() {\n        analyze(\"demo0002_2\", \"Doag-Forms-extracted/demo0002/FRW_REF\")\n    }\n\n    @Test\n    fun demo0003() {\n        analyze(\"demo0003\", \"Doag-Forms-extracted/demo0003/DEMO0003\")\n    }\n\n    @Test\n    fun demo0004() {\n        analyze(\"demo0004\", \"Doag-Forms-extracted/demo0004/RELEASE_LOCKS\")\n    }\n\n    @Test\n    fun demo0005() {\n        analyze(\"demo0005\", \"Doag-Forms-extracted/demo0005/TIMEOUTPJC_TEST\")\n    }\n\n    @Test\n    fun demo0006() {\n        analyze(\"demo0006\", \"Doag-Forms-extracted/demo0006/TIMEOUT_SYS_CLIENT_IDL\")\n    }\n\n    @Test\n    fun demo0007() {\n        analyze(\"demo0007\", \"Doag-Forms-extracted/demo0007/CD_DEMO_EXCEL\")\n    }\n\n    @Test\n    fun demo0008() {\n        analyze(\"demo0008\", \"Doag-Forms-extracted/demo0008/LATENCY_TEST\")\n    }\n\n    @Test\n    fun demo0009() {\n        analyze(\"demo0009\", \"Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905\")\n    }\n\n    @Test\n    fun demo0010() {\n        analyze(\"demo0010\", \"Doag-Forms-extracted/demo0010/CHK_MYFFI_SAMPLE5\")\n    }\n\n    @Test\n    fun demo0011() {\n        analyze(\"demo0011\", \"Doag-Forms-extracted/demo0011/WEBUTIL_DEMO\")\n    }\n\n    @Test\n    fun demo0012() {\n        analyze(\"demo0012\", \"Doag-Forms-extracted/demo0012/PDFVIEWER\")\n    }\n\n    @Test\n    fun demo0013() {\n        analyze(\"demo0013\", \"Doag-Forms-extracted/demo0013/COLOR_SLIDER\")\n    }\n\n    @Test\n    fun demo0014() {\n        analyze(\"demo0014\", \"Doag-Forms-extracted/demo0014/ACCORDION\")\n    }\n\n    @Test\n    fun demo0014_2() {\n        analyze(\"demo0014_2\", \"Doag-Forms-extracted/demo0014/ACCORDION2\")\n    }\n\n    @Test\n    fun demo0015() {\n        analyze(\"demo0015\", \"Doag-Forms-extracted/demo0015/MODERNIZE\")\n    }\n\n    @Test\n    fun demo0016() {\n        analyze(\"demo0016\", \"Doag-Forms-extracted/demo0016/CHK_CBOX3\")\n    }\n\n    @Test\n    fun demo0017() {\n        analyze(\"demo0017\", \"Doag-Forms-extracted/demo0017/POC_ACCOUNT\")\n    }\n\n    @Test\n    fun demo0018() {\n        analyze(\"demo0018\", \"Doag-Forms-extracted/demo0018/TEST\")\n    }\n\n    @Test\n    fun oracleDatabase23() {\n        val project = \"oracle-database_23\"\n        if (!File(\"src/integrationTest/resources/sources/$project\").exists()) {\n            OracleDocsExtractor().extract()\n        }\n        analyze(project)\n    }\n\n    private fun analyze(project: String, sources: String = project) {\n        val extensions = \"sql,typ,pkg,pkb,pks,tab,tps,tpb,pcd,fun,tgg\"\n\n        val baseDir = File(\"src/integrationTest/resources/sources/$sources\").absoluteFile\n        val baseDirPath = baseDir.toPath()\n\n        val metadataFilePath = Paths.get(baseDir.absolutePath, \"metadata.json\")\n        val metadata = if (metadataFilePath.exists()) FormsMetadata.loadFromFile(metadataFilePath.toString()) else null\n\n        val checks = CheckList.checks.map { it.getDeclaredConstructor().newInstance() as PlSqlVisitor }\n        val scanner = AstScanner(checks, metadata, false, StandardCharsets.UTF_8)\n\n        val files = baseDir\n            .walkTopDown()\n            .filter { it.isFile && it.extension.isNotEmpty() && extensions.contains(it.extension.lowercase(Locale.getDefault())) }\n            .toList()\n\n        val issues = files\n            .map { scanner.scanFile(InputFile(PlSqlFile.Type.MAIN, baseDirPath, it, StandardCharsets.UTF_8)) }\n            .flatMap { it.issues }\n\n        val writer = mapper.writer(prettyPrinter)\n        var differences = \"\"\n        for (check in checks) {\n            val export = issues.filter { it.check == check }\n                .sortedBy { it.primaryLocation.startLine() }\n                .groupBy({ (it.file as InputFile).pathRelativeToBase }, { it.primaryLocation.startLine() })\n                .toSortedMap()\n            val actualContent = if (export.size > 0) mapper.valueToTree<JsonNode>(export) else null\n\n            val expectedFile = File(\"src/integrationTest/resources/expected/$project/${check::class.simpleName}.json\")\n            val expectedContent = if (expectedFile.exists()) mapper.readTree(expectedFile) else null\n\n            if (actualContent == null && expectedFile.exists()) {\n                differences += \"\\nExpected issues on $expectedFile were not found\"\n            } else if (actualContent != null && actualContent != expectedContent) {\n                val actualFile = File(\"build/integrationTest/$project/${check::class.simpleName}.json\")\n                actualFile.parentFile.mkdirs()\n                actualFile.writeText(writer.writeValueAsString(actualContent))\n\n                differences += \"\\nIssues differences on the expected file $expectedFile (actual: $actualFile)\"\n            }\n        }\n\n        if (differences.isNotEmpty()) {\n            fail(differences)\n        }\n\n        if (issues.none { it.check is ParsingErrorCheck }) {\n            // if there are no parsing errors, rerun the scanner with the error recovery enabled to check if it is working\n            val newScanner = AstScanner(listOf(ParsingErrorCheck()), metadata, true, StandardCharsets.UTF_8)\n            val parsingIssues = files\n                .map { newScanner.scanFile(InputFile(PlSqlFile.Type.MAIN, baseDirPath, it, StandardCharsets.UTF_8)) }\n                .flatMap { it.issues }\n            if (parsingIssues.isNotEmpty()) {\n                val export = issues\n                    .groupBy({ (it.file as InputFile).pathRelativeToBase }, { it.primaryLocation.startLine() })\n                    .toSortedMap()\n                val actualContent = if (export.size > 0) mapper.valueToTree<JsonNode>(export) else null\n\n                fail(\"The project was parsed correctly with error recovery disabled, but there are parsing \" +\n                    \"issues with error recovery enabled:\\n\" +\n                    writer.writeValueAsString(actualContent)\n                )\n            }\n        }\n\n        summary.add(SummaryItem(project, files.size, issues.filter { it.check is ParsingErrorCheck }.size))\n    }\n\n    companion object {\n        private val summary = mutableListOf<SummaryItem>()\n\n        @AfterAll\n        @JvmStatic\n        fun writeSummary() {\n            val output = File(\"build/integrationTest/progress-summary.md\")\n            output.parentFile.mkdirs()\n            output.writeText(\"| Project | Files | Parsing Errors | % Success | Status |\\n| --- | --- | --- | --- | --- |\\n\")\n\n            for (item in summary.sortedWith(compareByDescending<SummaryItem> { it.parsingErrors }.thenBy { it.name })) {\n                val successPercentage = ((item.files - item.parsingErrors).toDouble() / item.files) * 100\n                val status = if (item.parsingErrors > 0) \"❌\" else \"✅\"\n                output.appendText(\n                    \"| ${item.name} | ${item.files} | ${item.parsingErrors} | ${\n                        String.format(\n                            \"%.2f\",\n                            successPercentage\n                        )\n                    }% | $status |\\n\"\n                )\n            }\n        }\n    }\n\n    data class SummaryItem(\n        val name: String,\n        val files: Int,\n        val parsingErrors: Int,\n    )\n\n}\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/alexandria-plsql-utils/CharacterDatatypeUsageCheck.json",
    "content": "{\n  \"extras/hash_util_pkg.pkb\" : [\n    284\n  ],\n  \"ora/ftp_util_pkg.pkb\" : [\n    92\n  ],\n  \"ora/xlsx_builder_pkg.pkb\" : [\n    834,\n    865,\n    892\n  ],\n  \"ora/xlsx_builder_pkg.pks\" : [\n    214,\n    227\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/alexandria-plsql-utils/CollapsibleIfStatementsCheck.json",
    "content": "{\n  \"extras/as_pdf3.pkb\" : [\n    2441,\n    2995\n  ],\n  \"extras/pdfgen_pkg.pkb\" : [\n    3206\n  ],\n  \"ora/amazon_aws_s3_pkg.pkb\" : [\n    129\n  ],\n  \"ora/image_util_pkg.pkb\" : [\n    372\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/alexandria-plsql-utils/CommitRollbackCheck.json",
    "content": "{\n  \"ora/soap_server_pkg.pkb\" : [\n    772\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/alexandria-plsql-utils/ComparisonWithBooleanCheck.json",
    "content": "{\n  \"ora/debug_pkg.pkb\" : [\n    184\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/alexandria-plsql-utils/ComparisonWithNullCheck.json",
    "content": "{\n  \"ora/pdf_builder_pkg.pkb\" : [\n    995\n  ],\n  \"ora/string_util_pkg.pkb\" : [\n    584\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/alexandria-plsql-utils/ConcatenationWithNullCheck.json",
    "content": "{\n  \"extras/pdfgen_pkg.pkb\" : [\n    3166\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/alexandria-plsql-utils/DbmsOutputPutCheck.json",
    "content": "{\n  \"demos/csv_util_pkg_demo.sql\" : [\n    45,\n    69,\n    74,\n    79\n  ],\n  \"demos/zip_util_pkg_demo.sql\" : [\n    32,\n    49,\n    51\n  ],\n  \"extras/as_pdf3.pkb\" : [\n    800,\n    2277,\n    2546\n  ],\n  \"extras/as_pdf3_demo.sql\" : [\n    239\n  ],\n  \"extras/hash_util_pkg.pkb\" : [\n    1285,\n    1287,\n    1290,\n    1292,\n    1295,\n    1297,\n    1301,\n    1303,\n    1306,\n    1308,\n    1311,\n    1313,\n    1317,\n    1319,\n    1322,\n    1324,\n    1327,\n    1329,\n    1333,\n    1335,\n    1338,\n    1340,\n    1343,\n    1345,\n    1349,\n    1351,\n    1354,\n    1356,\n    1359,\n    1361,\n    1365,\n    1367,\n    1370,\n    1372,\n    1376,\n    1378,\n    1381,\n    1383\n  ],\n  \"ora/debug_pkg.pkb\" : [\n    89\n  ],\n  \"ora/ftp_util_pkg.pkb\" : [\n    792\n  ],\n  \"ora/t_soap_envelope.pkb\" : [\n    116,\n    121\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/alexandria-plsql-utils/DeadCodeCheck.json",
    "content": "{\n  \"extras/pdfgen_pkg.pkb\" : [\n    680\n  ],\n  \"ora/sylk_util_pkg.pkb\" : [\n    96\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/alexandria-plsql-utils/EmptyBlockCheck.json",
    "content": "{\n  \"demos/employee_service.pkb\" : [\n    70\n  ],\n  \"extras/as_pdf3.pkb\" : [\n    352\n  ],\n  \"extras/pdfgen_pkg.pkb\" : [\n    866,\n    3554\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/alexandria-plsql-utils/EmptyStringAssignmentCheck.json",
    "content": "{\n  \"extras/as_pdf3.pkb\" : [\n    749,\n    2429\n  ],\n  \"extras/pdfgen_pkg.pkb\" : [\n    1159,\n    1197,\n    1227,\n    1451,\n    1578,\n    1582,\n    2612,\n    2812,\n    2961,\n    3099\n  ],\n  \"ora/date_util_pkg.pkb\" : [\n    446\n  ],\n  \"ora/t_soap_envelope.pkb\" : [\n    42\n  ],\n  \"ora/xml_builder_pkg.pkb\" : [\n    71\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/alexandria-plsql-utils/ExplicitInParameterCheck.json",
    "content": "{\n  \"demos/pdf_builder_pkg_demo.sql\" : [\n    188\n  ],\n  \"extras/as_pdf3.pkb\" : [\n    93,\n    100,\n    107,\n    107,\n    107,\n    114,\n    114,\n    127,\n    127,\n    127,\n    134,\n    134,\n    167,\n    186,\n    187,\n    188,\n    189,\n    190,\n    309,\n    310,\n    318,\n    324,\n    330,\n    348,\n    387,\n    405,\n    406,\n    407,\n    408,\n    436,\n    437,\n    438,\n    453,\n    625,\n    837,\n    948,\n    949,\n    950,\n    1128,\n    1128,\n    1153,\n    1154,\n    1155,\n    1163,\n    1196,\n    1215,\n    1216,\n    1217,\n    1218,\n    1219,\n    1262,\n    1263,\n    1264,\n    1265,\n    1306,\n    1307,\n    1308,\n    1332,\n    1344,\n    1350,\n    1362,\n    1363,\n    1364,\n    1378,\n    1379,\n    1380,\n    1418,\n    1419,\n    1420,\n    1429,\n    1430,\n    1431,\n    1432,\n    1476,\n    1477,\n    1478,\n    1479,\n    1542,\n    1597,\n    1597,\n    1597,\n    1597,\n    1624,\n    1624,\n    1624,\n    1624,\n    1866,\n    1867,\n    1868,\n    1869,\n    1870,\n    2484,\n    2485,\n    2486,\n    2487,\n    2488,\n    2497,\n    2498,\n    2499,\n    2500,\n    2501,\n    2510,\n    2511,\n    2512,\n    2513,\n    2514,\n    2522,\n    2523,\n    2524,\n    2525,\n    2551,\n    2552,\n    2553,\n    2554,\n    2555,\n    2562,\n    2583,\n    2583,\n    2589,\n    2596,\n    2597,\n    2598,\n    2615,\n    2622,\n    2623,\n    2624,\n    2642,\n    2643,\n    2644,\n    2645,\n    2646,\n    2671,\n    2672,\n    2673,\n    2674,\n    2675,\n    2700,\n    2701,\n    2702,\n    2703,\n    2704,\n    2705,\n    2706,\n    2736,\n    2754,\n    2805,\n    2859,\n    2860,\n    2962,\n    3123,\n    3124,\n    3125,\n    3126,\n    3127,\n    3128,\n    3129,\n    3182,\n    3183,\n    3184,\n    3185,\n    3186,\n    3187,\n    3188,\n    3189,\n    3209,\n    3210,\n    3211,\n    3212,\n    3213,\n    3214,\n    3215,\n    3232,\n    3239,\n    3240,\n    3241,\n    3397,\n    3398,\n    3399,\n    3414,\n    3415,\n    3416\n  ],\n  \"extras/as_pdf3.pks\" : [\n    54,\n    54,\n    57,\n    57,\n    61,\n    62,\n    63,\n    66,\n    68,\n    71,\n    72,\n    73,\n    74,\n    75,\n    79,\n    80,\n    81,\n    82,\n    91,\n    92,\n    93,\n    96,\n    98,\n    98,\n    98,\n    98,\n    100,\n    114,\n    115,\n    116,\n    120,\n    121,\n    122,\n    127,\n    128,\n    129,\n    133,\n    134,\n    135,\n    136,\n    141,\n    142,\n    143,\n    144,\n    150,\n    151,\n    152,\n    153,\n    154,\n    159,\n    160,\n    161,\n    162,\n    163,\n    167,\n    168,\n    169,\n    170,\n    171,\n    176,\n    177,\n    178,\n    179,\n    180,\n    184,\n    185,\n    186,\n    187,\n    191,\n    192,\n    193,\n    194,\n    195,\n    198,\n    201,\n    202,\n    203,\n    206,\n    209,\n    210,\n    211,\n    244,\n    245,\n    246,\n    247,\n    248,\n    249,\n    250,\n    254,\n    255,\n    256,\n    257,\n    258,\n    259,\n    260,\n    261,\n    265,\n    266,\n    267,\n    268,\n    269,\n    270,\n    271,\n    274,\n    280,\n    281,\n    282,\n    287,\n    288,\n    289\n  ],\n  \"extras/pdfgen_pkg.pkb\" : [\n    212,\n    225,\n    495,\n    545,\n    592,\n    608,\n    627,\n    646,\n    686,\n    729,\n    739,\n    744,\n    752,\n    757,\n    757,\n    757,\n    762,\n    767,\n    795,\n    795,\n    814,\n    819,\n    830,\n    846,\n    846,\n    877,\n    877,\n    895,\n    895,\n    926,\n    934,\n    941,\n    952,\n    1260,\n    1269,\n    1269,\n    1574,\n    1615,\n    1615,\n    1615,\n    1841,\n    2018,\n    2018,\n    2033,\n    2071,\n    2090,\n    2108,\n    2120,\n    2120,\n    2130,\n    2139,\n    2146,\n    2146,\n    2146,\n    2159,\n    2169,\n    2176,\n    2183,\n    2183,\n    2192,\n    2192,\n    2208,\n    2219,\n    2226,\n    2233,\n    2240,\n    2247,\n    2254,\n    2265,\n    2265,\n    2332,\n    2332,\n    2332,\n    2346,\n    2346,\n    2346,\n    2365,\n    2365,\n    2365,\n    2381,\n    2391,\n    2391,\n    2391,\n    2391,\n    2401,\n    2401,\n    2401,\n    2401,\n    2401,\n    2430,\n    2430,\n    2430,\n    2446,\n    2446,\n    2446,\n    2446,\n    2446,\n    2467,\n    2467,\n    2467,\n    2517,\n    2593,\n    2594,\n    2595,\n    2720,\n    2720,\n    2720,\n    2793,\n    2793,\n    2793,\n    2884,\n    2909,\n    2924,\n    2925,\n    2926,\n    2927,\n    2928,\n    2929,\n    2930,\n    2931,\n    3044,\n    3045,\n    3046,\n    3047,\n    3048,\n    3049,\n    3050,\n    3225,\n    3226,\n    3227,\n    3228,\n    3229,\n    3230,\n    3231,\n    3272,\n    3272,\n    3272,\n    3380,\n    3380,\n    3551\n  ],\n  \"extras/pdfgen_pkg.pks\" : [\n    50,\n    50,\n    52,\n    55,\n    57,\n    59,\n    60,\n    60,\n    61,\n    62,\n    63,\n    63,\n    63,\n    64,\n    65,\n    66,\n    67,\n    67,\n    68,\n    68,\n    69,\n    70,\n    71,\n    72,\n    73,\n    74,\n    75,\n    79,\n    79,\n    79,\n    80,\n    80,\n    80,\n    81,\n    81,\n    81,\n    82,\n    83,\n    83,\n    83,\n    83,\n    84,\n    84,\n    84,\n    84,\n    84,\n    86,\n    86,\n    86,\n    87,\n    87,\n    87,\n    87,\n    87,\n    88,\n    88,\n    88,\n    90,\n    90,\n    90,\n    91,\n    91,\n    91,\n    92,\n    93,\n    95,\n    96,\n    97,\n    98,\n    99,\n    100,\n    101,\n    102,\n    104,\n    105,\n    106,\n    107,\n    108,\n    109,\n    110,\n    111,\n    111,\n    111,\n    112,\n    113,\n    114,\n    115,\n    116,\n    117,\n    118,\n    120,\n    120,\n    124,\n    125,\n    125,\n    125,\n    126,\n    130,\n    132,\n    133,\n    133\n  ],\n  \"ora/image_util_pkg.pkb\" : [\n    19,\n    20,\n    21,\n    28,\n    35,\n    36,\n    37,\n    78,\n    143,\n    210,\n    211,\n    327\n  ],\n  \"ora/sylk_util_pkg.pkb\" : [\n    79,\n    80,\n    81,\n    92,\n    218\n  ],\n  \"ora/xlsx_builder_pkg.pkb\" : [\n    132,\n    133,\n    134,\n    156,\n    156,\n    156,\n    163,\n    163,\n    170,\n    170,\n    170,\n    179,\n    180,\n    310,\n    321,\n    363,\n    389,\n    390,\n    391,\n    419,\n    436,\n    467,\n    468,\n    469,\n    470,\n    471,\n    472,\n    473,\n    474,\n    513,\n    514,\n    539,\n    540,\n    541,\n    542,\n    571,\n    572,\n    573,\n    586,\n    587,\n    588,\n    589,\n    590,\n    591,\n    592,\n    593,\n    654,\n    655,\n    656,\n    657,\n    658,\n    659,\n    660,\n    661,\n    662,\n    678,\n    709,\n    710,\n    711,\n    712,\n    713,\n    714,\n    715,\n    716,\n    717,\n    738,\n    739,\n    740,\n    741,\n    742,\n    743,\n    744,\n    745,\n    746,\n    767,\n    768,\n    769,\n    770,\n    771,\n    791,\n    792,\n    793,\n    794,\n    795,\n    796,\n    797,\n    813,\n    814,\n    815,\n    816,\n    817,\n    828,\n    829,\n    830,\n    831,\n    832,\n    833,\n    834,\n    835,\n    836,\n    837,\n    838,\n    857,\n    858,\n    859,\n    860,\n    861,\n    862,\n    863,\n    864,\n    865,\n    866,\n    867,\n    868,\n    869,\n    887,\n    888,\n    889,\n    890,\n    891,\n    892,\n    893,\n    894,\n    895,\n    896,\n    914,\n    915,\n    916,\n    917,\n    918,\n    919,\n    920,\n    933,\n    934,\n    935,\n    943,\n    944,\n    945,\n    946,\n    947,\n    948,\n    949,\n    962,\n    963,\n    964,\n    965,\n    966,\n    967,\n    968,\n    981,\n    982,\n    992,\n    993,\n    1003,\n    1004,\n    1005,\n    1015,\n    1016,\n    1017,\n    1018,\n    1019,\n    1063,\n    1064,\n    1863,\n    1864,\n    1872,\n    1873,\n    1874,\n    1875,\n    1876\n  ],\n  \"ora/xlsx_builder_pkg.pks\" : [\n    69,\n    71,\n    74,\n    78,\n    79,\n    80,\n    81,\n    82,\n    83,\n    84,\n    85,\n    90,\n    91,\n    96,\n    97,\n    98,\n    99,\n    120,\n    121,\n    122,\n    144,\n    145,\n    146,\n    147,\n    148,\n    149,\n    150,\n    151,\n    152,\n    156,\n    157,\n    158,\n    159,\n    160,\n    161,\n    162,\n    163,\n    164,\n    168,\n    169,\n    170,\n    171,\n    172,\n    173,\n    174,\n    175,\n    176,\n    180,\n    181,\n    182,\n    183,\n    184,\n    188,\n    189,\n    190,\n    191,\n    192,\n    193,\n    194,\n    198,\n    199,\n    200,\n    201,\n    202,\n    206,\n    207,\n    208,\n    209,\n    210,\n    211,\n    212,\n    213,\n    214,\n    215,\n    216,\n    217,\n    218,\n    222,\n    223,\n    224,\n    225,\n    226,\n    227,\n    228,\n    229,\n    230,\n    231,\n    235,\n    236,\n    237,\n    238,\n    239,\n    240,\n    241,\n    245,\n    246,\n    247,\n    251,\n    252,\n    253,\n    254,\n    255,\n    256,\n    257,\n    261,\n    262,\n    263,\n    264,\n    265,\n    266,\n    267,\n    271,\n    272,\n    276,\n    277,\n    281,\n    282,\n    283,\n    287,\n    288,\n    289,\n    290,\n    291,\n    298,\n    299,\n    303,\n    304,\n    305,\n    306,\n    307\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/alexandria-plsql-utils/FunctionWithOutParameterCheck.json",
    "content": "{\n  \"extras/pdfgen_pkg.pkb\" : [\n    836,\n    841,\n    1870,\n    1870,\n    1870,\n    1879,\n    1879,\n    1879\n  ],\n  \"ora/ftp_util_pkg.pkb\" : [\n    87,\n    223,\n    266\n  ],\n  \"ora/ftp_util_pkg.pks\" : [\n    31,\n    48,\n    51\n  ],\n  \"ora/ntlm_http_pkg.pkb\" : [\n    28,\n    370\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/alexandria-plsql-utils/IfWithExitCheck.json",
    "content": "{\n  \"ora/date_util_pkg.pkb\" : [\n    618\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/alexandria-plsql-utils/InequalityUsageCheck.json",
    "content": "{\n  \"demos/pdf_builder_pkg_demo.sql\" : [\n    240\n  ],\n  \"extras/as_pdf3.pkb\" : [\n    1389,\n    1891,\n    1938,\n    2344,\n    2368,\n    2449,\n    2456,\n    2539,\n    2654,\n    2683,\n    2711,\n    2715,\n    2761,\n    2762,\n    2784,\n    2814,\n    2970,\n    3391\n  ],\n  \"extras/pdfgen_pkg.pkb\" : [\n    632,\n    670,\n    1115,\n    1115,\n    1589,\n    1593,\n    1908,\n    1928,\n    1949,\n    1952,\n    1955,\n    2021,\n    2021,\n    2274,\n    2354,\n    2373,\n    2557,\n    2561,\n    2569,\n    2579,\n    2583,\n    3346\n  ],\n  \"ora/flex_ws_api.pkb\" : [\n    518,\n    537\n  ],\n  \"ora/image_util_pkg.pkb\" : [\n    97,\n    98,\n    120,\n    164,\n    347\n  ],\n  \"ora/pdf_builder_pkg.pkb\" : [\n    649,\n    694,\n    695,\n    717,\n    1222,\n    1263,\n    1267\n  ],\n  \"ora/string_util_pkg.pkb\" : [\n    709\n  ],\n  \"ora/sylk_util_pkg.pkb\" : [\n    71\n  ],\n  \"ora/xlsx_builder_pkg.pkb\" : [\n    1968\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/alexandria-plsql-utils/InsertWithoutColumnsCheck.json",
    "content": "{\n  \"demos/01_create_demo_tables.sql\" : [\n    38,\n    41,\n    44,\n    47,\n    50,\n    53,\n    56,\n    59,\n    62,\n    65,\n    68,\n    71,\n    74,\n    77,\n    86,\n    87,\n    88,\n    89,\n    102,\n    103,\n    104,\n    105,\n    106,\n    111\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/alexandria-plsql-utils/NvlWithNullParameterCheck.json",
    "content": "{\n  \"extras/pdfgen_pkg.pkb\" : [\n    2835\n  ],\n  \"ora/json_util_pkg.pkb\" : [\n    317\n  ],\n  \"ora/xlsx_builder_pkg.pkb\" : [\n    689\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/alexandria-plsql-utils/ParsingErrorCheck.json",
    "content": "{\n  \"demos/string_util_pkg_demo.sql\" : [\n    39\n  ],\n  \"setup/grants.sql\" : [\n    5\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/alexandria-plsql-utils/QueryWithoutExceptionHandlingCheck.json",
    "content": "{\n  \"demos/employee_service.pkb\" : [\n    109\n  ],\n  \"demos/owa_util_pkg_demo.sql\" : [\n    29\n  ],\n  \"ora/flex_ws_api.pkb\" : [\n    98,\n    267,\n    443\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/alexandria-plsql-utils/SameBranchCheck.json",
    "content": "{\n  \"ora/rss_util_pkg.pkb\" : [\n    84\n  ],\n  \"ora/string_util_pkg.pkb\" : [\n    585\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/alexandria-plsql-utils/SelectAllColumnsCheck.json",
    "content": "{\n  \"demos/amazon_aws_s3_pkg_demo.sql\" : [\n    40,\n    61,\n    67\n  ],\n  \"demos/csv_util_pkg_demo.sql\" : [\n    3,\n    15,\n    33\n  ],\n  \"demos/datapump_util_pkg_demo.sql\" : [\n    4,\n    7\n  ],\n  \"demos/date_util_pkg_demo.sql\" : [\n    3\n  ],\n  \"demos/file_util_pkg_demo.sql\" : [\n    8\n  ],\n  \"demos/ms_ews_util_pkg_demo.sql\" : [\n    25,\n    71,\n    83,\n    88,\n    93,\n    183\n  ],\n  \"demos/random_util_pkg_demo.sql\" : [\n    25\n  ],\n  \"demos/rss_util_pkg_demo.sql\" : [\n    17,\n    20,\n    25,\n    28,\n    33\n  ],\n  \"demos/sql_util_pkg_demo.sql\" : [\n    5,\n    10\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/alexandria-plsql-utils/UnnecessaryAliasInQueryCheck.json",
    "content": "{\n  \"demos/csv_util_pkg_demo.sql\" : [\n    34\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/alexandria-plsql-utils/UnnecessaryElseCheck.json",
    "content": "{\n  \"ora/csv_util_pkg.pkb\" : [\n    210\n  ],\n  \"ora/regexp_util_pkg.pkb\" : [\n    42\n  ],\n  \"ora/string_util_pkg.pkb\" : [\n    270\n  ],\n  \"ora/sylk_util_pkg.pkb\" : [\n    86\n  ],\n  \"ora/xml_util_pkg.pkb\" : [\n    273\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/alexandria-plsql-utils/UnnecessaryNullStatementCheck.json",
    "content": "{\n  \"extras/pdfgen_pkg.pkb\" : [\n    1037,\n    1052,\n    2942\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/alexandria-plsql-utils/UnusedParameterCheck.json",
    "content": "{\n  \"demos/datapump_cloud_pkg.pkb\" : [\n    85,\n    149,\n    150\n  ],\n  \"demos/employee_service.pkb\" : [\n    66,\n    74\n  ],\n  \"extras/as_pdf3.pkb\" : [\n    2488\n  ],\n  \"extras/pdfgen_pkg.pkb\" : [\n    686,\n    830,\n    3230,\n    3551\n  ],\n  \"extras/utl_file_nonstandard.pkb\" : [\n    20\n  ],\n  \"ora/soap_server_pkg.pkb\" : [\n    88\n  ],\n  \"ora/xlsx_builder_pkg.pkb\" : [\n    832\n  ],\n  \"ora/xml_builder_pkg.pkb\" : [\n    126\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/alexandria-plsql-utils/UnusedVariableCheck.json",
    "content": "{\n  \"extras/as_pdf3.pkb\" : [\n    350,\n    461,\n    469,\n    634,\n    718,\n    2533,\n    2534,\n    2535,\n    2536,\n    2809,\n    3012,\n    3255\n  ],\n  \"extras/hash_util_pkg.pkb\" : [\n    23,\n    28,\n    191,\n    471,\n    859\n  ],\n  \"extras/pdfgen_pkg.pkb\" : [\n    1420,\n    1845,\n    1863,\n    1865,\n    1866,\n    1867,\n    1868,\n    1872,\n    2449\n  ],\n  \"ora/amazon_aws_s3_pkg.pkb\" : [\n    158,\n    394,\n    757,\n    833,\n    1155\n  ],\n  \"ora/flex_ws_api.pkb\" : [\n    90,\n    258\n  ],\n  \"ora/google_maps_js_pkg.pkb\" : [\n    133\n  ],\n  \"ora/icalendar_util_pkg.pkb\" : [\n    188\n  ],\n  \"ora/image_util_pkg.pkb\" : [\n    146,\n    389\n  ],\n  \"ora/math_util_pkg.pkb\" : [\n    49\n  ],\n  \"ora/ntlm_http_pkg.pkb\" : [\n    119,\n    122,\n    135,\n    360,\n    363\n  ],\n  \"ora/ntlm_util_pkg.pkb\" : [\n    20,\n    21,\n    22,\n    23,\n    24,\n    25,\n    27,\n    28,\n    31,\n    33,\n    34,\n    35,\n    37,\n    38,\n    39,\n    41,\n    43,\n    44,\n    45,\n    47,\n    346,\n    357,\n    368,\n    604,\n    721,\n    766\n  ],\n  \"ora/ooxml_util_pkg.pkb\" : [\n    226\n  ],\n  \"ora/pdf_builder_pkg.pkb\" : [\n    644\n  ],\n  \"ora/regexp_util_pkg.pkb\" : [\n    20\n  ],\n  \"ora/validation_util_pkg.pkb\" : [\n    19\n  ],\n  \"ora/xlsx_builder_pkg.pkb\" : [\n    1106\n  ],\n  \"ora/xml_dataset_pkg.pkb\" : [\n    279\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/alexandria-plsql-utils/UselessParenthesisCheck.json",
    "content": "{\n  \"ora/date_util_pkg.pkb\" : [\n    440,\n    441\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/alexandria-plsql-utils/VariableHidingCheck.json",
    "content": "{\n  \"extras/pdfgen_pkg.pkb\" : [\n    1023,\n    1421,\n    1618,\n    1863,\n    2886\n  ],\n  \"ora/ms_ews_util_pkg.pkb\" : [\n    328,\n    472,\n    554,\n    612,\n    773,\n    1128,\n    1148,\n    1229,\n    1300,\n    1320,\n    1467,\n    1588,\n    1657,\n    1784,\n    1890\n  ],\n  \"ora/ntlm_http_pkg.pkb\" : [\n    133,\n    134,\n    373,\n    405,\n    406\n  ],\n  \"ora/string_util_pkg.pkb\" : [\n    838\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/alexandria-plsql-utils/VariableInitializationWithFunctionCallCheck.json",
    "content": "{\n  \"demos/datapump_cloud_pkg.pkb\" : [\n    21,\n    22\n  ],\n  \"demos/plsql_status_web_pkg.pkb\" : [\n    17\n  ],\n  \"extras/as_pdf3.pkb\" : [\n    350,\n    2284\n  ],\n  \"extras/hash_util_pkg.pkb\" : [\n    19,\n    20,\n    192,\n    193,\n    194,\n    195,\n    196,\n    472,\n    473,\n    474,\n    475,\n    476,\n    477,\n    478,\n    479,\n    860,\n    861,\n    862,\n    863,\n    864,\n    865,\n    866,\n    867\n  ],\n  \"extras/pdfgen_pkg.pkb\" : [\n    796,\n    965,\n    1635\n  ],\n  \"extras/utl_file_nonstandard.pkb\" : [\n    23\n  ],\n  \"ora/amazon_aws_s3_pkg.pkb\" : [\n    717,\n    754,\n    830,\n    1153\n  ],\n  \"ora/csv_util_pkg.pkb\" : [\n    22\n  ],\n  \"ora/datapump_util_pkg.pkb\" : [\n    25,\n    86,\n    87,\n    89\n  ],\n  \"ora/date_util_pkg.pkb\" : [\n    635,\n    636\n  ],\n  \"ora/encode_util_pkg.pkb\" : [\n    45,\n    84,\n    145,\n    185\n  ],\n  \"ora/flex_ws_api.pkb\" : [\n    23,\n    49,\n    425\n  ],\n  \"ora/ntlm_util_pkg.pkb\" : [\n    17,\n    18,\n    19,\n    20,\n    21,\n    22,\n    23,\n    24,\n    25,\n    26,\n    27,\n    28,\n    29,\n    30,\n    31,\n    32,\n    33,\n    34,\n    35,\n    36,\n    37,\n    38,\n    39,\n    40,\n    41,\n    42,\n    43,\n    44,\n    45,\n    46,\n    47,\n    48,\n    494\n  ],\n  \"ora/pdf_builder_pkg.pkb\" : [\n    1077,\n    1078,\n    1079,\n    1080,\n    1081\n  ],\n  \"ora/random_util_pkg.pkb\" : [\n    24,\n    25,\n    85,\n    86,\n    393,\n    800\n  ],\n  \"ora/rss_util_pkg.pkb\" : [\n    103\n  ],\n  \"ora/string_util_pkg.pkb\" : [\n    433\n  ],\n  \"ora/string_util_pkg.pks\" : [\n    30,\n    31,\n    32,\n    34,\n    35\n  ],\n  \"ora/xlsx_builder_pkg.pkb\" : [\n    4,\n    5,\n    187,\n    258,\n    422,\n    665,\n    720,\n    750,\n    775,\n    801,\n    821,\n    842,\n    924,\n    952,\n    971,\n    985,\n    996,\n    1008,\n    1023\n  ],\n  \"ora/zip_util_pkg.pkb\" : [\n    425\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/alexandria-plsql-utils/VariableInitializationWithNullCheck.json",
    "content": "{\n  \"extras/pdfgen_pkg.pkb\" : [\n    878,\n    897\n  ],\n  \"extras/utl_file_nonstandard.pkb\" : [\n    26,\n    27\n  ],\n  \"ora/amazon_aws_auth_pkg.pkb\" : [\n    20\n  ],\n  \"ora/amazon_aws_s3_pkg.pks\" : [\n    54\n  ],\n  \"ora/ftp_util_pkg.pkb\" : [\n    146,\n    642,\n    684\n  ],\n  \"ora/google_translate_pkg.pkb\" : [\n    17,\n    145\n  ],\n  \"ora/google_translate_pkg.pks\" : [\n    108\n  ],\n  \"ora/paypal_util_pkg.pkb\" : [\n    207\n  ],\n  \"ora/sylk_util_pkg.pkb\" : [\n    53,\n    148\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/antlr-grammars-v4/AddParenthesesInNestedExpressionCheck.json",
    "content": "{\n  \"examples/condition03.sql\" : [\n    3,\n    8\n  ],\n  \"examples/condition05.sql\" : [\n    4\n  ],\n  \"examples/query_factoring05.sql\" : [\n    21\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/antlr-grammars-v4/ColumnsShouldHaveTableNameCheck.json",
    "content": "{\n  \"examples/bindvar05.sql\" : [\n    1,\n    1,\n    4\n  ],\n  \"examples/condition11.sql\" : [\n    1\n  ],\n  \"examples/dblink01.sql\" : [\n    1,\n    1\n  ],\n  \"examples/groupby06.sql\" : [\n    2,\n    2,\n    2,\n    2\n  ],\n  \"examples/query_factoring01.sql\" : [\n    12,\n    12,\n    12,\n    12\n  ],\n  \"examples/query_factoring06.sql\" : [\n    3\n  ],\n  \"examples/query_factoring09.sql\" : [\n    5\n  ],\n  \"examples/xmltable01.sql\" : [\n    3\n  ],\n  \"examples/xmltable03.sql\" : [\n    3,\n    4,\n    5\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/antlr-grammars-v4/CommitRollbackCheck.json",
    "content": "{\n  \"examples-sql-script/procedure_with_cursor_and_limit.sql\" : [\n    34,\n    41\n  ],\n  \"examples-sql-script/with_clause_in_exists_block_in_procedure.sql\" : [\n    17\n  ],\n  \"examples/forall_statement_and_exception_handling.sql\" : [\n    33,\n    53\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/antlr-grammars-v4/CursorBodyInPackageSpecCheck.json",
    "content": "{\n  \"examples-sql-script/package_with_cursor.sql\" : [\n    3\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/antlr-grammars-v4/DbmsOutputPutCheck.json",
    "content": "{\n  \"examples-sql-script/anonymous_block.sql\" : [\n    4,\n    7\n  ],\n  \"examples-sql-script/green_tools.pkb\" : [\n    7,\n    23,\n    25\n  ],\n  \"examples-sql-script/package_with_cursor.sql\" : [\n    19,\n    23\n  ],\n  \"examples/block01.sql\" : [\n    21,\n    26,\n    30\n  ],\n  \"examples/block02.sql\" : [\n    5\n  ],\n  \"examples/collection_method_invocation.sql\" : [\n    7,\n    8,\n    9,\n    13\n  ],\n  \"examples/concatenation-double_asterisk.sql\" : [\n    21\n  ],\n  \"examples/concatenation-mod.sql\" : [\n    21\n  ],\n  \"examples/create_package04.sql\" : [\n    10,\n    13\n  ],\n  \"examples/create_procedure03.sql\" : [\n    4,\n    13\n  ],\n  \"examples/fetch_statement.sql\" : [\n    40,\n    50\n  ],\n  \"examples/forall_bulk_rowcount.sql\" : [\n    9,\n    12\n  ],\n  \"examples/forall_statement_and_exception_handling.sql\" : [\n    46,\n    49,\n    56\n  ],\n  \"examples/general_element_part.sql\" : [\n    33\n  ],\n  \"examples/varray_type_def.sql\" : [\n    30\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/antlr-grammars-v4/DeclareSectionWithoutDeclarationsCheck.json",
    "content": "{\n  \"examples/block01.sql\" : [\n    24\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/antlr-grammars-v4/EmptyBlockCheck.json",
    "content": "{\n  \"examples-sql-script/declare_procedure_no_args.sql\" : [\n    5\n  ],\n  \"examples-sql-script/package_body_null.pkb\" : [\n    3\n  ],\n  \"examples-sql-script/package_with_schema.pkb\" : [\n    6\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/antlr-grammars-v4/ExplicitInParameterCheck.json",
    "content": "{\n  \"examples-sql-script/delete_as_regular_id.pkb\" : [\n    3\n  ],\n  \"examples-sql-script/in_out_parameters.pks\" : [\n    4\n  ],\n  \"examples-sql-script/pipe_row.pkb\" : [\n    16\n  ],\n  \"examples-sql-script/proc_over_dblink_as_nvl_param.pkb\" : [\n    3\n  ],\n  \"examples-sql-script/procedure_with_cursor_and_limit.sql\" : [\n    1,\n    1\n  ],\n  \"examples-sql-script/with_clause_in_exists_block_in_procedure.sql\" : [\n    1\n  ],\n  \"examples/create_function04.sql\" : [\n    3\n  ],\n  \"examples/create_function06.sql\" : [\n    5\n  ],\n  \"examples/create_package01.sql\" : [\n    4\n  ],\n  \"examples/create_procedure01.sql\" : [\n    1\n  ],\n  \"examples/package_body.sql\" : [\n    4\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/antlr-grammars-v4/IdenticalExpressionCheck.json",
    "content": "{\n  \"examples/condition02.sql\" : [\n    4\n  ],\n  \"examples/condition03.sql\" : [\n    4\n  ],\n  \"examples/condition09.sql\" : [\n    9\n  ],\n  \"examples/condition10.sql\" : [\n    4\n  ],\n  \"examples/quntitative_expression.sql\" : [\n    2,\n    3\n  ],\n  \"examples/union07.sql\" : [\n    23,\n    37\n  ],\n  \"examples/union09.sql\" : [\n    13,\n    19\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/antlr-grammars-v4/IfWithExitCheck.json",
    "content": "{\n  \"examples-sql-script/cursor-attributes-with-spaces.sql\" : [\n    22\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/antlr-grammars-v4/InequalityUsageCheck.json",
    "content": "{\n  \"examples/bindvar03.sql\" : [\n    15\n  ],\n  \"examples/connect_by03.sql\" : [\n    4\n  ],\n  \"examples/groupby01.sql\" : [\n    7\n  ],\n  \"examples/groupby02.sql\" : [\n    7\n  ],\n  \"examples/lexer01.sql\" : [\n    1,\n    1\n  ],\n  \"hw-examples/lexer01.sql\" : [\n    1,\n    1\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/antlr-grammars-v4/InsertWithoutColumnsCheck.json",
    "content": "{\n  \"examples/values_clause.sql\" : [\n    27\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/antlr-grammars-v4/ParsingErrorCheck.json",
    "content": "{\n  \"examples-sql-script/e_in_out_parameters.pks\" : [\n    4\n  ],\n  \"examples-sql-script/grants.sql\" : [\n    5\n  ],\n  \"examples-sql-script/logical_expressions.sql\" : [\n    13\n  ],\n  \"examples-sql-script/user.sql\" : [\n    1\n  ],\n  \"examples/administer_key_management.sql\" : [\n    1\n  ],\n  \"examples/aggregate_functions.sql\" : [\n    1\n  ],\n  \"examples/alter_analytic_view.sql\" : [\n    1\n  ],\n  \"examples/alter_attribute_dimension.sql\" : [\n    1\n  ],\n  \"examples/alter_audit_policy.sql\" : [\n    1\n  ],\n  \"examples/alter_database.sql\" : [\n    1\n  ],\n  \"examples/alter_dimension.sql\" : [\n    1\n  ],\n  \"examples/alter_diskgroup.sql\" : [\n    1\n  ],\n  \"examples/alter_flashback_archive.sql\" : [\n    1\n  ],\n  \"examples/alter_hierarchy.sql\" : [\n    1\n  ],\n  \"examples/alter_inmemory_join_group.sql\" : [\n    1\n  ],\n  \"examples/alter_java.sql\" : [\n    1\n  ],\n  \"examples/alter_library.sql\" : [\n    1\n  ],\n  \"examples/alter_lockdown_profile.sql\" : [\n    1\n  ],\n  \"examples/alter_materialized_zonemap.sql\" : [\n    1\n  ],\n  \"examples/alter_mv.sql\" : [\n    1\n  ],\n  \"examples/alter_mv_log.sql\" : [\n    1\n  ],\n  \"examples/alter_operator.sql\" : [\n    1\n  ],\n  \"examples/alter_outline.sql\" : [\n    1\n  ],\n  \"examples/alter_pmem_filestore.sql\" : [\n    1\n  ],\n  \"examples/alter_resource_cost.sql\" : [\n    1\n  ],\n  \"examples/alter_role.sql\" : [\n    1\n  ],\n  \"examples/alter_rollback_segment.sql\" : [\n    1\n  ],\n  \"examples/alter_synonym01.sql\" : [\n    1\n  ],\n  \"examples/alter_table.sql\" : [\n    35\n  ],\n  \"examples/alter_table_inmemory.sql\" : [\n    2\n  ],\n  \"examples/alter_table_modify_partition_by_range.sql\" : [\n    2\n  ],\n  \"examples/alter_table_modify_partition_shrink.sql\" : [\n    1\n  ],\n  \"examples/alter_tablespace_set.sql\" : [\n    1\n  ],\n  \"examples/alter_tablespaces.sql\" : [\n    1\n  ],\n  \"examples/alter_view.sql\" : [\n    1\n  ],\n  \"examples/analytic_query.sql\" : [\n    2\n  ],\n  \"examples/analyze.sql\" : [\n    1\n  ],\n  \"examples/associate_statistics.sql\" : [\n    1\n  ],\n  \"examples/audit.sql\" : [\n    1\n  ],\n  \"examples/bindvar04.sql\" : [\n    6\n  ],\n  \"examples/call.sql\" : [\n    1\n  ],\n  \"examples/cluster.sql\" : [\n    1\n  ],\n  \"examples/columns01.sql\" : [\n    6\n  ],\n  \"examples/commit.sql\" : [\n    4\n  ],\n  \"examples/context.sql\" : [\n    1\n  ],\n  \"examples/create_analytic_view.sql\" : [\n    1\n  ],\n  \"examples/create_attribute_dimension.sql\" : [\n    1\n  ],\n  \"examples/create_audit_policy.sql\" : [\n    1\n  ],\n  \"examples/create_controlfile.sql\" : [\n    1\n  ],\n  \"examples/create_database.sql\" : [\n    1\n  ],\n  \"examples/create_dimension.sql\" : [\n    1\n  ],\n  \"examples/create_diskgroup.sql\" : [\n    1\n  ],\n  \"examples/create_edition.sql\" : [\n    1\n  ],\n  \"examples/create_flashback_archive.sql\" : [\n    1\n  ],\n  \"examples/create_function03.sql\" : [\n    1\n  ],\n  \"examples/create_hierarchy.sql\" : [\n    1\n  ],\n  \"examples/create_index.sql\" : [\n    1\n  ],\n  \"examples/create_inmemory_join_group.sql\" : [\n    1\n  ],\n  \"examples/create_java.sql\" : [\n    1\n  ],\n  \"examples/create_library.sql\" : [\n    1\n  ],\n  \"examples/create_lockdown_profile.sql\" : [\n    1\n  ],\n  \"examples/create_materialized_zonemap.sql\" : [\n    1\n  ],\n  \"examples/create_operator.sql\" : [\n    1\n  ],\n  \"examples/create_outline.sql\" : [\n    1\n  ],\n  \"examples/create_package02.sql\" : [\n    12\n  ],\n  \"examples/create_package03.sql\" : [\n    8\n  ],\n  \"examples/create_package05.sql\" : [\n    19\n  ],\n  \"examples/create_pmem_filestore.sql\" : [\n    1\n  ],\n  \"examples/create_procedure02.sql\" : [\n    2\n  ],\n  \"examples/create_profile.sql\" : [\n    1\n  ],\n  \"examples/create_restore_point.sql\" : [\n    1\n  ],\n  \"examples/create_role.sql\" : [\n    1\n  ],\n  \"examples/create_rollback_segment.sql\" : [\n    1\n  ],\n  \"examples/create_spfile.sql\" : [\n    1\n  ],\n  \"examples/create_table.sql\" : [\n    14\n  ],\n  \"examples/create_tablespace.sql\" : [\n    1\n  ],\n  \"examples/create_tablespace_set.sql\" : [\n    1\n  ],\n  \"examples/create_trigger01.sql\" : [\n    7\n  ],\n  \"examples/create_trigger02.sql\" : [\n    2\n  ],\n  \"examples/create_view.sql\" : [\n    16\n  ],\n  \"examples/ctas.sql\" : [\n    1\n  ],\n  \"examples/dblink.sql\" : [\n    1\n  ],\n  \"examples/disassociate_statistics.sql\" : [\n    1\n  ],\n  \"examples/explain01.sql\" : [\n    1\n  ],\n  \"examples/fetch_clause01.sql\" : [\n    3\n  ],\n  \"examples/fetch_clause02.sql\" : [\n    3\n  ],\n  \"examples/fetch_clause04.sql\" : [\n    2\n  ],\n  \"examples/flashback01.sql\" : [\n    1\n  ],\n  \"examples/flashback_table.sql\" : [\n    1\n  ],\n  \"examples/forall_indices_of.sql\" : [\n    12\n  ],\n  \"examples/function03.sql\" : [\n    1\n  ],\n  \"examples/function06.sql\" : [\n    1\n  ],\n  \"examples/function07.sql\" : [\n    1\n  ],\n  \"examples/index.sql\" : [\n    1\n  ],\n  \"examples/interval01.sql\" : [\n    1\n  ],\n  \"examples/interval03.sql\" : [\n    16\n  ],\n  \"examples/join17.sql\" : [\n    4\n  ],\n  \"examples/join23.sql\" : [\n    3\n  ],\n  \"examples/json_sql.sql\" : [\n    4\n  ],\n  \"examples/materialized_views.sql\" : [\n    1\n  ],\n  \"examples/max_001.sql\" : [\n    4\n  ],\n  \"examples/model_clause01.sql\" : [\n    5\n  ],\n  \"examples/model_clause02.sql\" : [\n    7\n  ],\n  \"examples/model_clause03.sql\" : [\n    5\n  ],\n  \"examples/model_clause04.sql\" : [\n    7\n  ],\n  \"examples/model_clause05.sql\" : [\n    7\n  ],\n  \"examples/noaudit_statement.sql\" : [\n    1\n  ],\n  \"examples/offset_clause.sql\" : [\n    3\n  ],\n  \"examples/order_by04.sql\" : [\n    1\n  ],\n  \"examples/partitioned_tables.sql\" : [\n    32\n  ],\n  \"examples/purge_statement.sql\" : [\n    1\n  ],\n  \"examples/rename_objects.sql\" : [\n    2\n  ],\n  \"examples/revoke_statement.sql\" : [\n    1\n  ],\n  \"examples/sample01.sql\" : [\n    3\n  ],\n  \"examples/select_analytic_view.sql\" : [\n    2\n  ],\n  \"examples/select_cte.sql\" : [\n    6\n  ],\n  \"examples/select_dense_rank.sql\" : [\n    2\n  ],\n  \"examples/select_flashback_query.sql\" : [\n    2\n  ],\n  \"examples/select_time.sql\" : [\n    1\n  ],\n  \"examples/simple13.sql\" : [\n    1\n  ],\n  \"examples/single_statement.sql\" : [\n    1\n  ],\n  \"examples/truncate_cluster.sql\" : [\n    1\n  ],\n  \"examples/unified.sql\" : [\n    1\n  ],\n  \"examples/validate_conversion.sql\" : [\n    3\n  ],\n  \"examples/views.sql\" : [\n    6\n  ],\n  \"hw-examples/alter_operator.sql\" : [\n    1\n  ],\n  \"hw-examples/alter_outline.sql\" : [\n    1\n  ],\n  \"long-running/order_by07.sql\" : [\n    2\n  ],\n  \"long-running/query_factoring07.sql\" : [\n    61\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/antlr-grammars-v4/QueryWithoutExceptionHandlingCheck.json",
    "content": "{\n  \"examples-sql-script/select_into.sql\" : [\n    9,\n    13,\n    17\n  ],\n  \"examples/insert_statement.sql\" : [\n    4\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/antlr-grammars-v4/SelectAllColumnsCheck.json",
    "content": "{\n  \"examples-sql-script/green_table.sql\" : [\n    26\n  ],\n  \"examples-sql-script/package_with_cursor.sql\" : [\n    4\n  ],\n  \"examples-sql-script/with_clause_in_exists_block_in_procedure.sql\" : [\n    6\n  ],\n  \"examples/bindvar02.sql\" : [\n    1\n  ],\n  \"examples/cast_multiset01.sql\" : [\n    1\n  ],\n  \"examples/cast_multiset05.sql\" : [\n    1\n  ],\n  \"examples/cast_multiset08.sql\" : [\n    1\n  ],\n  \"examples/comments.sql\" : [\n    2\n  ],\n  \"examples/condition02.sql\" : [\n    1\n  ],\n  \"examples/condition03.sql\" : [\n    1\n  ],\n  \"examples/condition04.sql\" : [\n    1\n  ],\n  \"examples/condition05.sql\" : [\n    1\n  ],\n  \"examples/condition06.sql\" : [\n    1\n  ],\n  \"examples/condition07.sql\" : [\n    1\n  ],\n  \"examples/condition08.sql\" : [\n    1\n  ],\n  \"examples/condition12.sql\" : [\n    1\n  ],\n  \"examples/condition14.sql\" : [\n    1\n  ],\n  \"examples/condition16.sql\" : [\n    1\n  ],\n  \"examples/dblink01.sql\" : [\n    5,\n    7\n  ],\n  \"examples/for_update01.sql\" : [\n    1\n  ],\n  \"examples/groupby03.sql\" : [\n    1\n  ],\n  \"examples/groupby04.sql\" : [\n    1\n  ],\n  \"examples/groupby05.sql\" : [\n    1\n  ],\n  \"examples/join06.sql\" : [\n    1\n  ],\n  \"examples/join07.sql\" : [\n    1\n  ],\n  \"examples/join08.sql\" : [\n    1,\n    2,\n    3,\n    4,\n    5,\n    6,\n    7\n  ],\n  \"examples/join09.sql\" : [\n    1,\n    2,\n    3,\n    4,\n    5,\n    6,\n    7\n  ],\n  \"examples/join10.sql\" : [\n    1,\n    3\n  ],\n  \"examples/join11.sql\" : [\n    1\n  ],\n  \"examples/join12.sql\" : [\n    1\n  ],\n  \"examples/join13.sql\" : [\n    1\n  ],\n  \"examples/join14.sql\" : [\n    1\n  ],\n  \"examples/join15.sql\" : [\n    1\n  ],\n  \"examples/join16.sql\" : [\n    1\n  ],\n  \"examples/join19.sql\" : [\n    1,\n    1\n  ],\n  \"examples/join20.sql\" : [\n    1,\n    1\n  ],\n  \"examples/join21.sql\" : [\n    1\n  ],\n  \"examples/join22.sql\" : [\n    1,\n    3\n  ],\n  \"examples/keywordasidentifier06.sql\" : [\n    1\n  ],\n  \"examples/lexer01.sql\" : [\n    1\n  ],\n  \"examples/merge01.sql\" : [\n    2\n  ],\n  \"examples/merge02.sql\" : [\n    2\n  ],\n  \"examples/order_by01.sql\" : [\n    1\n  ],\n  \"examples/order_by02.sql\" : [\n    1\n  ],\n  \"examples/order_by03.sql\" : [\n    1\n  ],\n  \"examples/order_by05.sql\" : [\n    1\n  ],\n  \"examples/order_by06.sql\" : [\n    1,\n    1\n  ],\n  \"examples/pivot01.sql\" : [\n    1\n  ],\n  \"examples/pivot02.sql\" : [\n    1\n  ],\n  \"examples/pivot03.sql\" : [\n    1\n  ],\n  \"examples/pivot05.sql\" : [\n    1\n  ],\n  \"examples/pivot06.sql\" : [\n    1\n  ],\n  \"examples/pivot07.sql\" : [\n    1\n  ],\n  \"examples/pivot08.sql\" : [\n    1\n  ],\n  \"examples/pivot09.sql\" : [\n    1\n  ],\n  \"examples/pivot10.sql\" : [\n    1\n  ],\n  \"examples/pivot11.sql\" : [\n    1\n  ],\n  \"examples/pivot13.sql\" : [\n    8\n  ],\n  \"examples/query_factoring05.sql\" : [\n    15\n  ],\n  \"examples/query_factoring06.sql\" : [\n    10\n  ],\n  \"examples/query_factoring08.sql\" : [\n    2,\n    3,\n    5\n  ],\n  \"examples/select_all_some_any.sql\" : [\n    2,\n    3,\n    4\n  ],\n  \"examples/simple04.sql\" : [\n    1,\n    4\n  ],\n  \"examples/simple05.sql\" : [\n    1,\n    3\n  ],\n  \"examples/simple06.sql\" : [\n    1,\n    1\n  ],\n  \"examples/simple07.sql\" : [\n    1\n  ],\n  \"examples/simple11.sql\" : [\n    1\n  ],\n  \"examples/simple12.sql\" : [\n    4\n  ],\n  \"examples/union05.sql\" : [\n    1,\n    4,\n    8,\n    12,\n    16,\n    20,\n    24,\n    28\n  ],\n  \"examples/union07.sql\" : [\n    5,\n    6,\n    8,\n    11\n  ],\n  \"examples/union08.sql\" : [\n    1\n  ],\n  \"examples/union09.sql\" : [\n    1,\n    2,\n    4,\n    7\n  ],\n  \"hw-examples/lexer01.sql\" : [\n    1\n  ],\n  \"hw-examples/simple11.sql\" : [\n    1\n  ],\n  \"long-running/aggregate01.sql\" : [\n    11\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/antlr-grammars-v4/ToDateWithoutFormatCheck.json",
    "content": "{\n  \"examples/to_date.sql\" : [\n    1,\n    7,\n    10,\n    13,\n    16,\n    19\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/antlr-grammars-v4/UnnecessaryAliasInQueryCheck.json",
    "content": "{\n  \"examples-sql-script/procedure_with_cursor_and_limit.sql\" : [\n    16,\n    17\n  ],\n  \"examples/bindvar03.sql\" : [\n    5,\n    13\n  ],\n  \"examples/bindvar05.sql\" : [\n    5,\n    5\n  ],\n  \"examples/case_when07.sql\" : [\n    6\n  ],\n  \"examples/case_when08.sql\" : [\n    3\n  ],\n  \"examples/cast_multiset01.sql\" : [\n    2,\n    4\n  ],\n  \"examples/condition02.sql\" : [\n    2\n  ],\n  \"examples/condition03.sql\" : [\n    2\n  ],\n  \"examples/condition09.sql\" : [\n    4,\n    5,\n    6\n  ],\n  \"examples/condition10.sql\" : [\n    2\n  ],\n  \"examples/condition16.sql\" : [\n    1\n  ],\n  \"examples/for_update08.sql\" : [\n    2\n  ],\n  \"examples/join01.sql\" : [\n    2,\n    2\n  ],\n  \"examples/join02.sql\" : [\n    2,\n    2\n  ],\n  \"examples/join03.sql\" : [\n    2,\n    2\n  ],\n  \"examples/join04.sql\" : [\n    2,\n    2\n  ],\n  \"examples/join22.sql\" : [\n    2,\n    3\n  ],\n  \"examples/keywordasidentifier03.sql\" : [\n    14,\n    14,\n    22\n  ],\n  \"examples/keywordasidentifier04.sql\" : [\n    2,\n    5\n  ],\n  \"examples/multiset_operators.sql\" : [\n    3\n  ],\n  \"examples/object_access_expressions.sql\" : [\n    9\n  ],\n  \"examples/pivot02.sql\" : [\n    3\n  ],\n  \"examples/pivot03.sql\" : [\n    3\n  ],\n  \"examples/query_factoring01.sql\" : [\n    9,\n    9,\n    13,\n    13\n  ],\n  \"examples/query_factoring02.sql\" : [\n    12,\n    12\n  ],\n  \"examples/query_factoring03.sql\" : [\n    9,\n    9\n  ],\n  \"examples/query_factoring04.sql\" : [\n    10,\n    10\n  ],\n  \"examples/query_factoring06.sql\" : [\n    4,\n    4\n  ],\n  \"examples/select_all_some_any.sql\" : [\n    6\n  ],\n  \"examples/to_date.sql\" : [\n    9\n  ],\n  \"examples/union07.sql\" : [\n    21,\n    36\n  ],\n  \"examples/xmltable03.sql\" : [\n    6\n  ],\n  \"long-running/aggregate01.sql\" : [\n    34\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/antlr-grammars-v4/UnnecessaryLikeCheck.json",
    "content": "{\n  \"examples/condition06.sql\" : [\n    13,\n    13\n  ],\n  \"examples/query_factoring05.sql\" : [\n    22\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/antlr-grammars-v4/UnusedParameterCheck.json",
    "content": "{\n  \"examples-sql-script/substr_as_regular_id.pkb\" : [\n    3\n  ],\n  \"examples-sql-script/with_clause_in_exists_block_in_procedure.sql\" : [\n    1\n  ],\n  \"examples/create_function04.sql\" : [\n    3\n  ],\n  \"examples/create_function05.sql\" : [\n    2,\n    3,\n    4\n  ],\n  \"examples/create_procedure01.sql\" : [\n    1\n  ],\n  \"examples/package_body.sql\" : [\n    4\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/antlr-grammars-v4/UnusedVariableCheck.json",
    "content": "{\n  \"examples-sql-script/anonymous_block.sql\" : [\n    2\n  ],\n  \"examples-sql-script/cursor-attributes-with-spaces.sql\" : [\n    15\n  ],\n  \"examples-sql-script/declare_procedure_no_args.sql\" : [\n    3\n  ],\n  \"examples-sql-script/proc_over_dblink_as_nvl_param.pkb\" : [\n    6\n  ],\n  \"examples/bulk_collect_fetch_clause01.sql\" : [\n    4\n  ],\n  \"examples/create_procedure01.sql\" : [\n    4\n  ],\n  \"examples/package_body.sql\" : [\n    3\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/antlr-grammars-v4/UselessParenthesisCheck.json",
    "content": "{\n  \"examples/condition06.sql\" : [\n    13\n  ],\n  \"examples/condition08.sql\" : [\n    5\n  ],\n  \"examples/condition15.sql\" : [\n    10\n  ],\n  \"long-running/cast_multiset07.sql\" : [\n    10\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0001/CommitRollbackCheck.json",
    "content": "{\n  \"UPLOAD_DB.pcd\" : [\n    22\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0001/DeclareSectionWithoutDeclarationsCheck.json",
    "content": "{\n  \"WEBUTIL_DEMO/PRE-FORM.tgg\" : [\n    2\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0001/EmptyStringAssignmentCheck.json",
    "content": "{\n  \"FILES_WBP.pcd\" : [\n    65\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0001/ExplicitInParameterCheck.json",
    "content": "{\n  \"SET_BROWSER_MESSAGE.pcd\" : [\n    1\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0001/InvalidReferenceToObjectCheck.json",
    "content": "{\n  \"BUILTINS/BUILTINS__READ_IMAGE__WHEN-BUTTON-PRESSED.tgg\" : [\n    5\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0001/QueryWithoutExceptionHandlingCheck.json",
    "content": "{\n  \"F_GET_TIMER_VALUE.fun\" : [\n    6\n  ],\n  \"WEBUTIL_DEMO/WHEN-NEW-FORM-INSTANCE.tgg\" : [\n    20\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0001/UnnecessaryElseCheck.json",
    "content": "{\n  \"WEBUTIL_DEMO/PRE-FORM.tgg\" : [\n    26\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0001/UnusedVariableCheck.json",
    "content": "{\n  \"DOWNLOAD_AS.pcd\" : [\n    3\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0001/VariableInitializationWithFunctionCallCheck.json",
    "content": "{\n  \"C_API/C_API__CALL_C_API__WHEN-BUTTON-PRESSED.tgg\" : [\n    9\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0001/VariableInitializationWithNullCheck.json",
    "content": "{\n  \"HOST/HOST__RUN_HOST__WHEN-BUTTON-PRESSED.tgg\" : [\n    3\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0002/EmptyBlockCheck.json",
    "content": "{\n  \"BL_EMPLOYEES.pkb\" : [\n    13,\n    18,\n    23,\n    28,\n    33,\n    38,\n    43,\n    48\n  ],\n  \"BL_MAINBLOCK.pkb\" : [\n    5,\n    10,\n    15,\n    20,\n    25,\n    30,\n    35,\n    40,\n    45\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0002/VariableInitializationWithFunctionCallCheck.json",
    "content": "{\n  \"CONST_LOCAL.pks\" : [\n    12,\n    13,\n    14,\n    17\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0002_2/EmptyBlockCheck.json",
    "content": "{\n  \"WNB.pcd\" : [\n    3\n  ],\n  \"WNF.pcd\" : [\n    3\n  ],\n  \"WNI.pcd\" : [\n    3\n  ],\n  \"WNR.pcd\" : [\n    3\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0003/EmptyBlockCheck.json",
    "content": "{\n  \"BL_MAINBLOCK.pkb\" : [\n    5,\n    10,\n    15,\n    20,\n    25,\n    30,\n    35,\n    40,\n    45\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0003/InequalityUsageCheck.json",
    "content": "{\n  \"EMPLOYEES_LI/EMPLOYEES_LI__PRE-QUERY.tgg\" : [\n    2\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0003/VariableInitializationWithFunctionCallCheck.json",
    "content": "{\n  \"CONST_LOCAL.pks\" : [\n    12,\n    13,\n    14,\n    15,\n    18\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0004/ExplicitInParameterCheck.json",
    "content": "{\n  \"ERRORMESSAGE.pcd\" : [\n    1\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0004/InequalityUsageCheck.json",
    "content": "{\n  \"RELEASE_LOCKS/POST-FORM.tgg\" : [\n    5\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0004/RaiseStandardExceptionCheck.json",
    "content": "{\n  \"V$LOCK/V$LOCK__POST-QUERY.tgg\" : [\n    51\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0004/ReturnOfBooleanExpressionCheck.json",
    "content": "{\n  \"IS_DBA.fun\" : [\n    11\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0004/UnnecessaryElseCheck.json",
    "content": "{\n  \"IS_DBA.fun\" : [\n    13\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0004/UnusedVariableCheck.json",
    "content": "{\n  \"V$SESSION/V$SESSION__PB_KILL_SESSION__WHEN-BUTTON-PRESSED.tgg\" : [\n    3,\n    4\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0004/VariableInitializationWithFunctionCallCheck.json",
    "content": "{\n  \"RELEASE_LOCKS/POST-FORM.tgg\" : [\n    3\n  ],\n  \"STEUERBLOCK/STEUERBLOCK__PB_CONNECT__WHEN-BUTTON-PRESSED.tgg\" : [\n    3,\n    4,\n    5\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0005/EmptyBlockCheck.json",
    "content": "{\n  \"TIMEOUTPJC_TEST/ON-LOGON.tgg\" : [\n    2\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0005/EmptyStringAssignmentCheck.json",
    "content": "{\n  \"TEST/TEST__PRESET1__WHEN-BUTTON-PRESSED.tgg\" : [\n    7\n  ],\n  \"TEST/TEST__PRESET2__WHEN-BUTTON-PRESSED.tgg\" : [\n    7\n  ],\n  \"TEST/TEST__PRESET3__WHEN-BUTTON-PRESSED.tgg\" : [\n    8\n  ],\n  \"TEST/TEST__PRESET4__WHEN-BUTTON-PRESSED.tgg\" : [\n    8\n  ],\n  \"TEST/TEST__PRESET5__WHEN-BUTTON-PRESSED.tgg\" : [\n    8\n  ],\n  \"TEST/TEST__PRESET6__WHEN-BUTTON-PRESSED.tgg\" : [\n    8\n  ],\n  \"TEST/TEST__PRESET7__WHEN-BUTTON-PRESSED.tgg\" : [\n    8\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0005/InvalidReferenceToObjectCheck.json",
    "content": "{\n  \"TIMEOUTPJC_TEST/WHEN-NEW-FORM-INSTANCE.tgg\" : [\n    3\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0006/QueryWithoutExceptionHandlingCheck.json",
    "content": "{\n  \"F_GET_TIMER_VALUE.fun\" : [\n    6\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0007/InequalityUsageCheck.json",
    "content": "{\n  \"ALL_OBJECTS/ALL_OBJECTS__CALL_EXCEL__WHEN-BUTTON-PRESSED.tgg\" : [\n    10\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0008/EmptyBlockCheck.json",
    "content": "{\n  \"LATENCY_TEST/ON-LOGON.tgg\" : [\n    2\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0008/InvalidReferenceToObjectCheck.json",
    "content": "{\n  \"P_WHEN_NEW_FORM_INSTANCE.pcd\" : [\n    13,\n    14,\n    15,\n    30,\n    50,\n    70,\n    90\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0008/UnusedVariableCheck.json",
    "content": "{\n  \"LATENCY_TEST/WHEN-TIMER-EXPIRED.tgg\" : [\n    18\n  ],\n  \"P_DOWNLOAD_DOKUMENT_AS.pcd\" : [\n    3,\n    7,\n    9\n  ],\n  \"WEBUTIL_PREPARE_TESTFILE.pcd\" : [\n    21,\n    22\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0009/CharacterDatatypeUsageCheck.json",
    "content": "{\n  \"G.pkb\" : [\n    47,\n    62\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0009/CollapsibleIfStatementsCheck.json",
    "content": "{\n  \"BLK_HANDLG/BLK_HANDLG__BT_COMPILE_SINGLE__WHEN-BUTTON-PRESSED.tgg\" : [\n    22,\n    28,\n    34,\n    40,\n    46,\n    52,\n    58\n  ],\n  \"PKG_BLK_DATA.pkb\" : [\n    221\n  ],\n  \"PRC_CHECK_FAM.pcd\" : [\n    98\n  ],\n  \"PRC_COMPILATION.pcd\" : [\n    6,\n    11,\n    16,\n    21,\n    26,\n    31,\n    36\n  ],\n  \"PRC_MIGRATION.pcd\" : [\n    8,\n    13,\n    19,\n    24,\n    29\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0009/DeadCodeCheck.json",
    "content": "{\n  \"PKG_CONFIG.pkb\" : [\n    500\n  ],\n  \"PRC_CHECK_FAM.pcd\" : [\n    91,\n    131\n  ],\n  \"PRC_GET_CHK_REF_INFO.pcd\" : [\n    32,\n    59\n  ],\n  \"PRC_SET_MIGRATE_RESULT.pcd\" : [\n    29,\n    57\n  ],\n  \"PRC_SET_STATISTIK.pcd\" : [\n    52,\n    95,\n    134,\n    161\n  ],\n  \"PRC_SET_STATISTIK_SINGLE.pcd\" : [\n    51,\n    94,\n    132,\n    158\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0009/DeclareSectionWithoutDeclarationsCheck.json",
    "content": "{\n  \"FORMSAPI_WIZARD_2905/ON-LOGON.tgg\" : [\n    3\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0009/EmptyBlockCheck.json",
    "content": "{\n  \"BLK_HANDLG/BLK_HANDLG__CBOX_FAM_ACTION__WHEN-LIST-CHANGED.tgg\" : [\n    37\n  ],\n  \"BLK_HANDLG/BLK_HANDLG__CB__WHEN-CHECKBOX-CHANGED.tgg\" : [\n    18\n  ],\n  \"FORMSAPI_WIZARD_2905/MODULE_FEATURES.tgg\" : [\n    8\n  ],\n  \"FORMSAPI_WIZARD_2905/ON-LOGON.tgg\" : [\n    9\n  ],\n  \"PKG_BLK_DATA.pkb\" : [\n    58\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0009/EmptyStringAssignmentCheck.json",
    "content": "{\n  \"PKG_CONFIG.pkb\" : [\n    457\n  ],\n  \"PRC_CHECK_FAM.pcd\" : [\n    71,\n    111\n  ],\n  \"PRC_GET_CHK_REF_INFO.pcd\" : [\n    7\n  ],\n  \"PRC_SET_MIGRATE_RESULT.pcd\" : [\n    9,\n    37\n  ],\n  \"PRC_SET_STATISTIK.pcd\" : [\n    13,\n    109\n  ],\n  \"PRC_SET_STATISTIK_SINGLE.pcd\" : [\n    13,\n    108\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0009/ExplicitInParameterCheck.json",
    "content": "{\n  \"FNC_FILE_EXISTS_HOST.fun\" : [\n    1\n  ],\n  \"G.pkb\" : [\n    22\n  ],\n  \"G.pks\" : [\n    24\n  ],\n  \"PKG_BLK_DATA.pkb\" : [\n    10,\n    11,\n    12,\n    13,\n    14,\n    15,\n    16,\n    17,\n    26,\n    26,\n    63,\n    97,\n    97,\n    97,\n    97,\n    97,\n    97,\n    97,\n    98,\n    128,\n    128,\n    158,\n    158,\n    158,\n    239\n  ],\n  \"PKG_BLK_DATA.pks\" : [\n    48,\n    48,\n    48,\n    50\n  ],\n  \"PKG_CONFIG.pkb\" : [\n    85,\n    86,\n    87,\n    88,\n    89,\n    90,\n    91,\n    92,\n    130,\n    130,\n    183,\n    294,\n    294,\n    309,\n    309,\n    326,\n    326,\n    341,\n    341,\n    360\n  ],\n  \"PKG_CONFIG.pks\" : [\n    11,\n    13,\n    15,\n    15,\n    17,\n    17,\n    19,\n    19,\n    21,\n    21\n  ],\n  \"PKG_FAM_RUN_SCRIPT.pkb\" : [\n    76,\n    77,\n    78,\n    79,\n    80,\n    81,\n    82,\n    83,\n    91,\n    91,\n    120,\n    154,\n    154,\n    154,\n    201,\n    201,\n    201,\n    250,\n    295,\n    347,\n    386\n  ],\n  \"PKG_FAM_RUN_SCRIPT.pks\" : [\n    6,\n    8,\n    8,\n    8,\n    10,\n    10,\n    10,\n    12,\n    14,\n    16,\n    18,\n    20,\n    20\n  ],\n  \"PRC_CMD_HOST_CLIENT.pcd\" : [\n    4,\n    4\n  ],\n  \"PRC_COPY_FILE.pcd\" : [\n    1,\n    1\n  ],\n  \"PRC_COPY_FILE_HOST.pcd\" : [\n    1,\n    1\n  ],\n  \"PRC_ERROR.pcd\" : [\n    1\n  ],\n  \"PRC_EXCEPTION.pcd\" : [\n    1,\n    1\n  ],\n  \"PRC_FILE_MERGE.pcd\" : [\n    1,\n    1,\n    1,\n    1\n  ],\n  \"PRC_FILE_MERGE_HOST.pcd\" : [\n    1,\n    1,\n    1,\n    1\n  ],\n  \"PRC_FLOG.pcd\" : [\n    1,\n    2,\n    3,\n    4,\n    5,\n    6,\n    7,\n    8\n  ],\n  \"PRC_GET_CHK_REF_INFO.pcd\" : [\n    1\n  ],\n  \"PRC_INFO.pcd\" : [\n    1\n  ],\n  \"PRC_MSG.pcd\" : [\n    7,\n    8,\n    9,\n    10,\n    11,\n    12,\n    13,\n    14,\n    15,\n    32\n  ],\n  \"PRC_SET_COMPILE_RESULT.pcd\" : [\n    1\n  ],\n  \"PRC_SET_MIGRATE_RESULT.pcd\" : [\n    1\n  ],\n  \"PRC_SET_STATISTIK.pcd\" : [\n    5,\n    5,\n    103\n  ],\n  \"PRC_SET_STATISTIK_SINGLE.pcd\" : [\n    5,\n    5,\n    102\n  ],\n  \"PRC_SHOW_DURATION.pcd\" : [\n    3,\n    3\n  ],\n  \"PRC_SHOW_INIT.pcd\" : [\n    1,\n    1,\n    1\n  ],\n  \"PRC_VIEW_FILE.pcd\" : [\n    1,\n    10\n  ],\n  \"PRC_WRITE_SCRIPT.pcd\" : [\n    2,\n    2\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0009/IfWithExitCheck.json",
    "content": "{\n  \"BLK_HANDLG/BLK_HANDLG__BT_SELECT__WHEN-BUTTON-PRESSED.tgg\" : [\n    27\n  ],\n  \"CTL_BASIC/CTL_BASIC__BT_ALL__WHEN-BUTTON-PRESSED.tgg\" : [\n    63,\n    98\n  ],\n  \"CTL_BASIC/CTL_BASIC__BT_COMPILE__WHEN-BUTTON-PRESSED.tgg\" : [\n    23\n  ],\n  \"CTL_BASIC/CTL_BASIC__BT_MIGRATE__WHEN-BUTTON-PRESSED.tgg\" : [\n    19\n  ],\n  \"PRC_SET_STATISTIK.pcd\" : [\n    236\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0009/SameBranchCheck.json",
    "content": "{\n  \"PRC_SET_COMPILE_RESULT.pcd\" : [\n    14,\n    16,\n    18,\n    29,\n    31,\n    33\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0009/UnnecessaryElseCheck.json",
    "content": "{\n  \"FNC_GET_FILE_SEPARATOR.fun\" : [\n    5\n  ],\n  \"PKG_CONFIG.pkb\" : [\n    428,\n    448\n  ],\n  \"PRC_GET_CHK_REF_INFO.pcd\" : [\n    20,\n    47\n  ],\n  \"PRC_VIEW_FILE.pcd\" : [\n    74\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0009/UnusedParameterCheck.json",
    "content": "{\n  \"PKG_BLK_DATA.pkb\" : [\n    97,\n    97,\n    97,\n    98,\n    158,\n    158\n  ],\n  \"PRC_MSG.pcd\" : [\n    13\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0009/UnusedVariableCheck.json",
    "content": "{\n  \"BLK_HANDLG/BLK_HANDLG__BT_COMPILE_SINGLE__WHEN-BUTTON-PRESSED.tgg\" : [\n    5,\n    6\n  ],\n  \"BLK_HANDLG/BLK_HANDLG__BT_VIEW_COMPILE__WHEN-BUTTON-PRESSED.tgg\" : [\n    7\n  ],\n  \"BLK_HANDLG/BLK_HANDLG__CBOX_FAM_ACTION__WHEN-LIST-CHANGED.tgg\" : [\n    5,\n    6,\n    7,\n    8,\n    9,\n    10,\n    11,\n    12\n  ],\n  \"CTL_BASIC/CTL_BASIC__BT_ALL__WHEN-BUTTON-PRESSED.tgg\" : [\n    9,\n    86\n  ],\n  \"CTL_BASIC/CTL_BASIC__BT_COMPILE__WHEN-BUTTON-PRESSED.tgg\" : [\n    7\n  ],\n  \"G.pkb\" : [\n    20\n  ],\n  \"PKG_BLK_DATA.pkb\" : [\n    129,\n    161,\n    162,\n    166,\n    168\n  ],\n  \"PKG_CONFIG.pkb\" : [\n    369,\n    371,\n    377\n  ],\n  \"PRC_COMPILATION.pcd\" : [\n    43\n  ],\n  \"PRC_COPY_FILE_HOST.pcd\" : [\n    2\n  ],\n  \"PRC_MIGRATION.pcd\" : [\n    36\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0009/VariableHidingCheck.json",
    "content": "{\n  \"CTL_BASIC/CTL_BASIC__BT_ALL__WHEN-BUTTON-PRESSED.tgg\" : [\n    86\n  ],\n  \"PKG_CONFIG.pkb\" : [\n    410\n  ],\n  \"PRC_MSG.pcd\" : [\n    33\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0009/VariableInitializationWithNullCheck.json",
    "content": "{\n  \"G.pks\" : [\n    7,\n    15\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0010/EmptyBlockCheck.json",
    "content": "{\n  \"CHK_MYFFI_SAMPLE5/ON-LOGON.tgg\" : [\n    2\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0010/ExplicitInParameterCheck.json",
    "content": "{\n  \"FNC_BOOL.fun\" : [\n    1\n  ],\n  \"PRC_SHOW.pcd\" : [\n    1\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0010/UnnecessaryElseCheck.json",
    "content": "{\n  \"FNC_BOOL.fun\" : [\n    4\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0010/UnusedVariableCheck.json",
    "content": "{\n  \"BLK/BLK__PB_WEB_FFI__WHEN-BUTTON-PRESSED.tgg\" : [\n    12\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0010/VariableInitializationWithFunctionCallCheck.json",
    "content": "{\n  \"BLK/BLK__PB_WEB_FFI__WHEN-BUTTON-PRESSED.tgg\" : [\n    5\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0011/CommitRollbackCheck.json",
    "content": "{\n  \"UPLOAD_DB.pcd\" : [\n    22\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0011/EmptyStringAssignmentCheck.json",
    "content": "{\n  \"FILES_WBP.pcd\" : [\n    65\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0011/ExplicitInParameterCheck.json",
    "content": "{\n  \"SET_BROWSER_MESSAGE.pcd\" : [\n    1\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0011/InvalidReferenceToObjectCheck.json",
    "content": "{\n  \"BUILTINS/BUILTINS__READ_IMAGE__WHEN-BUTTON-PRESSED.tgg\" : [\n    5\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0011/QueryWithoutExceptionHandlingCheck.json",
    "content": "{\n  \"WEBUTIL_DEMO/WHEN-NEW-FORM-INSTANCE.tgg\" : [\n    20\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0011/SameBranchCheck.json",
    "content": "{\n  \"WEBUTIL_DEMO/KEY-EXIT.tgg\" : [\n    21\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0011/UnnecessaryElseCheck.json",
    "content": "{\n  \"OLE/OLE__WRITE__WHEN-BUTTON-PRESSED.tgg\" : [\n    10\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0011/VariableInitializationWithFunctionCallCheck.json",
    "content": "{\n  \"C_API/C_API__CALL_C_API__WHEN-BUTTON-PRESSED.tgg\" : [\n    9\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0011/VariableInitializationWithNullCheck.json",
    "content": "{\n  \"HOST/HOST__RUN_HOST__WHEN-BUTTON-PRESSED.tgg\" : [\n    3\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0012/EmptyBlockCheck.json",
    "content": "{\n  \"PDFVIEWER/ON-LOGON.tgg\" : [\n    2\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0012/VariableInitializationWithFunctionCallCheck.json",
    "content": "{\n  \"PDFVIEWER/WHEN-NEW-FORM-INSTANCE.tgg\" : [\n    3\n  ],\n  \"PDFVIEWER/WHEN-TIMER-EXPIRED.tgg\" : [\n    3\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0013/EmptyBlockCheck.json",
    "content": "{\n  \"COLOR_SLIDER/ON-LOGON.tgg\" : [\n    2\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0013/VariableInitializationWithFunctionCallCheck.json",
    "content": "{\n  \"PKG_SLIDER.pkb\" : [\n    11,\n    12,\n    13,\n    14\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0013/VariableInitializationWithNullCheck.json",
    "content": "{\n  \"PKG_SLIDER.pks\" : [\n    14\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0013/VariableNameCheck.json",
    "content": "{\n  \"PKG_SLIDER.pkb\" : [\n    11,\n    12,\n    13,\n    14,\n    15\n  ],\n  \"PKG_SLIDER.pks\" : [\n    4,\n    5,\n    6,\n    7,\n    8,\n    9,\n    10,\n    11,\n    14\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0014/SameBranchCheck.json",
    "content": "{\n  \"PK_TREE.pkb\" : [\n    75\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0014/VariableInitializationWithFunctionCallCheck.json",
    "content": "{\n  \"PK_TREE.pkb\" : [\n    3\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0016/DeclareSectionWithoutDeclarationsCheck.json",
    "content": "{\n  \"C/C__CBOX__KEY-NEXT-ITEM.tgg\" : [\n    2\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0016/EmptyBlockCheck.json",
    "content": "{\n  \"CBX/CBX__ON-ERROR.tgg\" : [\n    5\n  ],\n  \"PKG_CBOX.pkb\" : [\n    138\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0016/ExplicitInParameterCheck.json",
    "content": "{\n  \"PKG_CBOX.pkb\" : [\n    14,\n    23,\n    23,\n    48\n  ],\n  \"PKG_CBOX.pks\" : [\n    3,\n    4,\n    4,\n    5\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0016/InvalidReferenceToObjectCheck.json",
    "content": "{\n  \"C/C__CBOX__KEY-NEXT-ITEM.tgg\" : [\n    12\n  ],\n  \"CHK_CBOX3/WHEN-TIMER-EXPIRED.tgg\" : [\n    2\n  ],\n  \"PKG_CBOX.pkb\" : [\n    65\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0016/UnusedVariableCheck.json",
    "content": "{\n  \"PKG_CBOX.pkb\" : [\n    27,\n    28,\n    53,\n    54\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0016/VariableInitializationWithFunctionCallCheck.json",
    "content": "{\n  \"PKG_CBOX.pkb\" : [\n    26\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0017/CharacterDatatypeUsageCheck.json",
    "content": "{\n  \"V#R#FY_PW$001.fun\" : [\n    33,\n    35\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0017/CollapsibleIfStatementsCheck.json",
    "content": "{\n  \"V#R#FY_PW$001.fun\" : [\n    67\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0017/DuplicatedValueInInCheck.json",
    "content": "{\n  \"V#R#FY_PW$001.fun\" : [\n    61,\n    61,\n    61\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0017/ExplicitInParameterCheck.json",
    "content": "{\n  \"FNC_MSG_QUERY.fun\" : [\n    1\n  ],\n  \"FNC_VALIDATE.fun\" : [\n    1\n  ],\n  \"PKG_ITEM.pkb\" : [\n    8,\n    16,\n    28,\n    28,\n    37,\n    171,\n    171,\n    171,\n    171,\n    217,\n    217,\n    217,\n    217,\n    217,\n    218,\n    218,\n    218\n  ],\n  \"PKG_ITEM.pks\" : [\n    36,\n    36,\n    36,\n    36,\n    38,\n    38,\n    38,\n    38,\n    38,\n    39,\n    39,\n    39\n  ],\n  \"PRC_INFO.pcd\" : [\n    1\n  ],\n  \"V#R#FY_PW$001.fun\" : [\n    2,\n    3\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0017/InvalidReferenceToObjectCheck.json",
    "content": "{\n  \"POC_ACCOUNT/WHEN-NEW-FORM-INSTANCE.tgg\" : [\n    40\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0017/UnnecessaryElseCheck.json",
    "content": "{\n  \"FNC_VALIDATE.fun\" : [\n    12,\n    23,\n    31\n  ],\n  \"PKG_ITEM.pkb\" : [\n    32\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0017/UnusedParameterCheck.json",
    "content": "{\n  \"PKG_ITEM.pkb\" : [\n    16\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0017/UnusedVariableCheck.json",
    "content": "{\n  \"PKG_ITEM.pkb\" : [\n    17\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/demo0018/InvalidReferenceToObjectCheck.json",
    "content": "{\n  \"TEST/TEST__BUTTON1__WHEN-BUTTON-PRESSED.tgg\" : [\n    2\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/oracle-database_23/AddParenthesesInNestedExpressionCheck.json",
    "content": "{\n  \"lnpls/dml-triggers-36.sql\" : [\n    10\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/oracle-database_23/CharacterDatatypeUsageCheck.json",
    "content": "{\n  \"adjsn/sql-json-function-json_object-19.sql\" : [\n    5\n  ],\n  \"adjsn/sql-json-function-json_table-3.sql\" : [\n    12\n  ],\n  \"lnpls/CREATE-TYPE-statement-15.sql\" : [\n    4,\n    8\n  ],\n  \"lnpls/CREATE-TYPE-statement-9.sql\" : [\n    7\n  ],\n  \"lnpls/conditional-selection-statements-16.sql\" : [\n    3\n  ],\n  \"lnpls/conditional-selection-statements-19.sql\" : [\n    3\n  ],\n  \"lnpls/conditional-selection-statements-24.sql\" : [\n    3\n  ],\n  \"lnpls/conditional-selection-statements-26.sql\" : [\n    3\n  ],\n  \"lnpls/declarations-11.sql\" : [\n    3\n  ],\n  \"lnpls/dml-triggers-44.sql\" : [\n    6\n  ],\n  \"lnpls/dml-triggers-45.sql\" : [\n    8\n  ],\n  \"lnpls/expressions-48.sql\" : [\n    3\n  ],\n  \"lnpls/expressions-50.sql\" : [\n    3\n  ],\n  \"lnpls/expressions-57.sql\" : [\n    3\n  ],\n  \"lnpls/expressions-59.sql\" : [\n    3\n  ],\n  \"lnpls/invokers-rights-and-definers-rights-authid-property-3.sql\" : [\n    4\n  ],\n  \"lnpls/pl-sql-function-result-cache-10.sql\" : [\n    3\n  ],\n  \"lnpls/pl-sql-function-result-cache-13.sql\" : [\n    3,\n    4,\n    5,\n    9\n  ],\n  \"lnpls/pl-sql-function-result-cache-9.sql\" : [\n    2,\n    3\n  ],\n  \"lnpls/scope-and-visibility-identifiers-0.sql\" : [\n    3\n  ],\n  \"lnpls/sequential-control-statements-2.sql\" : [\n    3\n  ],\n  \"lnpls/sql-data-types-48.sql\" : [\n    3\n  ],\n  \"lnpls/sql-data-types-52.sql\" : [\n    3\n  ],\n  \"lnpls/user-defined-pl-sql-subtypes-9.sql\" : [\n    3\n  ],\n  \"sqlrf/CAST-7.sql\" : [\n    12\n  ],\n  \"sqlrf/CREATE-TABLE-42.sql\" : [\n    6\n  ],\n  \"sqlrf/CREATE-TABLE-57.sql\" : [\n    6\n  ],\n  \"sqlrf/Concatenation-Operator-1.sql\" : [\n    2,\n    3\n  ],\n  \"sqlrf/Pattern-matching-Conditions-10.sql\" : [\n    2\n  ],\n  \"sqlrf/constraint-3.sql\" : [\n    8\n  ],\n  \"sqlrf/constraint-4.sql\" : [\n    8\n  ],\n  \"sqlrf/domain_display-5.sql\" : [\n    6\n  ],\n  \"sqlrf/domain_name-5.sql\" : [\n    6\n  ],\n  \"sqlrf/domain_order-5.sql\" : [\n    6\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/oracle-database_23/ColumnsShouldHaveTableNameCheck.json",
    "content": "{\n  \"lnpls/dbms_sql-package-4.sql\" : [\n    14,\n    14,\n    14\n  ],\n  \"lnpls/processing-query-result-sets-8.sql\" : [\n    4,\n    4\n  ],\n  \"lnpls/record-variables-21.sql\" : [\n    4,\n    4,\n    4\n  ],\n  \"sqlrf/Comments-0.sql\" : [\n    2,\n    2,\n    3\n  ],\n  \"sqlrf/Comments-50.sql\" : [\n    2\n  ],\n  \"sqlrf/Comments-51.sql\" : [\n    2\n  ],\n  \"sqlrf/Expression-Lists-3.sql\" : [\n    3,\n    3,\n    3,\n    3\n  ],\n  \"sqlrf/JSON_TABLE-10.sql\" : [\n    2\n  ],\n  \"sqlrf/JSON_TABLE-9.sql\" : [\n    2,\n    2\n  ],\n  \"sqlrf/ROW_NUMBER-1.sql\" : [\n    10,\n    10,\n    23,\n    23\n  ],\n  \"sqlrf/SELECT-108.sql\" : [\n    2,\n    2\n  ],\n  \"sqlrf/SELECT-24.sql\" : [\n    4\n  ],\n  \"sqlrf/SELECT-56.sql\" : [\n    2,\n    2\n  ],\n  \"sqlrf/SELECT-64.sql\" : [\n    3,\n    4,\n    5\n  ],\n  \"sqlrf/SELECT-77.sql\" : [\n    2,\n    2,\n    2\n  ],\n  \"sqlrf/SELECT-79.sql\" : [\n    2,\n    2,\n    2\n  ],\n  \"sqlrf/STATS_ONE_WAY_ANOVA-0.sql\" : [\n    2\n  ],\n  \"sqlrf/XMLTABLE-2.sql\" : [\n    2\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/oracle-database_23/CommitRollbackCheck.json",
    "content": "{\n  \"lnpls/bulk-sql-and-bulk-binding-15.sql\" : [\n    19,\n    32\n  ],\n  \"lnpls/bulk-sql-and-bulk-binding-22.sql\" : [\n    19,\n    44\n  ],\n  \"lnpls/exception-propagation-0.sql\" : [\n    18\n  ],\n  \"lnpls/transaction-processing-and-control-0.sql\" : [\n    25\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/oracle-database_23/ComparisonWithBooleanCheck.json",
    "content": "{\n  \"adjsn/json_table-generalizes-sql-json-query-functions-and-conditions-0.sql\" : [\n    7\n  ],\n  \"lnpls/assigning-values-variables-7.sql\" : [\n    7\n  ],\n  \"lnpls/expressions-12.sql\" : [\n    9\n  ],\n  \"lnpls/expressions-46.sql\" : [\n    8,\n    14\n  ],\n  \"lnpls/expressions-57.sql\" : [\n    17\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/oracle-database_23/ComparisonWithNullCheck.json",
    "content": "{\n  \"lnpls/declarations-1.sql\" : [\n    7\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/oracle-database_23/ConcatenationWithNullCheck.json",
    "content": "{\n  \"lnpls/expressions-2.sql\" : [\n    3,\n    3\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/oracle-database_23/CursorBodyInPackageSpecCheck.json",
    "content": "{\n  \"lnpls/serially_reusable-packages-3.sql\" : [\n    10\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/oracle-database_23/DbmsOutputPutCheck.json",
    "content": "{\n  \"adjsn/using-online-redefinition-migrate-json-data-type-4.sql\" : [\n    10\n  ],\n  \"adjsn/using-pl-sql-object-types-json-0.sql\" : [\n    11\n  ],\n  \"adjsn/using-pl-sql-object-types-json-1.sql\" : [\n    17\n  ],\n  \"lnpls/ALTER-TYPE-statement-6.sql\" : [\n    13\n  ],\n  \"lnpls/CONTINUE-statement-0.sql\" : [\n    6,\n    11,\n    16\n  ],\n  \"lnpls/CONTINUE-statement-2.sql\" : [\n    6,\n    9,\n    13\n  ],\n  \"lnpls/COVERAGE-pragma-3.sql\" : [\n    15,\n    17\n  ],\n  \"lnpls/CREATE-FUNCTION-statement-6.sql\" : [\n    3\n  ],\n  \"lnpls/CREATE-FUNCTION-statement-8.sql\" : [\n    3\n  ],\n  \"lnpls/EXIT-statement-0.sql\" : [\n    6,\n    13\n  ],\n  \"lnpls/EXIT-statement-2.sql\" : [\n    6,\n    11\n  ],\n  \"lnpls/GOTO-statement-0.sql\" : [\n    16\n  ],\n  \"lnpls/GOTO-statement-5.sql\" : [\n    12\n  ],\n  \"lnpls/SQLERRM-function-1.sql\" : [\n    3\n  ],\n  \"lnpls/SQLERRM-function-4.sql\" : [\n    3\n  ],\n  \"lnpls/Supresses-warning-pragma-6009-11.sql\" : [\n    7\n  ],\n  \"lnpls/Supresses-warning-pragma-6009-2.sql\" : [\n    6\n  ],\n  \"lnpls/Supresses-warning-pragma-6009-6.sql\" : [\n    5,\n    10\n  ],\n  \"lnpls/Supresses-warning-pragma-6009-9.sql\" : [\n    8\n  ],\n  \"lnpls/WHILE-LOOP-statement-0.sql\" : [\n    6,\n    11\n  ],\n  \"lnpls/assigning-values-collection-variables-2.sql\" : [\n    13,\n    15\n  ],\n  \"lnpls/assigning-values-collection-variables-4.sql\" : [\n    15,\n    17,\n    22\n  ],\n  \"lnpls/assigning-values-record-variables-1.sql\" : [\n    16,\n    17\n  ],\n  \"lnpls/assigning-values-record-variables-10.sql\" : [\n    13\n  ],\n  \"lnpls/assigning-values-record-variables-13.sql\" : [\n    31,\n    36\n  ],\n  \"lnpls/assigning-values-record-variables-15.sql\" : [\n    19\n  ],\n  \"lnpls/assigning-values-record-variables-17.sql\" : [\n    18,\n    19,\n    20,\n    21\n  ],\n  \"lnpls/assigning-values-record-variables-3.sql\" : [\n    13,\n    15\n  ],\n  \"lnpls/assigning-values-record-variables-5.sql\" : [\n    18,\n    24\n  ],\n  \"lnpls/assigning-values-record-variables-7.sql\" : [\n    33\n  ],\n  \"lnpls/assigning-values-variables-3.sql\" : [\n    9\n  ],\n  \"lnpls/assigning-values-variables-5.sql\" : [\n    19,\n    24\n  ],\n  \"lnpls/basic-LOOP-statement-0.sql\" : [\n    19\n  ],\n  \"lnpls/basic-LOOP-statement-2.sql\" : [\n    9,\n    13,\n    17,\n    22\n  ],\n  \"lnpls/bulk-sql-and-bulk-binding-15.sql\" : [\n    30\n  ],\n  \"lnpls/bulk-sql-and-bulk-binding-22.sql\" : [\n    31,\n    34,\n    37,\n    41,\n    47\n  ],\n  \"lnpls/bulk-sql-and-bulk-binding-3.sql\" : [\n    42,\n    43,\n    44,\n    45\n  ],\n  \"lnpls/bulk-sql-and-bulk-binding-32.sql\" : [\n    12,\n    14,\n    17\n  ],\n  \"lnpls/bulk-sql-and-bulk-binding-34.sql\" : [\n    23\n  ],\n  \"lnpls/bulk-sql-and-bulk-binding-37.sql\" : [\n    8,\n    9,\n    12,\n    23,\n    24\n  ],\n  \"lnpls/bulk-sql-and-bulk-binding-42.sql\" : [\n    14,\n    15,\n    18,\n    25,\n    26,\n    30\n  ],\n  \"lnpls/bulk-sql-and-bulk-binding-47.sql\" : [\n    10,\n    12,\n    15,\n    18,\n    21,\n    30,\n    31,\n    35,\n    39,\n    43\n  ],\n  \"lnpls/bulk-sql-and-bulk-binding-53.sql\" : [\n    25,\n    27,\n    30,\n    36,\n    41,\n    49,\n    55\n  ],\n  \"lnpls/bulk-sql-and-bulk-binding-55.sql\" : [\n    28\n  ],\n  \"lnpls/bulk-sql-and-bulk-binding-57.sql\" : [\n    16,\n    18\n  ],\n  \"lnpls/collection-comparisons-0.sql\" : [\n    11,\n    13,\n    17,\n    19\n  ],\n  \"lnpls/collection-comparisons-2.sql\" : [\n    16,\n    20\n  ],\n  \"lnpls/collection-comparisons-4.sql\" : [\n    15,\n    23\n  ],\n  \"lnpls/collection-methods-11.sql\" : [\n    8,\n    9,\n    18,\n    24\n  ],\n  \"lnpls/collection-methods-13.sql\" : [\n    8,\n    9,\n    18,\n    24\n  ],\n  \"lnpls/collection-methods-15.sql\" : [\n    9,\n    12,\n    14,\n    17,\n    21\n  ],\n  \"lnpls/collection-methods-17.sql\" : [\n    8,\n    11,\n    13,\n    16,\n    18,\n    20,\n    25\n  ],\n  \"lnpls/collection-methods-19.sql\" : [\n    8,\n    9\n  ],\n  \"lnpls/collection-methods-21.sql\" : [\n    8,\n    9,\n    24,\n    26,\n    29\n  ],\n  \"lnpls/collection-methods-23.sql\" : [\n    15,\n    16,\n    18,\n    19,\n    21,\n    22,\n    24,\n    25,\n    27,\n    28,\n    30,\n    31\n  ],\n  \"lnpls/collection-methods-25.sql\" : [\n    13,\n    14\n  ],\n  \"lnpls/collection-methods-27.sql\" : [\n    8,\n    11,\n    12,\n    14,\n    15\n  ],\n  \"lnpls/collection-methods-29.sql\" : [\n    8,\n    11,\n    12,\n    16,\n    18,\n    21,\n    22\n  ],\n  \"lnpls/collection-methods-3.sql\" : [\n    12,\n    15,\n    16,\n    21\n  ],\n  \"lnpls/collection-methods-9.sql\" : [\n    10,\n    12\n  ],\n  \"lnpls/collection-types-defined-package-specifications-0.sql\" : [\n    11\n  ],\n  \"lnpls/column-name-precedence-6.sql\" : [\n    21\n  ],\n  \"lnpls/compile-time-warnings-7.sql\" : [\n    6,\n    8\n  ],\n  \"lnpls/conditional-compilation1-10.sql\" : [\n    3,\n    4,\n    5,\n    6,\n    7,\n    8\n  ],\n  \"lnpls/conditional-compilation1-14.sql\" : [\n    6,\n    7\n  ],\n  \"lnpls/conditional-selection-statements-10.sql\" : [\n    21\n  ],\n  \"lnpls/conditional-selection-statements-14.sql\" : [\n    15\n  ],\n  \"lnpls/conditional-selection-statements-16.sql\" : [\n    8,\n    10,\n    12,\n    14,\n    16,\n    18\n  ],\n  \"lnpls/conditional-selection-statements-19.sql\" : [\n    8,\n    9,\n    10,\n    11,\n    12,\n    13\n  ],\n  \"lnpls/conditional-selection-statements-24.sql\" : [\n    8,\n    9,\n    10,\n    11,\n    12,\n    13\n  ],\n  \"lnpls/conditional-selection-statements-26.sql\" : [\n    8,\n    9,\n    10,\n    11,\n    12,\n    16\n  ],\n  \"lnpls/conditional-selection-statements-5.sql\" : [\n    22\n  ],\n  \"lnpls/conditional-selection-statements-8.sql\" : [\n    17\n  ],\n  \"lnpls/continuing-execution-handling-exceptions-2.sql\" : [\n    14,\n    19,\n    22\n  ],\n  \"lnpls/correlation-names-and-pseudorecords-15.sql\" : [\n    9,\n    10,\n    14\n  ],\n  \"lnpls/correlation-names-and-pseudorecords-22.sql\" : [\n    4\n  ],\n  \"lnpls/correlation-names-and-pseudorecords-8.sql\" : [\n    10,\n    11,\n    12,\n    13\n  ],\n  \"lnpls/cursor-expressions-1.sql\" : [\n    24,\n    29\n  ],\n  \"lnpls/cursor-variables-10.sql\" : [\n    10,\n    20,\n    21,\n    26,\n    36,\n    37\n  ],\n  \"lnpls/cursor-variables-12.sql\" : [\n    17\n  ],\n  \"lnpls/cursor-variables-3.sql\" : [\n    24,\n    27,\n    34\n  ],\n  \"lnpls/cursor-variables-5.sql\" : [\n    20\n  ],\n  \"lnpls/cursor-variables-8.sql\" : [\n    18,\n    19,\n    20\n  ],\n  \"lnpls/cursors-overview-10.sql\" : [\n    26,\n    27,\n    28,\n    29,\n    30\n  ],\n  \"lnpls/cursors-overview-12.sql\" : [\n    17,\n    18,\n    19\n  ],\n  \"lnpls/cursors-overview-14.sql\" : [\n    12,\n    17,\n    18,\n    24,\n    29,\n    30\n  ],\n  \"lnpls/cursors-overview-16.sql\" : [\n    15\n  ],\n  \"lnpls/cursors-overview-18.sql\" : [\n    18,\n    24,\n    25,\n    26,\n    31,\n    32,\n    33\n  ],\n  \"lnpls/cursors-overview-20.sql\" : [\n    21,\n    26,\n    27,\n    30,\n    33,\n    34\n  ],\n  \"lnpls/cursors-overview-22.sql\" : [\n    20,\n    26,\n    27,\n    28,\n    33,\n    34,\n    35\n  ],\n  \"lnpls/cursors-overview-25.sql\" : [\n    15\n  ],\n  \"lnpls/cursors-overview-27.sql\" : [\n    17\n  ],\n  \"lnpls/cursors-overview-29.sql\" : [\n    14,\n    16\n  ],\n  \"lnpls/cursors-overview-8.sql\" : [\n    23,\n    26,\n    32\n  ],\n  \"lnpls/dbms_sql-package-4.sql\" : [\n    49,\n    50,\n    51,\n    55,\n    60\n  ],\n  \"lnpls/declarations-11.sql\" : [\n    6,\n    7\n  ],\n  \"lnpls/declarations-5.sql\" : [\n    8\n  ],\n  \"lnpls/declarations-9.sql\" : [\n    5\n  ],\n  \"lnpls/dml-triggers-0.sql\" : [\n    11,\n    13,\n    15,\n    17\n  ],\n  \"lnpls/dml-triggers-24.sql\" : [\n    30\n  ],\n  \"lnpls/exception-propagation-11.sql\" : [\n    6,\n    9,\n    10,\n    15,\n    16\n  ],\n  \"lnpls/exception-propagation-13.sql\" : [\n    12,\n    19,\n    20,\n    24,\n    25\n  ],\n  \"lnpls/exception-propagation-15.sql\" : [\n    14,\n    21,\n    22,\n    26,\n    27,\n    32,\n    33\n  ],\n  \"lnpls/exception-propagation-3.sql\" : [\n    8\n  ],\n  \"lnpls/exception-propagation-5.sql\" : [\n    12\n  ],\n  \"lnpls/exception-propagation-7.sql\" : [\n    4,\n    7,\n    8\n  ],\n  \"lnpls/exception-propagation-9.sql\" : [\n    4,\n    7,\n    8,\n    15\n  ],\n  \"lnpls/expressions-0.sql\" : [\n    6\n  ],\n  \"lnpls/expressions-10.sql\" : [\n    8,\n    9,\n    13,\n    14,\n    18,\n    23,\n    27\n  ],\n  \"lnpls/expressions-12.sql\" : [\n    8,\n    10,\n    12\n  ],\n  \"lnpls/expressions-19.sql\" : [\n    7,\n    9,\n    11\n  ],\n  \"lnpls/expressions-2.sql\" : [\n    3\n  ],\n  \"lnpls/expressions-21.sql\" : [\n    7,\n    9,\n    11\n  ],\n  \"lnpls/expressions-26.sql\" : [\n    10\n  ],\n  \"lnpls/expressions-35.sql\" : [\n    9,\n    11\n  ],\n  \"lnpls/expressions-37.sql\" : [\n    6,\n    8\n  ],\n  \"lnpls/expressions-4.sql\" : [\n    6,\n    7\n  ],\n  \"lnpls/expressions-48.sql\" : [\n    15\n  ],\n  \"lnpls/expressions-50.sql\" : [\n    16\n  ],\n  \"lnpls/expressions-57.sql\" : [\n    27\n  ],\n  \"lnpls/expressions-59.sql\" : [\n    16\n  ],\n  \"lnpls/expressions-6.sql\" : [\n    5\n  ],\n  \"lnpls/expressions-62.sql\" : [\n    10,\n    19\n  ],\n  \"lnpls/expressions-8.sql\" : [\n    6,\n    7\n  ],\n  \"lnpls/external-subprograms-2.sql\" : [\n    10,\n    12\n  ],\n  \"lnpls/external-subprograms-5.sql\" : [\n    13,\n    21\n  ],\n  \"lnpls/invokers-rights-and-definers-rights-authid-property-3.sql\" : [\n    7\n  ],\n  \"lnpls/lexical-units-12.sql\" : [\n    6,\n    7\n  ],\n  \"lnpls/lexical-units-15.sql\" : [\n    3\n  ],\n  \"lnpls/lexical-units-17.sql\" : [\n    3\n  ],\n  \"lnpls/lexical-units-23.sql\" : [\n    20\n  ],\n  \"lnpls/lexical-units-4.sql\" : [\n    5\n  ],\n  \"lnpls/lexical-units-6.sql\" : [\n    5\n  ],\n  \"lnpls/lexical-units-8.sql\" : [\n    7,\n    8,\n    9\n  ],\n  \"lnpls/loop-statements-0.sql\" : [\n    5\n  ],\n  \"lnpls/loop-statements-10.sql\" : [\n    6\n  ],\n  \"lnpls/loop-statements-13.sql\" : [\n    4\n  ],\n  \"lnpls/loop-statements-15.sql\" : [\n    4\n  ],\n  \"lnpls/loop-statements-17.sql\" : [\n    4\n  ],\n  \"lnpls/loop-statements-19.sql\" : [\n    4\n  ],\n  \"lnpls/loop-statements-2.sql\" : [\n    4,\n    7\n  ],\n  \"lnpls/loop-statements-25.sql\" : [\n    4\n  ],\n  \"lnpls/loop-statements-27.sql\" : [\n    4\n  ],\n  \"lnpls/loop-statements-33.sql\" : [\n    8\n  ],\n  \"lnpls/loop-statements-37.sql\" : [\n    4\n  ],\n  \"lnpls/loop-statements-39.sql\" : [\n    4\n  ],\n  \"lnpls/loop-statements-4.sql\" : [\n    6,\n    9\n  ],\n  \"lnpls/loop-statements-6.sql\" : [\n    7\n  ],\n  \"lnpls/loop-statements-8.sql\" : [\n    8\n  ],\n  \"lnpls/main-features-pl-sql-1.sql\" : [\n    9\n  ],\n  \"lnpls/minimizing-cpu-overhead-0.sql\" : [\n    16,\n    21,\n    34,\n    40\n  ],\n  \"lnpls/minimizing-cpu-overhead-2.sql\" : [\n    35,\n    36,\n    37,\n    38\n  ],\n  \"lnpls/multidimensional-collections-0.sql\" : [\n    13\n  ],\n  \"lnpls/native-dynamic-sql-1.sql\" : [\n    5\n  ],\n  \"lnpls/native-dynamic-sql-13.sql\" : [\n    15\n  ],\n  \"lnpls/native-dynamic-sql-19.sql\" : [\n    9\n  ],\n  \"lnpls/native-dynamic-sql-3.sql\" : [\n    26,\n    27\n  ],\n  \"lnpls/native-dynamic-sql-5.sql\" : [\n    14\n  ],\n  \"lnpls/native-dynamic-sql-7.sql\" : [\n    13\n  ],\n  \"lnpls/native-dynamic-sql-9.sql\" : [\n    13,\n    16\n  ],\n  \"lnpls/overloaded-subprograms-0.sql\" : [\n    11,\n    19\n  ],\n  \"lnpls/overloaded-subprograms-13.sql\" : [\n    11,\n    15\n  ],\n  \"lnpls/overview-exception-handling-1.sql\" : [\n    29,\n    31\n  ],\n  \"lnpls/package-body-0.sql\" : [\n    10\n  ],\n  \"lnpls/package-body-4.sql\" : [\n    6\n  ],\n  \"lnpls/package-example-0.sql\" : [\n    90,\n    144,\n    181,\n    184\n  ],\n  \"lnpls/package-specification-2.sql\" : [\n    14\n  ],\n  \"lnpls/pls_integer-and-binary_integer-data-types-6.sql\" : [\n    7,\n    11\n  ],\n  \"lnpls/predefined-exceptions-0.sql\" : [\n    8,\n    11\n  ],\n  \"lnpls/predefined-exceptions-4.sql\" : [\n    9,\n    10,\n    14,\n    17,\n    18\n  ],\n  \"lnpls/processing-query-result-sets-0.sql\" : [\n    11\n  ],\n  \"lnpls/processing-query-result-sets-10.sql\" : [\n    14\n  ],\n  \"lnpls/processing-query-result-sets-2.sql\" : [\n    10\n  ],\n  \"lnpls/processing-query-result-sets-4.sql\" : [\n    11\n  ],\n  \"lnpls/processing-query-result-sets-6.sql\" : [\n    10\n  ],\n  \"lnpls/processing-query-result-sets-8.sql\" : [\n    16\n  ],\n  \"lnpls/raising-exceptions-explicitly-0.sql\" : [\n    14\n  ],\n  \"lnpls/raising-exceptions-explicitly-2.sql\" : [\n    14\n  ],\n  \"lnpls/raising-exceptions-explicitly-5.sql\" : [\n    16,\n    17,\n    25\n  ],\n  \"lnpls/raising-exceptions-explicitly-9.sql\" : [\n    22\n  ],\n  \"lnpls/record-variables-0.sql\" : [\n    6,\n    7\n  ],\n  \"lnpls/record-variables-1.sql\" : [\n    20,\n    21\n  ],\n  \"lnpls/record-variables-11.sql\" : [\n    13,\n    14\n  ],\n  \"lnpls/record-variables-14.sql\" : [\n    14,\n    15,\n    16,\n    17\n  ],\n  \"lnpls/record-variables-16.sql\" : [\n    5,\n    7,\n    19,\n    20,\n    22,\n    23\n  ],\n  \"lnpls/record-variables-19.sql\" : [\n    13\n  ],\n  \"lnpls/record-variables-3.sql\" : [\n    7,\n    8\n  ],\n  \"lnpls/record-variables-30.sql\" : [\n    7\n  ],\n  \"lnpls/record-variables-5.sql\" : [\n    12,\n    13,\n    14,\n    15\n  ],\n  \"lnpls/record-variables-7.sql\" : [\n    19\n  ],\n  \"lnpls/record-variables-9.sql\" : [\n    14\n  ],\n  \"lnpls/recursive-subprograms-1.sql\" : [\n    17\n  ],\n  \"lnpls/recursive-subprograms-3.sql\" : [\n    21,\n    23,\n    27\n  ],\n  \"lnpls/redeclared-predefined-exceptions-1.sql\" : [\n    8\n  ],\n  \"lnpls/redeclared-predefined-exceptions-3.sql\" : [\n    10\n  ],\n  \"lnpls/redeclared-predefined-exceptions-5.sql\" : [\n    10\n  ],\n  \"lnpls/release-changes-0.sql\" : [\n    16\n  ],\n  \"lnpls/retrieving-error-code-and-error-message-0.sql\" : [\n    19\n  ],\n  \"lnpls/scope-and-visibility-identifiers-1.sql\" : [\n    10,\n    12\n  ],\n  \"lnpls/scope-and-visibility-identifiers-3.sql\" : [\n    19,\n    23\n  ],\n  \"lnpls/scope-and-visibility-identifiers-7.sql\" : [\n    8,\n    16\n  ],\n  \"lnpls/scope-and-visibility-identifiers-9.sql\" : [\n    9,\n    10\n  ],\n  \"lnpls/sequential-control-statements-2.sql\" : [\n    7,\n    8,\n    9,\n    10,\n    11\n  ],\n  \"lnpls/serially_reusable-packages-1.sql\" : [\n    17,\n    18\n  ],\n  \"lnpls/serially_reusable-packages-3.sql\" : [\n    17,\n    19,\n    24,\n    27\n  ],\n  \"lnpls/sql-data-types-1.sql\" : [\n    6,\n    7\n  ],\n  \"lnpls/sql-data-types-12.sql\" : [\n    8\n  ],\n  \"lnpls/sql-data-types-14.sql\" : [\n    9\n  ],\n  \"lnpls/sql-data-types-22.sql\" : [\n    8\n  ],\n  \"lnpls/sql-data-types-26.sql\" : [\n    8\n  ],\n  \"lnpls/sql-data-types-3.sql\" : [\n    8\n  ],\n  \"lnpls/sql-data-types-32.sql\" : [\n    12\n  ],\n  \"lnpls/sql-data-types-34.sql\" : [\n    13\n  ],\n  \"lnpls/sql-data-types-38.sql\" : [\n    29,\n    30,\n    31,\n    32,\n    33,\n    34,\n    35\n  ],\n  \"lnpls/sql-data-types-42.sql\" : [\n    6,\n    7,\n    8\n  ],\n  \"lnpls/sql-data-types-52.sql\" : [\n    9,\n    10\n  ],\n  \"lnpls/sql-data-types-6.sql\" : [\n    8\n  ],\n  \"lnpls/sql-injection-1.sql\" : [\n    17,\n    19\n  ],\n  \"lnpls/sql-injection-18.sql\" : [\n    22,\n    24\n  ],\n  \"lnpls/sql-injection-23.sql\" : [\n    14,\n    18\n  ],\n  \"lnpls/sql-injection-28.sql\" : [\n    23,\n    30\n  ],\n  \"lnpls/sql-injection-30.sql\" : [\n    21,\n    23\n  ],\n  \"lnpls/sql-injection-6.sql\" : [\n    17\n  ],\n  \"lnpls/subprogram-parameters-13.sql\" : [\n    11,\n    13,\n    14,\n    16,\n    17,\n    19,\n    20,\n    22,\n    39,\n    41,\n    42,\n    44,\n    45,\n    47,\n    48,\n    50,\n    58,\n    60,\n    61,\n    63,\n    64,\n    66,\n    67,\n    69,\n    71,\n    73,\n    74,\n    76,\n    84,\n    86,\n    87,\n    89\n  ],\n  \"lnpls/subprogram-parameters-15.sql\" : [\n    6,\n    8,\n    9,\n    11,\n    17,\n    19,\n    20,\n    22\n  ],\n  \"lnpls/subprogram-parameters-17.sql\" : [\n    13,\n    14,\n    15\n  ],\n  \"lnpls/subprogram-parameters-19.sql\" : [\n    23\n  ],\n  \"lnpls/subprogram-parameters-21.sql\" : [\n    12,\n    14,\n    19\n  ],\n  \"lnpls/subprogram-parameters-27.sql\" : [\n    7,\n    16,\n    21,\n    26,\n    29\n  ],\n  \"lnpls/subprogram-parameters-29.sql\" : [\n    7\n  ],\n  \"lnpls/subprogram-parameters-32.sql\" : [\n    9,\n    11\n  ],\n  \"lnpls/subprogram-parameters-4.sql\" : [\n    8\n  ],\n  \"lnpls/subprogram-parameters-6.sql\" : [\n    5,\n    10\n  ],\n  \"lnpls/subprogram-parameters-8.sql\" : [\n    6,\n    11\n  ],\n  \"lnpls/subprogram-parts-0.sql\" : [\n    22,\n    30,\n    33\n  ],\n  \"lnpls/subprogram-parts-11.sql\" : [\n    4,\n    6,\n    8\n  ],\n  \"lnpls/subprogram-parts-2.sql\" : [\n    15\n  ],\n  \"lnpls/subprogram-parts-4.sql\" : [\n    13,\n    18\n  ],\n  \"lnpls/subprogram-parts-7.sql\" : [\n    18\n  ],\n  \"lnpls/subprogram-parts-9.sql\" : [\n    5,\n    7,\n    11\n  ],\n  \"lnpls/trigger-restrictions-0.sql\" : [\n    21\n  ],\n  \"lnpls/views-information-triggers-0.sql\" : [\n    8\n  ],\n  \"lnpls/views-information-triggers-5.sql\" : [\n    6\n  ],\n  \"lnpls/wrapping-pl-sql-source-text-dbms_ddl-subprograms-3.sql\" : [\n    6,\n    9\n  ],\n  \"lnpls/wrapping-pl-sql-source-text-pl-sql-wrapper-utility-4.sql\" : [\n    10\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/oracle-database_23/DeadCodeCheck.json",
    "content": "{\n  \"lnpls/subprogram-parts-11.sql\" : [\n    6\n  ],\n  \"lnpls/subprogram-parts-9.sql\" : [\n    7\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/oracle-database_23/EmptyBlockCheck.json",
    "content": "{\n  \"lnpls/conditional-compilation1-25.sql\" : [\n    6\n  ],\n  \"lnpls/cursor-variables-1.sql\" : [\n    13\n  ],\n  \"lnpls/cursor-variables-2.sql\" : [\n    11\n  ],\n  \"lnpls/cursors-overview-6.sql\" : [\n    19\n  ],\n  \"lnpls/declarations-0.sql\" : [\n    8\n  ],\n  \"lnpls/declarations-1.sql\" : [\n    9\n  ],\n  \"lnpls/declarations-2.sql\" : [\n    9\n  ],\n  \"lnpls/declarations-3.sql\" : [\n    7\n  ],\n  \"lnpls/declarations-4.sql\" : [\n    10\n  ],\n  \"lnpls/exception-propagation-3.sql\" : [\n    5\n  ],\n  \"lnpls/exception-propagation-5.sql\" : [\n    7\n  ],\n  \"lnpls/forward-declaration-0.sql\" : [\n    19\n  ],\n  \"lnpls/minimizing-cpu-overhead-2.sql\" : [\n    16,\n    21\n  ],\n  \"lnpls/overloaded-subprograms-12.sql\" : [\n    8,\n    9\n  ],\n  \"lnpls/record-variables-21.sql\" : [\n    11\n  ],\n  \"lnpls/scope-and-visibility-identifiers-0.sql\" : [\n    14,\n    22\n  ],\n  \"lnpls/sequential-control-statements-1.sql\" : [\n    7\n  ],\n  \"lnpls/subprogram-invocation-resolution-0.sql\" : [\n    22,\n    30,\n    39,\n    43\n  ],\n  \"lnpls/subprogram-parameters-10.sql\" : [\n    6\n  ],\n  \"lnpls/trigger-design-guidelines-1.sql\" : [\n    5\n  ],\n  \"lnpls/user-defined-pl-sql-subtypes-2.sql\" : [\n    27\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/oracle-database_23/ExplicitInParameterCheck.json",
    "content": "{\n  \"adjsn/handling-input-values-sql-json-generation-functions-0.sql\" : [\n    2\n  ],\n  \"lnpls/ALTER-TYPE-statement-6.sql\" : [\n    8,\n    11\n  ],\n  \"lnpls/CREATE-FUNCTION-statement-2.sql\" : [\n    2\n  ],\n  \"lnpls/CREATE-FUNCTION-statement-4.sql\" : [\n    2\n  ],\n  \"lnpls/CREATE-PACKAGE-BODY-statement-0.sql\" : [\n    6,\n    6,\n    7,\n    7,\n    8,\n    8,\n    22,\n    22,\n    34,\n    40,\n    47,\n    47,\n    60,\n    60\n  ],\n  \"lnpls/CREATE-TYPE-statement-1.sql\" : [\n    4,\n    8\n  ],\n  \"lnpls/CREATE-TYPE-statement-15.sql\" : [\n    11,\n    11\n  ],\n  \"lnpls/CREATE-TYPE-statement-16.sql\" : [\n    4,\n    4\n  ],\n  \"lnpls/DEPRECATE-pragma-8.sql\" : [\n    3,\n    3,\n    3,\n    5,\n    5\n  ],\n  \"lnpls/Supresses-warning-pragma-6009-3.sql\" : [\n    2\n  ],\n  \"lnpls/Supresses-warning-pragma-6009-4.sql\" : [\n    2\n  ],\n  \"lnpls/Supresses-warning-pragma-6009-5.sql\" : [\n    3\n  ],\n  \"lnpls/Supresses-warning-pragma-6009-6.sql\" : [\n    3\n  ],\n  \"lnpls/assigning-values-collection-variables-4.sql\" : [\n    11\n  ],\n  \"lnpls/assigning-values-record-variables-1.sql\" : [\n    13\n  ],\n  \"lnpls/assigning-values-record-variables-13.sql\" : [\n    16\n  ],\n  \"lnpls/assigning-values-variables-5.sql\" : [\n    6,\n    8\n  ],\n  \"lnpls/autonomous-transactions-1.sql\" : [\n    3,\n    3,\n    9,\n    9\n  ],\n  \"lnpls/autonomous-transactions-2.sql\" : [\n    3,\n    3\n  ],\n  \"lnpls/autonomous-transactions-9.sql\" : [\n    5,\n    9\n  ],\n  \"lnpls/bulk-sql-and-bulk-binding-32.sql\" : [\n    9\n  ],\n  \"lnpls/chaining-pipelined-table-functions-multiple-transformations-12.sql\" : [\n    11,\n    11\n  ],\n  \"lnpls/chaining-pipelined-table-functions-multiple-transformations-13.sql\" : [\n    4,\n    5\n  ],\n  \"lnpls/chaining-pipelined-table-functions-multiple-transformations-17.sql\" : [\n    4,\n    9\n  ],\n  \"lnpls/chaining-pipelined-table-functions-multiple-transformations-2.sql\" : [\n    4\n  ],\n  \"lnpls/chaining-pipelined-table-functions-multiple-transformations-3.sql\" : [\n    3\n  ],\n  \"lnpls/chaining-pipelined-table-functions-multiple-transformations-8.sql\" : [\n    10,\n    14\n  ],\n  \"lnpls/collection-comparisons-4.sql\" : [\n    10,\n    11\n  ],\n  \"lnpls/collection-methods-15.sql\" : [\n    6\n  ],\n  \"lnpls/collection-methods-17.sql\" : [\n    6\n  ],\n  \"lnpls/collection-types-defined-package-specifications-0.sql\" : [\n    4,\n    8\n  ],\n  \"lnpls/conditional-selection-statements-10.sql\" : [\n    4,\n    5,\n    6\n  ],\n  \"lnpls/conditional-selection-statements-14.sql\" : [\n    3\n  ],\n  \"lnpls/conditional-selection-statements-5.sql\" : [\n    4,\n    5,\n    6\n  ],\n  \"lnpls/conditional-selection-statements-8.sql\" : [\n    4,\n    5,\n    6\n  ],\n  \"lnpls/cursor-variables-15.sql\" : [\n    4,\n    8\n  ],\n  \"lnpls/cursor-variables-16.sql\" : [\n    4,\n    8\n  ],\n  \"lnpls/dbms_sql-package-6.sql\" : [\n    7,\n    8,\n    9\n  ],\n  \"lnpls/dbms_sql-package-7.sql\" : [\n    3\n  ],\n  \"lnpls/exception-propagation-11.sql\" : [\n    2\n  ],\n  \"lnpls/exception-propagation-13.sql\" : [\n    2\n  ],\n  \"lnpls/exception-propagation-15.sql\" : [\n    2\n  ],\n  \"lnpls/exception-propagation-7.sql\" : [\n    2\n  ],\n  \"lnpls/exception-propagation-9.sql\" : [\n    2\n  ],\n  \"lnpls/expressions-12.sql\" : [\n    3,\n    4\n  ],\n  \"lnpls/expressions-13.sql\" : [\n    4,\n    5\n  ],\n  \"lnpls/expressions-15.sql\" : [\n    4,\n    5\n  ],\n  \"lnpls/expressions-17.sql\" : [\n    4\n  ],\n  \"lnpls/expressions-35.sql\" : [\n    4,\n    5\n  ],\n  \"lnpls/expressions-37.sql\" : [\n    3\n  ],\n  \"lnpls/expressions-57.sql\" : [\n    9\n  ],\n  \"lnpls/external-subprograms-1.sql\" : [\n    3,\n    4\n  ],\n  \"lnpls/forward-declaration-0.sql\" : [\n    4,\n    7,\n    13\n  ],\n  \"lnpls/native-dynamic-sql-1.sql\" : [\n    2\n  ],\n  \"lnpls/native-dynamic-sql-19.sql\" : [\n    3,\n    4,\n    5,\n    6\n  ],\n  \"lnpls/native-dynamic-sql-3.sql\" : [\n    6,\n    6,\n    11,\n    11\n  ],\n  \"lnpls/native-dynamic-sql-5.sql\" : [\n    7,\n    11\n  ],\n  \"lnpls/native-dynamic-sql-7.sql\" : [\n    6,\n    10\n  ],\n  \"lnpls/native-dynamic-sql-9.sql\" : [\n    6,\n    10\n  ],\n  \"lnpls/overloaded-subprograms-0.sql\" : [\n    9,\n    17\n  ],\n  \"lnpls/overloaded-subprograms-10.sql\" : [\n    3,\n    4,\n    4\n  ],\n  \"lnpls/overloaded-subprograms-12.sql\" : [\n    3,\n    3,\n    4,\n    4,\n    8,\n    8,\n    9,\n    9\n  ],\n  \"lnpls/overloaded-subprograms-13.sql\" : [\n    4,\n    5,\n    9,\n    13\n  ],\n  \"lnpls/overloaded-subprograms-5.sql\" : [\n    3,\n    4\n  ],\n  \"lnpls/overloaded-subprograms-6.sql\" : [\n    5,\n    6\n  ],\n  \"lnpls/overloaded-subprograms-8.sql\" : [\n    5,\n    6\n  ],\n  \"lnpls/overview-exception-handling-1.sql\" : [\n    3,\n    4\n  ],\n  \"lnpls/package-body-0.sql\" : [\n    3,\n    8\n  ],\n  \"lnpls/package-body-4.sql\" : [\n    4\n  ],\n  \"lnpls/package-example-0.sql\" : [\n    17,\n    18,\n    19,\n    20,\n    21,\n    22,\n    23,\n    24,\n    25,\n    29,\n    30,\n    32,\n    32,\n    33,\n    49,\n    50,\n    51,\n    52,\n    53,\n    54,\n    55,\n    56,\n    57,\n    95,\n    100,\n    108,\n    109,\n    124,\n    125,\n    148\n  ],\n  \"lnpls/package-specification-2.sql\" : [\n    7\n  ],\n  \"lnpls/pl-sql-function-result-cache-10.sql\" : [\n    2\n  ],\n  \"lnpls/pl-sql-function-result-cache-13.sql\" : [\n    3,\n    4\n  ],\n  \"lnpls/pl-sql-function-result-cache-15.sql\" : [\n    3,\n    4\n  ],\n  \"lnpls/pl-sql-function-result-cache-16.sql\" : [\n    3,\n    4,\n    11\n  ],\n  \"lnpls/pl-sql-function-result-cache-4.sql\" : [\n    12,\n    20\n  ],\n  \"lnpls/pl-sql-function-result-cache-6.sql\" : [\n    3,\n    4,\n    5\n  ],\n  \"lnpls/pl-sql-function-result-cache-7.sql\" : [\n    2\n  ],\n  \"lnpls/pl-sql-function-result-cache-9.sql\" : [\n    2,\n    2\n  ],\n  \"lnpls/plsql-program-limits-0.sql\" : [\n    4,\n    9\n  ],\n  \"lnpls/qualified-names-and-dot-notation-6.sql\" : [\n    8,\n    9,\n    13,\n    33\n  ],\n  \"lnpls/raising-exceptions-explicitly-0.sql\" : [\n    3,\n    4\n  ],\n  \"lnpls/raising-exceptions-explicitly-2.sql\" : [\n    4\n  ],\n  \"lnpls/raising-exceptions-explicitly-9.sql\" : [\n    3,\n    4\n  ],\n  \"lnpls/record-variables-11.sql\" : [\n    7,\n    11\n  ],\n  \"lnpls/record-variables-16.sql\" : [\n    2\n  ],\n  \"lnpls/recursive-subprograms-1.sql\" : [\n    3\n  ],\n  \"lnpls/recursive-subprograms-3.sql\" : [\n    3\n  ],\n  \"lnpls/release-changes-0.sql\" : [\n    2\n  ],\n  \"lnpls/scope-and-visibility-identifiers-3.sql\" : [\n    2\n  ],\n  \"lnpls/sequential-control-statements-1.sql\" : [\n    3,\n    4\n  ],\n  \"lnpls/sequential-control-statements-2.sql\" : [\n    3\n  ],\n  \"lnpls/sql-injection-28.sql\" : [\n    3,\n    4,\n    5\n  ],\n  \"lnpls/subprogram-invocation-resolution-0.sql\" : [\n    4,\n    5,\n    12,\n    18,\n    19,\n    26,\n    27\n  ],\n  \"lnpls/subprogram-parameters-10.sql\" : [\n    3\n  ],\n  \"lnpls/subprogram-parameters-13.sql\" : [\n    3\n  ],\n  \"lnpls/subprogram-parameters-2.sql\" : [\n    8,\n    9\n  ],\n  \"lnpls/subprogram-parameters-29.sql\" : [\n    3,\n    4\n  ],\n  \"lnpls/subprogram-parameters-32.sql\" : [\n    3,\n    4,\n    5\n  ],\n  \"lnpls/subprogram-parameters-36.sql\" : [\n    7,\n    8\n  ],\n  \"lnpls/subprogram-parameters-37.sql\" : [\n    3,\n    4\n  ],\n  \"lnpls/subprogram-parameters-4.sql\" : [\n    6\n  ],\n  \"lnpls/subprogram-parameters-6.sql\" : [\n    3\n  ],\n  \"lnpls/subprogram-parameters-8.sql\" : [\n    3\n  ],\n  \"lnpls/subprogram-parts-0.sql\" : [\n    11,\n    12,\n    13\n  ],\n  \"lnpls/subprogram-parts-2.sql\" : [\n    5\n  ],\n  \"lnpls/subprogram-parts-4.sql\" : [\n    5\n  ],\n  \"lnpls/subprogram-parts-6.sql\" : [\n    2\n  ],\n  \"lnpls/subprogram-parts-7.sql\" : [\n    2\n  ],\n  \"lnpls/transaction-processing-and-control-0.sql\" : [\n    12,\n    13,\n    14\n  ],\n  \"lnpls/wrapping-pl-sql-source-text-dbms_ddl-subprograms-0.sql\" : [\n    5,\n    13\n  ],\n  \"lnpls/wrapping-pl-sql-source-text-dbms_ddl-subprograms-2.sql\" : [\n    2,\n    2,\n    3\n  ],\n  \"lnpls/wrapping-pl-sql-source-text-pl-sql-wrapper-utility-4.sql\" : [\n    15\n  ],\n  \"sqlrf/CURSOR-Expressions-1.sql\" : [\n    2,\n    2\n  ],\n  \"sqlrf/SELECT-23.sql\" : [\n    3\n  ],\n  \"sqlrf/Using-Extensible-Indexing-1.sql\" : [\n    12,\n    12,\n    12,\n    13,\n    14,\n    15,\n    16,\n    17,\n    17,\n    18,\n    18,\n    19,\n    19,\n    19,\n    20,\n    21,\n    21,\n    21,\n    22,\n    22,\n    23,\n    24,\n    24,\n    25,\n    25,\n    25,\n    26,\n    26,\n    27,\n    28,\n    30,\n    41,\n    41,\n    41,\n    55,\n    55,\n    65,\n    65,\n    74,\n    74,\n    75,\n    75,\n    86,\n    86,\n    86,\n    87,\n    98,\n    98,\n    98,\n    99,\n    99,\n    109,\n    110,\n    110,\n    111,\n    111,\n    111,\n    112,\n    112,\n    174,\n    175,\n    202\n  ],\n  \"sqlrf/Using-Extensible-Indexing-2.sql\" : [\n    3,\n    3,\n    3\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/oracle-database_23/FunctionWithOutParameterCheck.json",
    "content": "{\n  \"lnpls/overview-polymorphic-table-functions-16.sql\" : [\n    3\n  ],\n  \"lnpls/overview-polymorphic-table-functions-17.sql\" : [\n    4\n  ],\n  \"lnpls/overview-polymorphic-table-functions-30.sql\" : [\n    4\n  ],\n  \"sqlrf/Using-Extensible-Indexing-1.sql\" : [\n    10,\n    23,\n    27,\n    28,\n    35,\n    109,\n    174,\n    175\n  ],\n  \"sqlrf/Using-Extensible-Indexing-2.sql\" : [\n    5\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/oracle-database_23/IdenticalExpressionCheck.json",
    "content": "{\n  \"lnpls/CREATE-PACKAGE-BODY-statement-0.sql\" : [\n    57\n  ],\n  \"lnpls/expressions-28.sql\" : [\n    16\n  ],\n  \"sqlrf/CREATE-MATERIALIZED-VIEW-10.sql\" : [\n    5\n  ],\n  \"sqlrf/INSERT-42.sql\" : [\n    4\n  ],\n  \"sqlrf/JSON_TABLE-1.sql\" : [\n    4\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/oracle-database_23/IfWithExitCheck.json",
    "content": "{\n  \"lnpls/EXIT-statement-0.sql\" : [\n    8\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/oracle-database_23/InequalityUsageCheck.json",
    "content": "{\n  \"lnpls/assigning-values-variables-7.sql\" : [\n    7\n  ],\n  \"lnpls/collection-comparisons-2.sql\" : [\n    19\n  ],\n  \"lnpls/declarations-1.sql\" : [\n    7\n  ],\n  \"lnpls/dml-triggers-36.sql\" : [\n    10\n  ],\n  \"lnpls/expressions-19.sql\" : [\n    6\n  ],\n  \"lnpls/expressions-21.sql\" : [\n    8\n  ],\n  \"lnpls/expressions-28.sql\" : [\n    6,\n    7,\n    8\n  ],\n  \"lnpls/overview-polymorphic-table-functions-30.sql\" : [\n    38\n  ],\n  \"sqlrf/Comparison-Conditions-1.sql\" : [\n    4\n  ],\n  \"sqlrf/Literals-11.sql\" : [\n    5\n  ],\n  \"sqlrf/Literals-9.sql\" : [\n    5\n  ],\n  \"sqlrf/SELECT-106.sql\" : [\n    5\n  ],\n  \"sqlrf/Using-Extensible-Indexing-1.sql\" : [\n    130,\n    130,\n    131,\n    131,\n    150\n  ],\n  \"sqlrf/Using-Extensible-Indexing-2.sql\" : [\n    39\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/oracle-database_23/InsertWithoutColumnsCheck.json",
    "content": "{\n  \"adjsn/creating-multivalue-function-based-indexes-json_exists-0.sql\" : [\n    3,\n    6\n  ],\n  \"adjsn/json-schema-14.sql\" : [\n    6\n  ],\n  \"adjsn/multiple-data-guides-document-set-0.sql\" : [\n    2\n  ],\n  \"adjsn/multiple-data-guides-document-set-1.sql\" : [\n    2\n  ],\n  \"adjsn/sql-json-function-json_object-19.sql\" : [\n    10\n  ],\n  \"adjsn/tables-json-columns-2.sql\" : [\n    2,\n    33\n  ],\n  \"adjsn/using-geojson-geographic-data-0.sql\" : [\n    5\n  ],\n  \"lnpls/CREATE-PACKAGE-BODY-statement-0.sql\" : [\n    14,\n    29\n  ],\n  \"lnpls/CREATE-TYPE-statement-10.sql\" : [\n    5\n  ],\n  \"lnpls/CREATE-TYPE-statement-12.sql\" : [\n    3\n  ],\n  \"lnpls/avoiding-inner-capture-select-and-dml-statements-5.sql\" : [\n    3,\n    4,\n    5\n  ],\n  \"lnpls/continuing-execution-handling-exceptions-2.sql\" : [\n    18\n  ],\n  \"lnpls/correlation-names-and-pseudorecords-15.sql\" : [\n    4\n  ],\n  \"lnpls/dml-triggers-17.sql\" : [\n    2\n  ],\n  \"lnpls/dml-triggers-23.sql\" : [\n    2\n  ],\n  \"lnpls/dml-triggers-4.sql\" : [\n    2\n  ],\n  \"lnpls/dml-triggers-50.sql\" : [\n    10\n  ],\n  \"lnpls/native-dynamic-sql-16.sql\" : [\n    2\n  ],\n  \"lnpls/native-dynamic-sql-18.sql\" : [\n    2\n  ],\n  \"lnpls/raising-exceptions-explicitly-2.sql\" : [\n    10,\n    15\n  ],\n  \"lnpls/redeclared-predefined-exceptions-1.sql\" : [\n    5,\n    9\n  ],\n  \"lnpls/redeclared-predefined-exceptions-3.sql\" : [\n    7,\n    11\n  ],\n  \"lnpls/redeclared-predefined-exceptions-5.sql\" : [\n    7,\n    11\n  ],\n  \"lnpls/sql-data-types-32.sql\" : [\n    4,\n    5,\n    6\n  ],\n  \"lnpls/sql-data-types-36.sql\" : [\n    11,\n    13\n  ],\n  \"lnpls/trigger-restrictions-0.sql\" : [\n    14\n  ],\n  \"lnpls/trigger-restrictions-6.sql\" : [\n    4,\n    5,\n    6,\n    9,\n    10,\n    11\n  ],\n  \"lnpls/triggers-publishing-events-12.sql\" : [\n    2\n  ],\n  \"lnpls/triggers-publishing-events-16.sql\" : [\n    2\n  ],\n  \"lnpls/triggers-publishing-events-20.sql\" : [\n    2\n  ],\n  \"lnpls/triggers-publishing-events-24.sql\" : [\n    2\n  ],\n  \"lnpls/triggers-publishing-events-28.sql\" : [\n    2\n  ],\n  \"lnpls/triggers-publishing-events-38.sql\" : [\n    2\n  ],\n  \"lnpls/triggers-publishing-events-42.sql\" : [\n    2\n  ],\n  \"lnpls/triggers-publishing-events-48.sql\" : [\n    14\n  ],\n  \"lnpls/triggers-publishing-events-50.sql\" : [\n    2\n  ],\n  \"lnpls/triggers-publishing-events-52.sql\" : [\n    2\n  ],\n  \"lnpls/triggers-publishing-events-6.sql\" : [\n    2\n  ],\n  \"lnpls/triggers-publishing-events-8.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-SESSION-14.sql\" : [\n    4\n  ],\n  \"sqlrf/ALTER-TABLE-118.sql\" : [\n    2,\n    4\n  ],\n  \"sqlrf/ALTER-TABLE-31.sql\" : [\n    3,\n    4,\n    5,\n    6,\n    7\n  ],\n  \"sqlrf/ALTER-TABLE-95.sql\" : [\n    4,\n    5,\n    6\n  ],\n  \"sqlrf/COLLATION-0.sql\" : [\n    5\n  ],\n  \"sqlrf/COMMIT-0.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-TABLE-51.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-VIEW-8.sql\" : [\n    2\n  ],\n  \"sqlrf/CURRENT_TIMESTAMP-2.sql\" : [\n    2\n  ],\n  \"sqlrf/CURRENT_TIMESTAMP-3.sql\" : [\n    2\n  ],\n  \"sqlrf/Comments-48.sql\" : [\n    3\n  ],\n  \"sqlrf/DEREF-0.sql\" : [\n    2,\n    4\n  ],\n  \"sqlrf/Data-Types-19.sql\" : [\n    2\n  ],\n  \"sqlrf/Data-Types-20.sql\" : [\n    2\n  ],\n  \"sqlrf/Data-Types-22.sql\" : [\n    2,\n    3,\n    4,\n    5,\n    6,\n    7,\n    8,\n    9\n  ],\n  \"sqlrf/Data-Types-3.sql\" : [\n    3,\n    4,\n    5,\n    6\n  ],\n  \"sqlrf/HEXTORAW-0.sql\" : [\n    3\n  ],\n  \"sqlrf/INSERT-11.sql\" : [\n    2\n  ],\n  \"sqlrf/INSERT-12.sql\" : [\n    2\n  ],\n  \"sqlrf/INSERT-13.sql\" : [\n    2\n  ],\n  \"sqlrf/INSERT-15.sql\" : [\n    2,\n    3,\n    4\n  ],\n  \"sqlrf/INSERT-16.sql\" : [\n    2,\n    4,\n    6\n  ],\n  \"sqlrf/INSERT-19.sql\" : [\n    2\n  ],\n  \"sqlrf/INSERT-32.sql\" : [\n    2\n  ],\n  \"sqlrf/INSERT-33.sql\" : [\n    2\n  ],\n  \"sqlrf/INSERT-5.sql\" : [\n    2\n  ],\n  \"sqlrf/INSERT-6.sql\" : [\n    2\n  ],\n  \"sqlrf/INSERT-8.sql\" : [\n    2\n  ],\n  \"sqlrf/INSERT-9.sql\" : [\n    2\n  ],\n  \"sqlrf/JSON_ARRAYAGG-0.sql\" : [\n    3,\n    4,\n    5,\n    6\n  ],\n  \"sqlrf/JSON_TABLE-5.sql\" : [\n    2\n  ],\n  \"sqlrf/LOCALTIMESTAMP-2.sql\" : [\n    2\n  ],\n  \"sqlrf/LOCALTIMESTAMP-3.sql\" : [\n    2\n  ],\n  \"sqlrf/Literals-15.sql\" : [\n    2,\n    3\n  ],\n  \"sqlrf/Literals-18.sql\" : [\n    2\n  ],\n  \"sqlrf/Literals-19.sql\" : [\n    2\n  ],\n  \"sqlrf/Literals-20.sql\" : [\n    2\n  ],\n  \"sqlrf/MERGE-1.sql\" : [\n    14,\n    15,\n    16,\n    17,\n    18\n  ],\n  \"sqlrf/NANVL-0.sql\" : [\n    2\n  ],\n  \"sqlrf/NLSSORT-1.sql\" : [\n    3,\n    4,\n    5\n  ],\n  \"sqlrf/Pattern-matching-Conditions-10.sql\" : [\n    3\n  ],\n  \"sqlrf/SELECT-115.sql\" : [\n    3,\n    4,\n    5,\n    6,\n    7,\n    8,\n    9,\n    10,\n    11,\n    12,\n    13,\n    14,\n    15,\n    16,\n    17,\n    18,\n    19,\n    20,\n    21,\n    22\n  ],\n  \"sqlrf/SELECT-73.sql\" : [\n    2\n  ],\n  \"sqlrf/SELECT-90.sql\" : [\n    5,\n    6,\n    7,\n    8\n  ],\n  \"sqlrf/SELECT-99.sql\" : [\n    2\n  ],\n  \"sqlrf/SQL-JSON-Conditions-15.sql\" : [\n    2,\n    3,\n    4,\n    5,\n    6,\n    7,\n    8\n  ],\n  \"sqlrf/SQL-JSON-Conditions-20.sql\" : [\n    2,\n    3,\n    4\n  ],\n  \"sqlrf/SQL-JSON-Conditions-29.sql\" : [\n    2,\n    3,\n    4,\n    5,\n    6,\n    7\n  ],\n  \"sqlrf/SQL-JSON-Conditions-37.sql\" : [\n    2,\n    4,\n    6\n  ],\n  \"sqlrf/Sequence-Pseudocolumns-4.sql\" : [\n    2\n  ],\n  \"sqlrf/Syntax-for-Schema-Objects-and-Parts-in-SQL-Statements-0.sql\" : [\n    2\n  ],\n  \"sqlrf/TO_BINARY_DOUBLE-0.sql\" : [\n    4\n  ],\n  \"sqlrf/TO_CHAR-character-2.sql\" : [\n    12,\n    14,\n    16,\n    18\n  ],\n  \"sqlrf/TO_CHAR-datetime-10.sql\" : [\n    12,\n    14,\n    16,\n    18\n  ],\n  \"sqlrf/TO_CHAR-datetime-2.sql\" : [\n    3,\n    7\n  ],\n  \"sqlrf/TO_CHAR-number-5.sql\" : [\n    12,\n    14,\n    16,\n    18\n  ],\n  \"sqlrf/Type-Constructor-Expressions-0.sql\" : [\n    8\n  ],\n  \"sqlrf/Using-XML-in-SQL-Statements-1.sql\" : [\n    2\n  ],\n  \"sqlrf/Using-XML-in-SQL-Statements-5.sql\" : [\n    2\n  ],\n  \"sqlrf/XMLTRANSFORM-0.sql\" : [\n    3\n  ],\n  \"sqlrf/create-domain-18.sql\" : [\n    2\n  ],\n  \"sqlrf/create-domain-19.sql\" : [\n    2\n  ],\n  \"sqlrf/domain_name-2.sql\" : [\n    2\n  ],\n  \"sqlrf/domain_name-6.sql\" : [\n    2\n  ],\n  \"sqlrf/sys_row_etag-0.sql\" : [\n    3\n  ],\n  \"sqlrf/to_vector-1.sql\" : [\n    2\n  ],\n  \"sqlrf/to_vector-2.sql\" : [\n    2\n  ],\n  \"sqlrf/vector-0.sql\" : [\n    2\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/oracle-database_23/ParsingErrorCheck.json",
    "content": "{\n  \"adjsn/change-triggers-data-guide-enabled-search-index-0.sql\" : [\n    3\n  ],\n  \"adjsn/change-triggers-data-guide-enabled-search-index-1.sql\" : [\n    25\n  ],\n  \"adjsn/creating-b-tree-indexes-json_value-0.sql\" : [\n    2\n  ],\n  \"adjsn/creating-b-tree-indexes-json_value-1.sql\" : [\n    2\n  ],\n  \"adjsn/creating-b-tree-indexes-json_value-2.sql\" : [\n    2\n  ],\n  \"adjsn/creating-b-tree-indexes-json_value-3.sql\" : [\n    2\n  ],\n  \"adjsn/creating-bitmap-indexes-json_value-0.sql\" : [\n    2\n  ],\n  \"adjsn/creating-multivalue-function-based-indexes-json_exists-1.sql\" : [\n    2\n  ],\n  \"adjsn/creating-multivalue-function-based-indexes-json_exists-2.sql\" : [\n    2\n  ],\n  \"adjsn/creating-view-json-data-using-json_table-1.sql\" : [\n    3\n  ],\n  \"adjsn/json-collections-2.sql\" : [\n    2\n  ],\n  \"adjsn/json-collections-3.sql\" : [\n    2\n  ],\n  \"adjsn/json-collections-4.sql\" : [\n    2\n  ],\n  \"adjsn/json-query-rewrite-use-materialized-view-json_table-0.sql\" : [\n    3\n  ],\n  \"adjsn/json-query-rewrite-use-materialized-view-json_table-2.sql\" : [\n    2\n  ],\n  \"adjsn/json-schema-11.sql\" : [\n    5\n  ],\n  \"adjsn/json-schema-16.sql\" : [\n    4\n  ],\n  \"adjsn/json-schema-3.sql\" : [\n    2\n  ],\n  \"adjsn/json-schema-5.sql\" : [\n    2\n  ],\n  \"adjsn/json-schema-9.sql\" : [\n    2\n  ],\n  \"adjsn/json-search-index-ad-hoc-queries-and-full-text-search-1.sql\" : [\n    2\n  ],\n  \"adjsn/json-search-index-ad-hoc-queries-and-full-text-search-2.sql\" : [\n    2\n  ],\n  \"adjsn/json-search-index-ad-hoc-queries-and-full-text-search-3.sql\" : [\n    2\n  ],\n  \"adjsn/json-search-index-ad-hoc-queries-and-full-text-search-5.sql\" : [\n    2\n  ],\n  \"adjsn/json-search-index-ad-hoc-queries-and-full-text-search-6.sql\" : [\n    2\n  ],\n  \"adjsn/json-search-index-ad-hoc-queries-and-full-text-search-7.sql\" : [\n    14\n  ],\n  \"adjsn/json_transform-operation-handlers-3.sql\" : [\n    4\n  ],\n  \"adjsn/json_transform-operation-handlers-5.sql\" : [\n    4\n  ],\n  \"adjsn/json_transform-operator-rename-0.sql\" : [\n    3\n  ],\n  \"adjsn/loading-external-json-data-1.sql\" : [\n    3\n  ],\n  \"adjsn/loading-external-json-data-4.sql\" : [\n    2\n  ],\n  \"adjsn/oracle-sql-function-json_transform-4.sql\" : [\n    4\n  ],\n  \"adjsn/partitioning-json-data-0.sql\" : [\n    2\n  ],\n  \"adjsn/passing-clause-sql-functions-and-conditions-1.sql\" : [\n    4\n  ],\n  \"adjsn/persistent-data-guide-information-part-json-search-index-0.sql\" : [\n    2\n  ],\n  \"adjsn/persistent-data-guide-information-part-json-search-index-1.sql\" : [\n    2\n  ],\n  \"adjsn/persistent-data-guide-information-part-json-search-index-2.sql\" : [\n    2\n  ],\n  \"adjsn/populate-json-type-column-querying-textual-json-0.sql\" : [\n    2\n  ],\n  \"adjsn/populate-json-type-column-querying-textual-json-2.sql\" : [\n    3\n  ],\n  \"adjsn/populating-json-data-memory-column-store-0.sql\" : [\n    6\n  ],\n  \"adjsn/populating-json-data-memory-column-store-1.sql\" : [\n    2\n  ],\n  \"adjsn/sql-json-conditions-is-json-and-is-not-json-6.sql\" : [\n    6\n  ],\n  \"adjsn/sql-json-function-json_object-14.sql\" : [\n    3\n  ],\n  \"adjsn/sql-json-function-json_object-21.sql\" : [\n    2\n  ],\n  \"adjsn/sql-json-path-expression-item-methods-4.sql\" : [\n    4\n  ],\n  \"adjsn/tables-json-columns-3.sql\" : [\n    5\n  ],\n  \"adjsn/type-clause-sql-functions-and-conditions-6.sql\" : [\n    4\n  ],\n  \"adjsn/use-bind-variables-json_transform-0.sql\" : [\n    2\n  ],\n  \"adjsn/using-geojson-geographic-data-5.sql\" : [\n    2\n  ],\n  \"adjsn/using-online-redefinition-migrate-json-data-type-2.sql\" : [\n    2\n  ],\n  \"adjsn/using-sql-json-function-json_value-boolean-json-value-3.sql\" : [\n    4\n  ],\n  \"lnpls/ALTER-LIBRARY-statement-0.sql\" : [\n    2\n  ],\n  \"lnpls/ALTER-TYPE-statement-1.sql\" : [\n    2\n  ],\n  \"lnpls/ALTER-TYPE-statement-11.sql\" : [\n    2\n  ],\n  \"lnpls/ALTER-TYPE-statement-12.sql\" : [\n    2\n  ],\n  \"lnpls/ALTER-TYPE-statement-14.sql\" : [\n    2\n  ],\n  \"lnpls/ALTER-TYPE-statement-2.sql\" : [\n    5\n  ],\n  \"lnpls/ALTER-TYPE-statement-3.sql\" : [\n    2\n  ],\n  \"lnpls/ALTER-TYPE-statement-4.sql\" : [\n    2\n  ],\n  \"lnpls/ALTER-TYPE-statement-5.sql\" : [\n    2\n  ],\n  \"lnpls/ALTER-TYPE-statement-7.sql\" : [\n    2\n  ],\n  \"lnpls/ALTER-TYPE-statement-8.sql\" : [\n    2\n  ],\n  \"lnpls/ALTER-TYPE-statement-9.sql\" : [\n    2\n  ],\n  \"lnpls/CREATE-FUNCTION-statement-0.sql\" : [\n    2\n  ],\n  \"lnpls/CREATE-FUNCTION-statement-5.sql\" : [\n    5\n  ],\n  \"lnpls/CREATE-FUNCTION-statement-7.sql\" : [\n    2\n  ],\n  \"lnpls/CREATE-LIBRARY-statement-0.sql\" : [\n    2\n  ],\n  \"lnpls/CREATE-LIBRARY-statement-1.sql\" : [\n    2\n  ],\n  \"lnpls/CREATE-LIBRARY-statement-2.sql\" : [\n    2\n  ],\n  \"lnpls/CREATE-LIBRARY-statement-3.sql\" : [\n    2\n  ],\n  \"lnpls/CREATE-LIBRARY-statement-4.sql\" : [\n    2\n  ],\n  \"lnpls/CREATE-PACKAGE-statement-0.sql\" : [\n    2\n  ],\n  \"lnpls/CREATE-PROCEDURE-statement-0.sql\" : [\n    2\n  ],\n  \"lnpls/CREATE-PROCEDURE-statement-2.sql\" : [\n    5\n  ],\n  \"lnpls/CREATE-PROCEDURE-statement-5.sql\" : [\n    2\n  ],\n  \"lnpls/CREATE-TYPE-statement-17.sql\" : [\n    2\n  ],\n  \"lnpls/CREATE-TYPE-statement-6.sql\" : [\n    2\n  ],\n  \"lnpls/CREATE-TYPE-statement-7.sql\" : [\n    2\n  ],\n  \"lnpls/DEPRECATE-pragma-18.sql\" : [\n    2\n  ],\n  \"lnpls/SQL_MACRO-clause-1.sql\" : [\n    3\n  ],\n  \"lnpls/SQL_MACRO-clause-13.sql\" : [\n    10\n  ],\n  \"lnpls/SQL_MACRO-clause-16.sql\" : [\n    2\n  ],\n  \"lnpls/SQL_MACRO-clause-19.sql\" : [\n    3\n  ],\n  \"lnpls/SQL_MACRO-clause-2.sql\" : [\n    4\n  ],\n  \"lnpls/SQL_MACRO-clause-24.sql\" : [\n    4\n  ],\n  \"lnpls/SQL_MACRO-clause-3.sql\" : [\n    5\n  ],\n  \"lnpls/SQL_MACRO-clause-4.sql\" : [\n    6\n  ],\n  \"lnpls/SQL_MACRO-clause-5.sql\" : [\n    6\n  ],\n  \"lnpls/SQL_MACRO-clause-6.sql\" : [\n    7\n  ],\n  \"lnpls/assigning-values-record-variables-12.sql\" : [\n    2\n  ],\n  \"lnpls/autonomous-transactions-3.sql\" : [\n    3\n  ],\n  \"lnpls/autonomous-transactions-4.sql\" : [\n    3\n  ],\n  \"lnpls/avoiding-inner-capture-select-and-dml-statements-2.sql\" : [\n    2\n  ],\n  \"lnpls/avoiding-inner-capture-select-and-dml-statements-8.sql\" : [\n    5\n  ],\n  \"lnpls/bulk-sql-and-bulk-binding-1.sql\" : [\n    3\n  ],\n  \"lnpls/bulk-sql-and-bulk-binding-2.sql\" : [\n    3\n  ],\n  \"lnpls/bulk-sql-and-bulk-binding-28.sql\" : [\n    3\n  ],\n  \"lnpls/bulk-sql-and-bulk-binding-30.sql\" : [\n    3\n  ],\n  \"lnpls/bulk-sql-and-bulk-binding-5.sql\" : [\n    3\n  ],\n  \"lnpls/bulk-sql-and-bulk-binding-52.sql\" : [\n    10\n  ],\n  \"lnpls/bulk-sql-and-bulk-binding-59.sql\" : [\n    3\n  ],\n  \"lnpls/bulk-sql-and-bulk-binding-6.sql\" : [\n    8\n  ],\n  \"lnpls/bulk-sql-and-bulk-binding-61.sql\" : [\n    3\n  ],\n  \"lnpls/bulk-sql-and-bulk-binding-63.sql\" : [\n    3\n  ],\n  \"lnpls/bulk-sql-and-bulk-binding-65.sql\" : [\n    3\n  ],\n  \"lnpls/column-name-precedence-0.sql\" : [\n    3\n  ],\n  \"lnpls/column-name-precedence-2.sql\" : [\n    3\n  ],\n  \"lnpls/column-name-precedence-4.sql\" : [\n    3\n  ],\n  \"lnpls/compile-time-warnings-8.sql\" : [\n    2\n  ],\n  \"lnpls/compiling-pl-sql-units-native-execution-0.sql\" : [\n    2\n  ],\n  \"lnpls/compiling-pl-sql-units-native-execution-4.sql\" : [\n    2\n  ],\n  \"lnpls/compiling-pl-sql-units-native-execution-5.sql\" : [\n    2\n  ],\n  \"lnpls/conditional-compilation1-18.sql\" : [\n    46\n  ],\n  \"lnpls/conditional-compilation1-20.sql\" : [\n    2\n  ],\n  \"lnpls/conditional-compilation1-21.sql\" : [\n    2\n  ],\n  \"lnpls/conditional-compilation1-23.sql\" : [\n    4\n  ],\n  \"lnpls/conditional-selection-statements-21.sql\" : [\n    8\n  ],\n  \"lnpls/continuing-execution-handling-exceptions-0.sql\" : [\n    3\n  ],\n  \"lnpls/correlation-names-and-pseudorecords-17.sql\" : [\n    4\n  ],\n  \"lnpls/cursors-overview-0.sql\" : [\n    3\n  ],\n  \"lnpls/cursors-overview-2.sql\" : [\n    3\n  ],\n  \"lnpls/cursors-overview-7.sql\" : [\n    2\n  ],\n  \"lnpls/description-static-sql-0.sql\" : [\n    3\n  ],\n  \"lnpls/description-static-sql-2.sql\" : [\n    3\n  ],\n  \"lnpls/dml-triggers-38.sql\" : [\n    3\n  ],\n  \"lnpls/dml-triggers-42.sql\" : [\n    2\n  ],\n  \"lnpls/expressions-52.sql\" : [\n    8\n  ],\n  \"lnpls/expressions-54.sql\" : [\n    8\n  ],\n  \"lnpls/external-subprograms-4.sql\" : [\n    6\n  ],\n  \"lnpls/lexical-units-10.sql\" : [\n    7\n  ],\n  \"lnpls/loop-statements-31.sql\" : [\n    2\n  ],\n  \"lnpls/native-dynamic-sql-11.sql\" : [\n    2\n  ],\n  \"lnpls/overview-exception-handling-6.sql\" : [\n    22\n  ],\n  \"lnpls/overview-polymorphic-table-functions-18.sql\" : [\n    3\n  ],\n  \"lnpls/overview-polymorphic-table-functions-2.sql\" : [\n    5\n  ],\n  \"lnpls/overview-polymorphic-table-functions-29.sql\" : [\n    12\n  ],\n  \"lnpls/overview-polymorphic-table-functions-4.sql\" : [\n    2\n  ],\n  \"lnpls/overview-polymorphic-table-functions-5.sql\" : [\n    2\n  ],\n  \"lnpls/package-writing-guidelines-1.sql\" : [\n    4\n  ],\n  \"lnpls/record-variables-22.sql\" : [\n    7\n  ],\n  \"lnpls/record-variables-26.sql\" : [\n    2\n  ],\n  \"lnpls/record-variables-28.sql\" : [\n    2\n  ],\n  \"lnpls/release-changes-2.sql\" : [\n    2\n  ],\n  \"lnpls/release-changes-3.sql\" : [\n    2\n  ],\n  \"lnpls/retrying-transactions-handling-exceptions-0.sql\" : [\n    7\n  ],\n  \"lnpls/scope-and-visibility-identifiers-11.sql\" : [\n    3\n  ],\n  \"lnpls/sql-data-types-29.sql\" : [\n    8\n  ],\n  \"lnpls/sql-data-types-31.sql\" : [\n    3\n  ],\n  \"lnpls/sql-data-types-44.sql\" : [\n    3\n  ],\n  \"lnpls/subprograms-invoked-triggers-0.sql\" : [\n    8\n  ],\n  \"lnpls/transaction-processing-and-control-11.sql\" : [\n    3\n  ],\n  \"lnpls/transaction-processing-and-control-5.sql\" : [\n    3\n  ],\n  \"lnpls/transaction-processing-and-control-6.sql\" : [\n    3\n  ],\n  \"lnpls/transaction-processing-and-control-7.sql\" : [\n    3\n  ],\n  \"lnpls/transaction-processing-and-control-9.sql\" : [\n    3\n  ],\n  \"lnpls/triggers-publishing-events-0.sql\" : [\n    2\n  ],\n  \"lnpls/what-is-capture-2.sql\" : [\n    2\n  ],\n  \"lnpls/wrapping-pl-sql-source-text-pl-sql-wrapper-utility-7.sql\" : [\n    4\n  ],\n  \"sqlrf/ADMINISTER-KEY-MANAGEMENT-10.sql\" : [\n    2\n  ],\n  \"sqlrf/ADMINISTER-KEY-MANAGEMENT-11.sql\" : [\n    2\n  ],\n  \"sqlrf/ADMINISTER-KEY-MANAGEMENT-12.sql\" : [\n    2\n  ],\n  \"sqlrf/ADMINISTER-KEY-MANAGEMENT-13.sql\" : [\n    2\n  ],\n  \"sqlrf/ADMINISTER-KEY-MANAGEMENT-14.sql\" : [\n    2\n  ],\n  \"sqlrf/ADMINISTER-KEY-MANAGEMENT-15.sql\" : [\n    2\n  ],\n  \"sqlrf/ADMINISTER-KEY-MANAGEMENT-16.sql\" : [\n    2\n  ],\n  \"sqlrf/ADMINISTER-KEY-MANAGEMENT-17.sql\" : [\n    2\n  ],\n  \"sqlrf/ADMINISTER-KEY-MANAGEMENT-18.sql\" : [\n    2\n  ],\n  \"sqlrf/ADMINISTER-KEY-MANAGEMENT-19.sql\" : [\n    2\n  ],\n  \"sqlrf/ADMINISTER-KEY-MANAGEMENT-20.sql\" : [\n    2\n  ],\n  \"sqlrf/ADMINISTER-KEY-MANAGEMENT-21.sql\" : [\n    2\n  ],\n  \"sqlrf/ADMINISTER-KEY-MANAGEMENT-23.sql\" : [\n    2\n  ],\n  \"sqlrf/ADMINISTER-KEY-MANAGEMENT-24.sql\" : [\n    2\n  ],\n  \"sqlrf/ADMINISTER-KEY-MANAGEMENT-25.sql\" : [\n    2\n  ],\n  \"sqlrf/ADMINISTER-KEY-MANAGEMENT-26.sql\" : [\n    2\n  ],\n  \"sqlrf/ADMINISTER-KEY-MANAGEMENT-27.sql\" : [\n    2\n  ],\n  \"sqlrf/ADMINISTER-KEY-MANAGEMENT-28.sql\" : [\n    3\n  ],\n  \"sqlrf/ADMINISTER-KEY-MANAGEMENT-29.sql\" : [\n    2\n  ],\n  \"sqlrf/ADMINISTER-KEY-MANAGEMENT-3.sql\" : [\n    2\n  ],\n  \"sqlrf/ADMINISTER-KEY-MANAGEMENT-30.sql\" : [\n    2\n  ],\n  \"sqlrf/ADMINISTER-KEY-MANAGEMENT-31.sql\" : [\n    2\n  ],\n  \"sqlrf/ADMINISTER-KEY-MANAGEMENT-32.sql\" : [\n    2\n  ],\n  \"sqlrf/ADMINISTER-KEY-MANAGEMENT-33.sql\" : [\n    2\n  ],\n  \"sqlrf/ADMINISTER-KEY-MANAGEMENT-34.sql\" : [\n    2\n  ],\n  \"sqlrf/ADMINISTER-KEY-MANAGEMENT-35.sql\" : [\n    2\n  ],\n  \"sqlrf/ADMINISTER-KEY-MANAGEMENT-36.sql\" : [\n    2\n  ],\n  \"sqlrf/ADMINISTER-KEY-MANAGEMENT-37.sql\" : [\n    2\n  ],\n  \"sqlrf/ADMINISTER-KEY-MANAGEMENT-6.sql\" : [\n    2\n  ],\n  \"sqlrf/ADMINISTER-KEY-MANAGEMENT-7.sql\" : [\n    2\n  ],\n  \"sqlrf/ADMINISTER-KEY-MANAGEMENT-8.sql\" : [\n    2\n  ],\n  \"sqlrf/ADMINISTER-KEY-MANAGEMENT-9.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-ANALYTIC-VIEW-0.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-ANALYTIC-VIEW-1.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing-0.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing-1.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing-10.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing-11.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing-12.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing-13.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing-14.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing-2.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing-3.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing-4.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing-5.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing-6.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing-7.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing-8.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing-9.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-CLUSTER-0.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-CLUSTER-1.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-CLUSTER-2.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-CLUSTER-4.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-CLUSTER-6.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DATABASE-1.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DATABASE-10.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DATABASE-11.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DATABASE-12.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DATABASE-13.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DATABASE-14.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DATABASE-15.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DATABASE-16.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DATABASE-17.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DATABASE-18.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DATABASE-19.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DATABASE-2.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DATABASE-20.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DATABASE-21.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DATABASE-22.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DATABASE-23.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DATABASE-24.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DATABASE-25.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DATABASE-26.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DATABASE-27.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DATABASE-28.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DATABASE-3.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DATABASE-4.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DATABASE-5.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DATABASE-6.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DATABASE-7.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DATABASE-8.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DATABASE-9.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DATABASE-LINK-0.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DIMENSION-0.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DISKGROUP-1.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DISKGROUP-10.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DISKGROUP-11.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DISKGROUP-12.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DISKGROUP-13.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DISKGROUP-14.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DISKGROUP-15.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DISKGROUP-16.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DISKGROUP-2.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DISKGROUP-3.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DISKGROUP-4.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DISKGROUP-5.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DISKGROUP-6.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DISKGROUP-7.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DISKGROUP-8.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-DISKGROUP-9.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-HIERARCHY-0.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-INDEX-0.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-INDEX-1.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-INDEX-10.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-INDEX-11.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-INDEX-12.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-INDEX-2.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-INDEX-3.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-INDEX-4.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-INDEX-5.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-INDEX-6.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-INDEX-7.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-INDEX-8.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-INDEX-9.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-INDEXTYPE-0.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-INMEMORY-JOIN-GROUP-0.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-INMEMORY-JOIN-GROUP-1.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-JAVA-0.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-LOCKDOWN-PROFILE-10.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-LOCKDOWN-PROFILE-11.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-LOCKDOWN-PROFILE-12.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-LOCKDOWN-PROFILE-13.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-LOCKDOWN-PROFILE-14.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-LOCKDOWN-PROFILE-15.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-LOCKDOWN-PROFILE-16.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-LOCKDOWN-PROFILE-17.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-LOCKDOWN-PROFILE-18.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-LOCKDOWN-PROFILE-19.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-LOCKDOWN-PROFILE-2.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-LOCKDOWN-PROFILE-20.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-LOCKDOWN-PROFILE-21.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-LOCKDOWN-PROFILE-22.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-LOCKDOWN-PROFILE-23.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-LOCKDOWN-PROFILE-24.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-LOCKDOWN-PROFILE-25.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-LOCKDOWN-PROFILE-3.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-LOCKDOWN-PROFILE-4.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-LOCKDOWN-PROFILE-5.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-LOCKDOWN-PROFILE-6.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-LOCKDOWN-PROFILE-7.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-LOCKDOWN-PROFILE-8.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-LOCKDOWN-PROFILE-9.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-MATERIALIZED-VIEW-0.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-MATERIALIZED-VIEW-1.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-MATERIALIZED-VIEW-2.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-MATERIALIZED-VIEW-3.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-MATERIALIZED-VIEW-4.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-MATERIALIZED-VIEW-5.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-MATERIALIZED-VIEW-6.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-MATERIALIZED-VIEW-7.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-MATERIALIZED-VIEW-LOG-0.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-MATERIALIZED-VIEW-LOG-1.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-MATERIALIZED-ZONEMAP-0.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-MATERIALIZED-ZONEMAP-1.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-MATERIALIZED-ZONEMAP-2.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-MATERIALIZED-ZONEMAP-3.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-MATERIALIZED-ZONEMAP-4.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-MATERIALIZED-ZONEMAP-5.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-OPERATOR-0.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-OUTLINE-0.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-PLUGGABLE-DATABASE-0.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-PLUGGABLE-DATABASE-1.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-PLUGGABLE-DATABASE-10.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-PLUGGABLE-DATABASE-11.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-PLUGGABLE-DATABASE-12.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-PLUGGABLE-DATABASE-13.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-PLUGGABLE-DATABASE-14.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-PLUGGABLE-DATABASE-15.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-PLUGGABLE-DATABASE-16.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-PLUGGABLE-DATABASE-17.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-PLUGGABLE-DATABASE-18.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-PLUGGABLE-DATABASE-19.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-PLUGGABLE-DATABASE-2.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-PLUGGABLE-DATABASE-20.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-PLUGGABLE-DATABASE-21.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-PLUGGABLE-DATABASE-3.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-PLUGGABLE-DATABASE-6.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-PLUGGABLE-DATABASE-7.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-PLUGGABLE-DATABASE-8.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-PLUGGABLE-DATABASE-9.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-PROFILE-0.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-PROFILE-1.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-PROFILE-2.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-PROFILE-3.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-PROFILE-4.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-PROFILE-5.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-PROFILE-6.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-PROFILE-7.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-PROFILE-8.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-PROFILE-9.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-RESOURCE-COST-0.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-RESOURCE-COST-2.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-ROLE-0.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-ROLE-1.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-ROLE-2.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-ROLLBACK-SEGMENT-0.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-ROLLBACK-SEGMENT-1.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-SEQUENCE-0.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-SEQUENCE-1.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-SYNONYM-0.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-SYNONYM-1.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-SYNONYM-2.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-SYSTEM-0.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-SYSTEM-1.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-SYSTEM-10.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-SYSTEM-11.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-SYSTEM-12.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-SYSTEM-13.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-SYSTEM-14.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-SYSTEM-15.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-SYSTEM-16.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-SYSTEM-17.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-SYSTEM-18.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-SYSTEM-19.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-SYSTEM-20.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-SYSTEM-21.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-SYSTEM-22.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-SYSTEM-23.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-SYSTEM-24.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-SYSTEM-25.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-SYSTEM-27.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-SYSTEM-28.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-SYSTEM-5.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-SYSTEM-7.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-SYSTEM-8.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-SYSTEM-9.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-0.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-10.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-100.sql\" : [\n    3\n  ],\n  \"sqlrf/ALTER-TABLE-101.sql\" : [\n    3\n  ],\n  \"sqlrf/ALTER-TABLE-103.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-104.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-105.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-106.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-107.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-108.sql\" : [\n    9\n  ],\n  \"sqlrf/ALTER-TABLE-109.sql\" : [\n    4\n  ],\n  \"sqlrf/ALTER-TABLE-11.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-110.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-112.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-113.sql\" : [\n    3\n  ],\n  \"sqlrf/ALTER-TABLE-114.sql\" : [\n    3\n  ],\n  \"sqlrf/ALTER-TABLE-117.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-122.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-123.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-124.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-125.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-126.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-127.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-129.sql\" : [\n    3\n  ],\n  \"sqlrf/ALTER-TABLE-17.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-18.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-19.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-20.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-21.sql\" : [\n    3\n  ],\n  \"sqlrf/ALTER-TABLE-22.sql\" : [\n    3\n  ],\n  \"sqlrf/ALTER-TABLE-24.sql\" : [\n    3\n  ],\n  \"sqlrf/ALTER-TABLE-25.sql\" : [\n    3\n  ],\n  \"sqlrf/ALTER-TABLE-27.sql\" : [\n    3\n  ],\n  \"sqlrf/ALTER-TABLE-29.sql\" : [\n    3\n  ],\n  \"sqlrf/ALTER-TABLE-30.sql\" : [\n    3\n  ],\n  \"sqlrf/ALTER-TABLE-33.sql\" : [\n    3\n  ],\n  \"sqlrf/ALTER-TABLE-35.sql\" : [\n    3\n  ],\n  \"sqlrf/ALTER-TABLE-37.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-38.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-39.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-4.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-40.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-41.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-43.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-47.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-48.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-49.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-5.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-50.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-51.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-52.sql\" : [\n    13\n  ],\n  \"sqlrf/ALTER-TABLE-53.sql\" : [\n    3\n  ],\n  \"sqlrf/ALTER-TABLE-54.sql\" : [\n    3\n  ],\n  \"sqlrf/ALTER-TABLE-55.sql\" : [\n    3\n  ],\n  \"sqlrf/ALTER-TABLE-56.sql\" : [\n    3\n  ],\n  \"sqlrf/ALTER-TABLE-57.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-58.sql\" : [\n    3\n  ],\n  \"sqlrf/ALTER-TABLE-59.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-6.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-60.sql\" : [\n    3\n  ],\n  \"sqlrf/ALTER-TABLE-61.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-63.sql\" : [\n    10\n  ],\n  \"sqlrf/ALTER-TABLE-64.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-65.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-66.sql\" : [\n    3\n  ],\n  \"sqlrf/ALTER-TABLE-67.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-68.sql\" : [\n    3\n  ],\n  \"sqlrf/ALTER-TABLE-69.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-7.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-70.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-71.sql\" : [\n    4\n  ],\n  \"sqlrf/ALTER-TABLE-73.sql\" : [\n    3\n  ],\n  \"sqlrf/ALTER-TABLE-74.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-75.sql\" : [\n    3\n  ],\n  \"sqlrf/ALTER-TABLE-76.sql\" : [\n    3\n  ],\n  \"sqlrf/ALTER-TABLE-77.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-79.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-8.sql\" : [\n    4\n  ],\n  \"sqlrf/ALTER-TABLE-81.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-82.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-83.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-85.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-87.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-88.sql\" : [\n    3\n  ],\n  \"sqlrf/ALTER-TABLE-89.sql\" : [\n    3\n  ],\n  \"sqlrf/ALTER-TABLE-9.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-90.sql\" : [\n    3\n  ],\n  \"sqlrf/ALTER-TABLE-91.sql\" : [\n    3\n  ],\n  \"sqlrf/ALTER-TABLE-92.sql\" : [\n    3\n  ],\n  \"sqlrf/ALTER-TABLE-94.sql\" : [\n    3\n  ],\n  \"sqlrf/ALTER-TABLE-96.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-98.sql\" : [\n    3\n  ],\n  \"sqlrf/ALTER-TABLE-99.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLESPACE-0.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLESPACE-1.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLESPACE-10.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLESPACE-11.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLESPACE-12.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLESPACE-13.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLESPACE-14.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLESPACE-15.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLESPACE-16.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLESPACE-2.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLESPACE-3.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLESPACE-4.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLESPACE-5.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLESPACE-6.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLESPACE-7.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLESPACE-8.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLESPACE-9.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLESPACE-SET-0.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-USER-0.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-USER-1.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-USER-10.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-USER-11.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-USER-12.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-USER-13.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-USER-14.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-USER-15.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-USER-2.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-USER-4.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-USER-5.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-USER-6.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-USER-7.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-USER-8.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-USER-9.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-VIEW-0.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-VIEW-1.sql\" : [\n    2\n  ],\n  \"sqlrf/ANALYZE-0.sql\" : [\n    2\n  ],\n  \"sqlrf/ANALYZE-1.sql\" : [\n    2\n  ],\n  \"sqlrf/ANALYZE-2.sql\" : [\n    2\n  ],\n  \"sqlrf/ANALYZE-3.sql\" : [\n    2\n  ],\n  \"sqlrf/ANALYZE-4.sql\" : [\n    2\n  ],\n  \"sqlrf/ANALYZE-5.sql\" : [\n    2\n  ],\n  \"sqlrf/ANALYZE-6.sql\" : [\n    2\n  ],\n  \"sqlrf/APPROX_COUNT-0.sql\" : [\n    8\n  ],\n  \"sqlrf/APPROX_MEDIAN-0.sql\" : [\n    3\n  ],\n  \"sqlrf/APPROX_MEDIAN-1.sql\" : [\n    3\n  ],\n  \"sqlrf/APPROX_MEDIAN-2.sql\" : [\n    3\n  ],\n  \"sqlrf/APPROX_PERCENTILE-0.sql\" : [\n    3\n  ],\n  \"sqlrf/APPROX_PERCENTILE-1.sql\" : [\n    3\n  ],\n  \"sqlrf/APPROX_PERCENTILE-2.sql\" : [\n    3\n  ],\n  \"sqlrf/APPROX_PERCENTILE-3.sql\" : [\n    4\n  ],\n  \"sqlrf/APPROX_PERCENTILE_DETAIL-0.sql\" : [\n    3\n  ],\n  \"sqlrf/APPROX_RANK-0.sql\" : [\n    4\n  ],\n  \"sqlrf/APPROX_SUM-0.sql\" : [\n    8\n  ],\n  \"sqlrf/ASSOCIATE-STATISTICS-0.sql\" : [\n    2\n  ],\n  \"sqlrf/ASSOCIATE-STATISTICS-1.sql\" : [\n    2\n  ],\n  \"sqlrf/AUDIT-Unified-Auditing-0.sql\" : [\n    2\n  ],\n  \"sqlrf/AUDIT-Unified-Auditing-2.sql\" : [\n    2\n  ],\n  \"sqlrf/AUDIT-Unified-Auditing-4.sql\" : [\n    2\n  ],\n  \"sqlrf/AUDIT-Unified-Auditing-6.sql\" : [\n    2\n  ],\n  \"sqlrf/AUDIT-Unified-Auditing-8.sql\" : [\n    2\n  ],\n  \"sqlrf/CALL-0.sql\" : [\n    2\n  ],\n  \"sqlrf/CALL-1.sql\" : [\n    2\n  ],\n  \"sqlrf/CALL-2.sql\" : [\n    2\n  ],\n  \"sqlrf/CALL-3.sql\" : [\n    2\n  ],\n  \"sqlrf/CALL-4.sql\" : [\n    9\n  ],\n  \"sqlrf/CAST-13.sql\" : [\n    2\n  ],\n  \"sqlrf/CAST-16.sql\" : [\n    2\n  ],\n  \"sqlrf/CHR-5.sql\" : [\n    2\n  ],\n  \"sqlrf/CLUSTER_DETAILS-0.sql\" : [\n    3\n  ],\n  \"sqlrf/CLUSTER_DETAILS-1.sql\" : [\n    4\n  ],\n  \"sqlrf/CLUSTER_DISTANCE-0.sql\" : [\n    6\n  ],\n  \"sqlrf/CLUSTER_ID-0.sql\" : [\n    2\n  ],\n  \"sqlrf/CLUSTER_ID-1.sql\" : [\n    4\n  ],\n  \"sqlrf/CLUSTER_PROBABILITY-0.sql\" : [\n    4\n  ],\n  \"sqlrf/CLUSTER_SET-0.sql\" : [\n    3\n  ],\n  \"sqlrf/COLLATE-Operator-0.sql\" : [\n    4\n  ],\n  \"sqlrf/COLUMN_VALUE-Pseudocolumn-4.sql\" : [\n    7\n  ],\n  \"sqlrf/CORR-2.sql\" : [\n    3\n  ],\n  \"sqlrf/CREATE-ANALYTIC-VIEW-1.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-ATTRIBUTE-DIMENSION-1.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-ATTRIBUTE-DIMENSION-3.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-ATTRIBUTE-DIMENSION-5.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-1.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-10.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-11.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-14.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-16.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-17.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-19.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-20.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-21.sql\" : [\n    4\n  ],\n  \"sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-22.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-23.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-24.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-25.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-26.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-27.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-28.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-30.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-9.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-CLUSTER-0.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-CLUSTER-1.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-CLUSTER-10.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-CLUSTER-2.sql\" : [\n    3\n  ],\n  \"sqlrf/CREATE-CLUSTER-3.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-CLUSTER-4.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-CLUSTER-5.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-CLUSTER-6.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-CLUSTER-7.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-CLUSTER-8.sql\" : [\n    4\n  ],\n  \"sqlrf/CREATE-CLUSTER-9.sql\" : [\n    6\n  ],\n  \"sqlrf/CREATE-CONTEXT-0.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-CONTROLFILE-0.sql\" : [\n    4\n  ],\n  \"sqlrf/CREATE-DATABASE-0.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-DATABASE-1.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-DATABASE-LINK-0.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-DATABASE-LINK-2.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-DATABASE-LINK-6.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-DIMENSION-0.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-DIMENSION-1.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-DIMENSION-2.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-DISKGROUP-0.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-EDITION-1.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-EDITION-2.sql\" : [\n    3\n  ],\n  \"sqlrf/CREATE-EDITION-3.sql\" : [\n    3\n  ],\n  \"sqlrf/CREATE-FLASHBACK-ARCHIVE-0.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-FLASHBACK-ARCHIVE-2.sql\" : [\n    3\n  ],\n  \"sqlrf/CREATE-FLASHBACK-ARCHIVE-3.sql\" : [\n    3\n  ],\n  \"sqlrf/CREATE-HIERARCHY-0.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-HIERARCHY-1.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-HIERARCHY-2.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-INDEX-0.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-INDEX-10.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-INDEX-12.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-INDEX-14.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-INDEX-15.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-INDEX-17.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-INDEX-19.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-INDEX-20.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-INDEX-21.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-INDEX-22.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-INDEX-23.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-INDEX-24.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-INDEX-25.sql\" : [\n    30\n  ],\n  \"sqlrf/CREATE-INDEX-26.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-INDEX-27.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-INDEX-28.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-INDEX-29.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-INDEX-4.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-INDEX-6.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-INDEX-7.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-INDEX-8.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-INDEX-9.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-INDEXTYPE-0.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-INMEMORY-JOIN-GROUP-0.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-INMEMORY-JOIN-GROUP-1.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-JAVA-1.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-JAVA-2.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-JAVA-3.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-LOCKDOWN-PROFILE-0.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-MATERIALIZED-VIEW-11.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-MATERIALIZED-VIEW-12.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-MATERIALIZED-VIEW-2.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-MATERIALIZED-VIEW-3.sql\" : [\n    4\n  ],\n  \"sqlrf/CREATE-MATERIALIZED-VIEW-4.sql\" : [\n    5\n  ],\n  \"sqlrf/CREATE-MATERIALIZED-VIEW-5.sql\" : [\n    3\n  ],\n  \"sqlrf/CREATE-MATERIALIZED-VIEW-6.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-MATERIALIZED-VIEW-7.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-MATERIALIZED-VIEW-8.sql\" : [\n    5\n  ],\n  \"sqlrf/CREATE-MATERIALIZED-VIEW-9.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-MATERIALIZED-VIEW-LOG-1.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-MATERIALIZED-VIEW-LOG-2.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-MATERIALIZED-VIEW-LOG-3.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-MATERIALIZED-VIEW-LOG-4.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-MATERIALIZED-VIEW-LOG-5.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-MATERIALIZED-VIEW-LOG-6.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-MATERIALIZED-VIEW-LOG-7.sql\" : [\n    3\n  ],\n  \"sqlrf/CREATE-MATERIALIZED-VIEW-LOG-8.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-MATERIALIZED-ZONEMAP-4.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-MATERIALIZED-ZONEMAP-5.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-MATERIALIZED-ZONEMAP-6.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-MATERIALIZED-ZONEMAP-7.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-MATERIALIZED-ZONEMAP-8.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-OPERATOR-0.sql\" : [\n    9\n  ],\n  \"sqlrf/CREATE-OUTLINE-0.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-OUTLINE-1.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-OUTLINE-2.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-PFILE-0.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-PLUGGABLE-DATABASE-10.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-PLUGGABLE-DATABASE-11.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-PLUGGABLE-DATABASE-3.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-PLUGGABLE-DATABASE-4.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-PLUGGABLE-DATABASE-9.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-PROFILE-1.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-PROFILE-2.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-PROFILE-4.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-PROFILE-5.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-PROFILE-6.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-PROFILE-7.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-RESTORE-POINT-0.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-ROLE-1.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-ROLE-2.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-ROLE-3.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-ROLE-4.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-ROLE-5.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-ROLE-6.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-ROLE-7.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-ROLLBACK-SEGMENT-0.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-ROLLBACK-SEGMENT-1.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-SCHEMA-0.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-SEQUENCE-4.sql\" : [\n    6\n  ],\n  \"sqlrf/CREATE-SPFILE-0.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-SPFILE-2.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-TABLE-1.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-TABLE-11.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-TABLE-12.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-TABLE-13.sql\" : [\n    3\n  ],\n  \"sqlrf/CREATE-TABLE-15.sql\" : [\n    26\n  ],\n  \"sqlrf/CREATE-TABLE-20.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-TABLE-21.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-TABLE-22.sql\" : [\n    4\n  ],\n  \"sqlrf/CREATE-TABLE-23.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-TABLE-25.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-TABLE-27.sql\" : [\n    3\n  ],\n  \"sqlrf/CREATE-TABLE-28.sql\" : [\n    3\n  ],\n  \"sqlrf/CREATE-TABLE-31.sql\" : [\n    13\n  ],\n  \"sqlrf/CREATE-TABLE-32.sql\" : [\n    15\n  ],\n  \"sqlrf/CREATE-TABLE-33.sql\" : [\n    9\n  ],\n  \"sqlrf/CREATE-TABLE-34.sql\" : [\n    13\n  ],\n  \"sqlrf/CREATE-TABLE-35.sql\" : [\n    11\n  ],\n  \"sqlrf/CREATE-TABLE-36.sql\" : [\n    7\n  ],\n  \"sqlrf/CREATE-TABLE-37.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-TABLE-38.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-TABLE-39.sql\" : [\n    5\n  ],\n  \"sqlrf/CREATE-TABLE-40.sql\" : [\n    5\n  ],\n  \"sqlrf/CREATE-TABLE-41.sql\" : [\n    5\n  ],\n  \"sqlrf/CREATE-TABLE-46.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-TABLE-49.sql\" : [\n    8\n  ],\n  \"sqlrf/CREATE-TABLE-5.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-TABLE-54.sql\" : [\n    13\n  ],\n  \"sqlrf/CREATE-TABLE-56.sql\" : [\n    10\n  ],\n  \"sqlrf/CREATE-TABLE-58.sql\" : [\n    16\n  ],\n  \"sqlrf/CREATE-TABLE-6.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-TABLE-60.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-TABLE-61.sql\" : [\n    6\n  ],\n  \"sqlrf/CREATE-TABLE-62.sql\" : [\n    5\n  ],\n  \"sqlrf/CREATE-TABLE-63.sql\" : [\n    4\n  ],\n  \"sqlrf/CREATE-TABLE-64.sql\" : [\n    15\n  ],\n  \"sqlrf/CREATE-TABLE-65.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-TABLE-66.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-TABLE-67.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-TABLE-69.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-TABLE-7.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-TABLE-70.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-TABLE-71.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-TABLE-72.sql\" : [\n    3\n  ],\n  \"sqlrf/CREATE-TABLE-73.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-TABLE-74.sql\" : [\n    3\n  ],\n  \"sqlrf/CREATE-TABLE-75.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-TABLE-8.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-TABLE-9.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-TABLESPACE-0.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-TABLESPACE-1.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-TABLESPACE-10.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-TABLESPACE-11.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-TABLESPACE-12.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-TABLESPACE-14.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-TABLESPACE-15.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-TABLESPACE-16.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-TABLESPACE-2.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-TABLESPACE-3.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-TABLESPACE-4.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-TABLESPACE-5.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-TABLESPACE-6.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-TABLESPACE-7.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-TABLESPACE-8.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-TABLESPACE-9.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-TABLESPACE-SET-0.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-USER-0.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-USER-1.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-USER-2.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-USER-3.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-USER-4.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-USER-5.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-USER-6.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-USER-7.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-USER-8.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-USER-9.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-VIEW-11.sql\" : [\n    3\n  ],\n  \"sqlrf/CREATE-VIEW-14.sql\" : [\n    15\n  ],\n  \"sqlrf/CREATE-VIEW-2.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-VIEW-3.sql\" : [\n    2\n  ],\n  \"sqlrf/CUME_DIST-0.sql\" : [\n    3\n  ],\n  \"sqlrf/CV-0.sql\" : [\n    6\n  ],\n  \"sqlrf/Comments-1.sql\" : [\n    6\n  ],\n  \"sqlrf/Comments-2.sql\" : [\n    2\n  ],\n  \"sqlrf/Comments-29.sql\" : [\n    2\n  ],\n  \"sqlrf/Comments-4.sql\" : [\n    2\n  ],\n  \"sqlrf/Comments-44.sql\" : [\n    2\n  ],\n  \"sqlrf/Comments-49.sql\" : [\n    3\n  ],\n  \"sqlrf/DELETE-0.sql\" : [\n    3\n  ],\n  \"sqlrf/DELETE-12.sql\" : [\n    2\n  ],\n  \"sqlrf/DELETE-5.sql\" : [\n    2\n  ],\n  \"sqlrf/DELETE-7.sql\" : [\n    11\n  ],\n  \"sqlrf/DENSE_RANK-0.sql\" : [\n    3\n  ],\n  \"sqlrf/DISASSOCIATE-STATISTICS-0.sql\" : [\n    2\n  ],\n  \"sqlrf/DROP-DATABASE-0.sql\" : [\n    4\n  ],\n  \"sqlrf/Data-Types-16.sql\" : [\n    2\n  ],\n  \"sqlrf/Data-Types-17.sql\" : [\n    5\n  ],\n  \"sqlrf/Data-Types-36.sql\" : [\n    4\n  ],\n  \"sqlrf/EXPLAIN-PLAN-0.sql\" : [\n    2\n  ],\n  \"sqlrf/EXPLAIN-PLAN-3.sql\" : [\n    2\n  ],\n  \"sqlrf/FEATURE_COMPARE-0.sql\" : [\n    2\n  ],\n  \"sqlrf/FEATURE_COMPARE-1.sql\" : [\n    2\n  ],\n  \"sqlrf/FEATURE_DETAILS-0.sql\" : [\n    3\n  ],\n  \"sqlrf/FEATURE_DETAILS-1.sql\" : [\n    4\n  ],\n  \"sqlrf/FEATURE_ID-0.sql\" : [\n    2\n  ],\n  \"sqlrf/FEATURE_SET-0.sql\" : [\n    21\n  ],\n  \"sqlrf/FEATURE_VALUE-0.sql\" : [\n    3\n  ],\n  \"sqlrf/FLASHBACK-DATABASE-0.sql\" : [\n    4\n  ],\n  \"sqlrf/FLASHBACK-DATABASE-1.sql\" : [\n    6\n  ],\n  \"sqlrf/FLASHBACK-TABLE-1.sql\" : [\n    3\n  ],\n  \"sqlrf/FLASHBACK-TABLE-3.sql\" : [\n    3\n  ],\n  \"sqlrf/FLASHBACK-TABLE-6.sql\" : [\n    2\n  ],\n  \"sqlrf/FLASHBACK-TABLE-8.sql\" : [\n    2\n  ],\n  \"sqlrf/FLASHBACK-TABLE-9.sql\" : [\n    2\n  ],\n  \"sqlrf/Floating-Point-Conditions-1.sql\" : [\n    3\n  ],\n  \"sqlrf/Floating-Point-Conditions-3.sql\" : [\n    3\n  ],\n  \"sqlrf/Graphic-Syntax-Diagrams-2.sql\" : [\n    2\n  ],\n  \"sqlrf/INSERT-26.sql\" : [\n    8\n  ],\n  \"sqlrf/ITERATION_NUMBER-0.sql\" : [\n    6\n  ],\n  \"sqlrf/Interval-Expressions-0.sql\" : [\n    2\n  ],\n  \"sqlrf/JSON_SERIALIZE-0.sql\" : [\n    2\n  ],\n  \"sqlrf/JSON_TRANSFORM-1.sql\" : [\n    2\n  ],\n  \"sqlrf/LOCK-TABLE-1.sql\" : [\n    2\n  ],\n  \"sqlrf/LOCK-TABLE-2.sql\" : [\n    2\n  ],\n  \"sqlrf/MERGE-10.sql\" : [\n    11\n  ],\n  \"sqlrf/MERGE-12.sql\" : [\n    11\n  ],\n  \"sqlrf/Model-Conditions-0.sql\" : [\n    6\n  ],\n  \"sqlrf/Model-Conditions-1.sql\" : [\n    6\n  ],\n  \"sqlrf/Model-Expressions-0.sql\" : [\n    6\n  ],\n  \"sqlrf/Multiset-Operators-0.sql\" : [\n    2\n  ],\n  \"sqlrf/Multiset-Operators-2.sql\" : [\n    3\n  ],\n  \"sqlrf/NCHR-0.sql\" : [\n    4\n  ],\n  \"sqlrf/NOAUDIT-Traditional-Auditing-0.sql\" : [\n    2\n  ],\n  \"sqlrf/NOAUDIT-Traditional-Auditing-1.sql\" : [\n    2\n  ],\n  \"sqlrf/NOAUDIT-Traditional-Auditing-2.sql\" : [\n    2\n  ],\n  \"sqlrf/NOAUDIT-Traditional-Auditing-3.sql\" : [\n    2\n  ],\n  \"sqlrf/NOAUDIT-Traditional-Auditing-4.sql\" : [\n    2\n  ],\n  \"sqlrf/NOAUDIT-Unified-Auditing-0.sql\" : [\n    2\n  ],\n  \"sqlrf/NOAUDIT-Unified-Auditing-3.sql\" : [\n    2\n  ],\n  \"sqlrf/NOAUDIT-Unified-Auditing-5.sql\" : [\n    2\n  ],\n  \"sqlrf/NOAUDIT-Unified-Auditing-7.sql\" : [\n    2\n  ],\n  \"sqlrf/ORA_DM_PARTITION_NAME-0.sql\" : [\n    2\n  ],\n  \"sqlrf/PERCENTILE_CONT-1.sql\" : [\n    3\n  ],\n  \"sqlrf/PERCENTILE_CONT-2.sql\" : [\n    3\n  ],\n  \"sqlrf/PERCENTILE_DISC-0.sql\" : [\n    3\n  ],\n  \"sqlrf/PERCENT_RANK-0.sql\" : [\n    3\n  ],\n  \"sqlrf/PREDICTION-0.sql\" : [\n    4\n  ],\n  \"sqlrf/PREDICTION-2.sql\" : [\n    6\n  ],\n  \"sqlrf/PREDICTION_BOUNDS-0.sql\" : [\n    5\n  ],\n  \"sqlrf/PREDICTION_COST-2.sql\" : [\n    4\n  ],\n  \"sqlrf/PREDICTION_DETAILS-0.sql\" : [\n    2\n  ],\n  \"sqlrf/PREDICTION_DETAILS-1.sql\" : [\n    6\n  ],\n  \"sqlrf/PREDICTION_PROBABILITY-0.sql\" : [\n    6\n  ],\n  \"sqlrf/PREDICTION_PROBABILITY-1.sql\" : [\n    7\n  ],\n  \"sqlrf/PREDICTION_SET-0.sql\" : [\n    4\n  ],\n  \"sqlrf/PRESENTNNV-0.sql\" : [\n    6\n  ],\n  \"sqlrf/PRESENTV-0.sql\" : [\n    6\n  ],\n  \"sqlrf/PREVIOUS-0.sql\" : [\n    5\n  ],\n  \"sqlrf/PURGE-1.sql\" : [\n    2\n  ],\n  \"sqlrf/PURGE-2.sql\" : [\n    2\n  ],\n  \"sqlrf/PURGE-3.sql\" : [\n    2\n  ],\n  \"sqlrf/RANK-0.sql\" : [\n    3\n  ],\n  \"sqlrf/RANK-1.sql\" : [\n    3\n  ],\n  \"sqlrf/REF-1.sql\" : [\n    2\n  ],\n  \"sqlrf/REFTOHEX-0.sql\" : [\n    2\n  ],\n  \"sqlrf/RENAME-0.sql\" : [\n    2\n  ],\n  \"sqlrf/RENAME-1.sql\" : [\n    3\n  ],\n  \"sqlrf/REVOKE-0.sql\" : [\n    2\n  ],\n  \"sqlrf/REVOKE-1.sql\" : [\n    2\n  ],\n  \"sqlrf/REVOKE-10.sql\" : [\n    2\n  ],\n  \"sqlrf/REVOKE-12.sql\" : [\n    2\n  ],\n  \"sqlrf/REVOKE-15.sql\" : [\n    2\n  ],\n  \"sqlrf/REVOKE-16.sql\" : [\n    2\n  ],\n  \"sqlrf/REVOKE-19.sql\" : [\n    4\n  ],\n  \"sqlrf/REVOKE-2.sql\" : [\n    2\n  ],\n  \"sqlrf/REVOKE-3.sql\" : [\n    2\n  ],\n  \"sqlrf/REVOKE-5.sql\" : [\n    2\n  ],\n  \"sqlrf/REVOKE-6.sql\" : [\n    2\n  ],\n  \"sqlrf/REVOKE-8.sql\" : [\n    2\n  ],\n  \"sqlrf/SCN_TO_TIMESTAMP-2.sql\" : [\n    4\n  ],\n  \"sqlrf/SELECT-10.sql\" : [\n    4\n  ],\n  \"sqlrf/SELECT-11.sql\" : [\n    4\n  ],\n  \"sqlrf/SELECT-116.sql\" : [\n    4\n  ],\n  \"sqlrf/SELECT-117.sql\" : [\n    4\n  ],\n  \"sqlrf/SELECT-17.sql\" : [\n    3\n  ],\n  \"sqlrf/SELECT-20.sql\" : [\n    5\n  ],\n  \"sqlrf/SELECT-21.sql\" : [\n    2\n  ],\n  \"sqlrf/SELECT-31.sql\" : [\n    6\n  ],\n  \"sqlrf/SELECT-33.sql\" : [\n    3\n  ],\n  \"sqlrf/SELECT-35.sql\" : [\n    3\n  ],\n  \"sqlrf/SELECT-37.sql\" : [\n    4\n  ],\n  \"sqlrf/SELECT-42.sql\" : [\n    2\n  ],\n  \"sqlrf/SELECT-44.sql\" : [\n    2\n  ],\n  \"sqlrf/SELECT-45.sql\" : [\n    2\n  ],\n  \"sqlrf/SELECT-46.sql\" : [\n    2\n  ],\n  \"sqlrf/SELECT-48.sql\" : [\n    3\n  ],\n  \"sqlrf/SELECT-49.sql\" : [\n    3\n  ],\n  \"sqlrf/SELECT-5.sql\" : [\n    3\n  ],\n  \"sqlrf/SELECT-50.sql\" : [\n    4\n  ],\n  \"sqlrf/SELECT-65.sql\" : [\n    6\n  ],\n  \"sqlrf/SELECT-66.sql\" : [\n    8\n  ],\n  \"sqlrf/SELECT-74.sql\" : [\n    3\n  ],\n  \"sqlrf/SELECT-75.sql\" : [\n    2\n  ],\n  \"sqlrf/SELECT-82.sql\" : [\n    3\n  ],\n  \"sqlrf/SELECT-87.sql\" : [\n    7\n  ],\n  \"sqlrf/SELECT-91.sql\" : [\n    2\n  ],\n  \"sqlrf/SELECT-94.sql\" : [\n    3\n  ],\n  \"sqlrf/SELECT-95.sql\" : [\n    3\n  ],\n  \"sqlrf/SELECT-97.sql\" : [\n    8\n  ],\n  \"sqlrf/SELECT-98.sql\" : [\n    14\n  ],\n  \"sqlrf/SET-CONSTRAINTS-1.sql\" : [\n    3\n  ],\n  \"sqlrf/SQL-JSON-Conditions-36.sql\" : [\n    2\n  ],\n  \"sqlrf/SYS_GUID-0.sql\" : [\n    2\n  ],\n  \"sqlrf/SYS_OP_ZONE_ID-0.sql\" : [\n    2\n  ],\n  \"sqlrf/SYS_OP_ZONE_ID-1.sql\" : [\n    2\n  ],\n  \"sqlrf/SYS_OP_ZONE_ID-2.sql\" : [\n    2\n  ],\n  \"sqlrf/SYS_OP_ZONE_ID-3.sql\" : [\n    2\n  ],\n  \"sqlrf/Syntax-for-Schema-Objects-and-Parts-in-SQL-Statements-3.sql\" : [\n    4\n  ],\n  \"sqlrf/Syntax-for-Schema-Objects-and-Parts-in-SQL-Statements-4.sql\" : [\n    3\n  ],\n  \"sqlrf/TRANSLATE-USING-0.sql\" : [\n    10\n  ],\n  \"sqlrf/TRUNCATE-CLUSTER-0.sql\" : [\n    2\n  ],\n  \"sqlrf/Type-Constructor-Expressions-1.sql\" : [\n    2\n  ],\n  \"sqlrf/UPDATE-0.sql\" : [\n    4\n  ],\n  \"sqlrf/UPDATE-5.sql\" : [\n    2\n  ],\n  \"sqlrf/UPDATE-6.sql\" : [\n    2\n  ],\n  \"sqlrf/UPDATE-9.sql\" : [\n    4\n  ],\n  \"sqlrf/Using-Extensible-Indexing-3.sql\" : [\n    2\n  ],\n  \"sqlrf/Using-Extensible-Indexing-4.sql\" : [\n    2\n  ],\n  \"sqlrf/Using-Extensible-Indexing-6.sql\" : [\n    2\n  ],\n  \"sqlrf/Using-XML-in-SQL-Statements-0.sql\" : [\n    2\n  ],\n  \"sqlrf/Using-XML-in-SQL-Statements-4.sql\" : [\n    2\n  ],\n  \"sqlrf/Using-XML-in-SQL-Statements-6.sql\" : [\n    2\n  ],\n  \"sqlrf/Using-XML-in-SQL-Statements-8.sql\" : [\n    5\n  ],\n  \"sqlrf/Using-XML-in-SQL-Statements-9.sql\" : [\n    5\n  ],\n  \"sqlrf/VALIDATE_CONVERSION-0.sql\" : [\n    2\n  ],\n  \"sqlrf/VALIDATE_CONVERSION-1.sql\" : [\n    2\n  ],\n  \"sqlrf/VALIDATE_CONVERSION-2.sql\" : [\n    2\n  ],\n  \"sqlrf/XMLDATA-Pseudocolumn-0.sql\" : [\n    2\n  ],\n  \"sqlrf/XMLDATA-Pseudocolumn-1.sql\" : [\n    3\n  ],\n  \"sqlrf/XMLDATA-Pseudocolumn-2.sql\" : [\n    3\n  ],\n  \"sqlrf/alter-domain-0.sql\" : [\n    2\n  ],\n  \"sqlrf/alter-domain-1.sql\" : [\n    2\n  ],\n  \"sqlrf/alter-domain-2.sql\" : [\n    2\n  ],\n  \"sqlrf/alter-domain-3.sql\" : [\n    2\n  ],\n  \"sqlrf/alter-domain-4.sql\" : [\n    2\n  ],\n  \"sqlrf/alter-domain-5.sql\" : [\n    2\n  ],\n  \"sqlrf/alter-domain-6.sql\" : [\n    2\n  ],\n  \"sqlrf/alter-mle-env-0.sql\" : [\n    2\n  ],\n  \"sqlrf/alter-mle-module-0.sql\" : [\n    2\n  ],\n  \"sqlrf/analytic-view-measure-expressions-5.sql\" : [\n    5\n  ],\n  \"sqlrf/annotations_clause-0.sql\" : [\n    2\n  ],\n  \"sqlrf/annotations_clause-1.sql\" : [\n    2\n  ],\n  \"sqlrf/annotations_clause-2.sql\" : [\n    2\n  ],\n  \"sqlrf/annotations_clause-3.sql\" : [\n    2\n  ],\n  \"sqlrf/annotations_clause-4.sql\" : [\n    4\n  ],\n  \"sqlrf/annotations_clause-5.sql\" : [\n    3\n  ],\n  \"sqlrf/constraint-1.sql\" : [\n    10\n  ],\n  \"sqlrf/constraint-15.sql\" : [\n    2\n  ],\n  \"sqlrf/constraint-16.sql\" : [\n    2\n  ],\n  \"sqlrf/constraint-17.sql\" : [\n    2\n  ],\n  \"sqlrf/constraint-2.sql\" : [\n    4\n  ],\n  \"sqlrf/constraint-27.sql\" : [\n    10\n  ],\n  \"sqlrf/constraint-29.sql\" : [\n    5\n  ],\n  \"sqlrf/constraint-31.sql\" : [\n    10\n  ],\n  \"sqlrf/constraint-5.sql\" : [\n    3\n  ],\n  \"sqlrf/constraint-8.sql\" : [\n    10\n  ],\n  \"sqlrf/create-domain-10.sql\" : [\n    2\n  ],\n  \"sqlrf/create-domain-11.sql\" : [\n    2\n  ],\n  \"sqlrf/create-domain-12.sql\" : [\n    2\n  ],\n  \"sqlrf/create-domain-13.sql\" : [\n    2\n  ],\n  \"sqlrf/create-domain-14.sql\" : [\n    2\n  ],\n  \"sqlrf/create-domain-15.sql\" : [\n    2\n  ],\n  \"sqlrf/create-domain-16.sql\" : [\n    2\n  ],\n  \"sqlrf/create-domain-20.sql\" : [\n    2\n  ],\n  \"sqlrf/create-domain-21.sql\" : [\n    2\n  ],\n  \"sqlrf/create-domain-24.sql\" : [\n    2\n  ],\n  \"sqlrf/create-domain-27.sql\" : [\n    2\n  ],\n  \"sqlrf/create-domain-29.sql\" : [\n    2\n  ],\n  \"sqlrf/create-domain-35.sql\" : [\n    3\n  ],\n  \"sqlrf/create-domain-4.sql\" : [\n    2\n  ],\n  \"sqlrf/create-domain-43.sql\" : [\n    2\n  ],\n  \"sqlrf/create-domain-5.sql\" : [\n    2\n  ],\n  \"sqlrf/create-domain-6.sql\" : [\n    2\n  ],\n  \"sqlrf/create-domain-7.sql\" : [\n    2\n  ],\n  \"sqlrf/create-domain-8.sql\" : [\n    2\n  ],\n  \"sqlrf/create-domain-9.sql\" : [\n    2\n  ],\n  \"sqlrf/create-mle-env-0.sql\" : [\n    2\n  ],\n  \"sqlrf/create-mle-env-1.sql\" : [\n    2\n  ],\n  \"sqlrf/create-property-graph-0.sql\" : [\n    2\n  ],\n  \"sqlrf/create-property-graph-1.sql\" : [\n    2\n  ],\n  \"sqlrf/create-property-graph-11.sql\" : [\n    2\n  ],\n  \"sqlrf/create-property-graph-12.sql\" : [\n    2\n  ],\n  \"sqlrf/create-property-graph-14.sql\" : [\n    2\n  ],\n  \"sqlrf/create-property-graph-16.sql\" : [\n    2\n  ],\n  \"sqlrf/create-property-graph-17.sql\" : [\n    2\n  ],\n  \"sqlrf/create-property-graph-18.sql\" : [\n    2\n  ],\n  \"sqlrf/create-property-graph-19.sql\" : [\n    2\n  ],\n  \"sqlrf/create-property-graph-2.sql\" : [\n    2\n  ],\n  \"sqlrf/create-property-graph-23.sql\" : [\n    2\n  ],\n  \"sqlrf/create-property-graph-3.sql\" : [\n    2\n  ],\n  \"sqlrf/create-property-graph-4.sql\" : [\n    2\n  ],\n  \"sqlrf/create-property-graph-8.sql\" : [\n    2\n  ],\n  \"sqlrf/create-property-graph-9.sql\" : [\n    2\n  ],\n  \"sqlrf/create-vector-index-0.sql\" : [\n    2\n  ],\n  \"sqlrf/create-vector-index-1.sql\" : [\n    2\n  ],\n  \"sqlrf/create-vector-index-2.sql\" : [\n    2\n  ],\n  \"sqlrf/create-vector-index-3.sql\" : [\n    2\n  ],\n  \"sqlrf/domain_check-0.sql\" : [\n    2\n  ],\n  \"sqlrf/domain_check-1.sql\" : [\n    2\n  ],\n  \"sqlrf/domain_check-3.sql\" : [\n    2\n  ],\n  \"sqlrf/domain_check-6.sql\" : [\n    2\n  ],\n  \"sqlrf/domain_check-7.sql\" : [\n    2\n  ],\n  \"sqlrf/domain_check-9.sql\" : [\n    10\n  ],\n  \"sqlrf/domain_check_type-0.sql\" : [\n    2\n  ],\n  \"sqlrf/domain_check_type-2.sql\" : [\n    2\n  ],\n  \"sqlrf/domain_check_type-5.sql\" : [\n    2\n  ],\n  \"sqlrf/domain_check_type-6.sql\" : [\n    2\n  ],\n  \"sqlrf/domain_check_type-8.sql\" : [\n    10\n  ],\n  \"sqlrf/domain_display-0.sql\" : [\n    2\n  ],\n  \"sqlrf/domain_display-2.sql\" : [\n    3\n  ],\n  \"sqlrf/domain_display-6.sql\" : [\n    3\n  ],\n  \"sqlrf/domain_name-0.sql\" : [\n    2\n  ],\n  \"sqlrf/domain_order-0.sql\" : [\n    2\n  ],\n  \"sqlrf/domain_order-2.sql\" : [\n    3\n  ],\n  \"sqlrf/domain_order-6.sql\" : [\n    3\n  ],\n  \"sqlrf/file_specification-0.sql\" : [\n    2\n  ],\n  \"sqlrf/file_specification-1.sql\" : [\n    2\n  ],\n  \"sqlrf/file_specification-2.sql\" : [\n    2\n  ],\n  \"sqlrf/file_specification-3.sql\" : [\n    2\n  ],\n  \"sqlrf/file_specification-4.sql\" : [\n    2\n  ],\n  \"sqlrf/file_specification-5.sql\" : [\n    2\n  ],\n  \"sqlrf/from_vector-2.sql\" : [\n    2\n  ],\n  \"sqlrf/from_vector-3.sql\" : [\n    2\n  ],\n  \"sqlrf/from_vector-4.sql\" : [\n    2\n  ],\n  \"sqlrf/from_vector-5.sql\" : [\n    2\n  ],\n  \"sqlrf/graph-pattern-0.sql\" : [\n    4\n  ],\n  \"sqlrf/graph-pattern-10.sql\" : [\n    4\n  ],\n  \"sqlrf/graph-pattern-11.sql\" : [\n    4\n  ],\n  \"sqlrf/graph-pattern-13.sql\" : [\n    5\n  ],\n  \"sqlrf/graph-pattern-15.sql\" : [\n    4\n  ],\n  \"sqlrf/graph-pattern-17.sql\" : [\n    4\n  ],\n  \"sqlrf/graph-pattern-19.sql\" : [\n    4\n  ],\n  \"sqlrf/graph-pattern-2.sql\" : [\n    4\n  ],\n  \"sqlrf/graph-pattern-21.sql\" : [\n    4\n  ],\n  \"sqlrf/graph-pattern-23.sql\" : [\n    4\n  ],\n  \"sqlrf/graph-pattern-25.sql\" : [\n    4\n  ],\n  \"sqlrf/graph-pattern-27.sql\" : [\n    4\n  ],\n  \"sqlrf/graph-pattern-29.sql\" : [\n    4\n  ],\n  \"sqlrf/graph-pattern-3.sql\" : [\n    5\n  ],\n  \"sqlrf/graph-pattern-31.sql\" : [\n    4\n  ],\n  \"sqlrf/graph-pattern-33.sql\" : [\n    4\n  ],\n  \"sqlrf/graph-pattern-35.sql\" : [\n    4\n  ],\n  \"sqlrf/graph-pattern-37.sql\" : [\n    4\n  ],\n  \"sqlrf/graph-pattern-38.sql\" : [\n    4\n  ],\n  \"sqlrf/graph-pattern-40.sql\" : [\n    5\n  ],\n  \"sqlrf/graph-pattern-42.sql\" : [\n    4\n  ],\n  \"sqlrf/graph-pattern-44.sql\" : [\n    4\n  ],\n  \"sqlrf/graph-pattern-5.sql\" : [\n    4\n  ],\n  \"sqlrf/graph-pattern-7.sql\" : [\n    4\n  ],\n  \"sqlrf/graph-pattern-9.sql\" : [\n    4\n  ],\n  \"sqlrf/graph-reference-0.sql\" : [\n    4\n  ],\n  \"sqlrf/graph-reference-3.sql\" : [\n    5\n  ],\n  \"sqlrf/graph-reference-4.sql\" : [\n    4\n  ],\n  \"sqlrf/graph-table-shape-0.sql\" : [\n    4\n  ],\n  \"sqlrf/graph-table-shape-10.sql\" : [\n    4\n  ],\n  \"sqlrf/graph-table-shape-2.sql\" : [\n    4\n  ],\n  \"sqlrf/graph-table-shape-4.sql\" : [\n    5\n  ],\n  \"sqlrf/graph-table-shape-6.sql\" : [\n    4\n  ],\n  \"sqlrf/graph-table-shape-8.sql\" : [\n    4\n  ],\n  \"sqlrf/graph_table-operator-0.sql\" : [\n    3\n  ],\n  \"sqlrf/graph_table-operator-1.sql\" : [\n    3\n  ],\n  \"sqlrf/graph_table-operator-2.sql\" : [\n    3\n  ],\n  \"sqlrf/graph_table-operator-3.sql\" : [\n    3\n  ],\n  \"sqlrf/graph_table-operator-4.sql\" : [\n    2\n  ],\n  \"sqlrf/graph_table-operator-5.sql\" : [\n    4\n  ],\n  \"sqlrf/storage_clause-0.sql\" : [\n    6\n  ],\n  \"sqlrf/value-expressions-graph_table-0.sql\" : [\n    4\n  ],\n  \"sqlrf/value-expressions-graph_table-10.sql\" : [\n    4\n  ],\n  \"sqlrf/value-expressions-graph_table-12.sql\" : [\n    4\n  ],\n  \"sqlrf/value-expressions-graph_table-13.sql\" : [\n    4\n  ],\n  \"sqlrf/value-expressions-graph_table-14.sql\" : [\n    4\n  ],\n  \"sqlrf/value-expressions-graph_table-16.sql\" : [\n    4\n  ],\n  \"sqlrf/value-expressions-graph_table-17.sql\" : [\n    4\n  ],\n  \"sqlrf/value-expressions-graph_table-19.sql\" : [\n    2\n  ],\n  \"sqlrf/value-expressions-graph_table-2.sql\" : [\n    4\n  ],\n  \"sqlrf/value-expressions-graph_table-20.sql\" : [\n    5\n  ],\n  \"sqlrf/value-expressions-graph_table-21.sql\" : [\n    4\n  ],\n  \"sqlrf/value-expressions-graph_table-23.sql\" : [\n    4\n  ],\n  \"sqlrf/value-expressions-graph_table-25.sql\" : [\n    4\n  ],\n  \"sqlrf/value-expressions-graph_table-27.sql\" : [\n    4\n  ],\n  \"sqlrf/value-expressions-graph_table-4.sql\" : [\n    4\n  ],\n  \"sqlrf/value-expressions-graph_table-6.sql\" : [\n    4\n  ],\n  \"sqlrf/value-expressions-graph_table-8.sql\" : [\n    5\n  ],\n  \"sqlrf/vector_chunks-1.sql\" : [\n    11\n  ],\n  \"sqlrf/vector_chunks-2.sql\" : [\n    15\n  ],\n  \"sqlrf/vector_embedding-0.sql\" : [\n    2\n  ],\n  \"sqlrf/vector_serialize-1.sql\" : [\n    2\n  ],\n  \"sqlrf/vector_serialize-2.sql\" : [\n    2\n  ],\n  \"sqlrf/vector_serialize-3.sql\" : [\n    2\n  ],\n  \"sqlrf/vector_serialize-4.sql\" : [\n    2\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/oracle-database_23/QueryWithoutExceptionHandlingCheck.json",
    "content": "{\n  \"adjsn/adding-and-dropping-virtual-columns-json-fields-based-data-guide-information-0.sql\" : [\n    5\n  ],\n  \"lnpls/CREATE-PACKAGE-BODY-statement-0.sql\" : [\n    11,\n    26,\n    45,\n    50,\n    63\n  ],\n  \"lnpls/CREATE-TYPE-statement-13.sql\" : [\n    7\n  ],\n  \"lnpls/GOTO-statement-5.sql\" : [\n    6\n  ],\n  \"lnpls/assigning-values-record-variables-10.sql\" : [\n    9\n  ],\n  \"lnpls/assigning-values-record-variables-15.sql\" : [\n    10\n  ],\n  \"lnpls/assigning-values-variables-3.sql\" : [\n    5\n  ],\n  \"lnpls/assigning-values-variables-5.sql\" : [\n    15\n  ],\n  \"lnpls/autonomous-transactions-1.sql\" : [\n    17\n  ],\n  \"lnpls/autonomous-transactions-9.sql\" : [\n    25\n  ],\n  \"lnpls/avoiding-inner-capture-select-and-dml-statements-10.sql\" : [\n    6,\n    12,\n    18\n  ],\n  \"lnpls/avoiding-inner-capture-select-and-dml-statements-7.sql\" : [\n    6\n  ],\n  \"lnpls/column-name-precedence-6.sql\" : [\n    8\n  ],\n  \"lnpls/external-subprograms-5.sql\" : [\n    8\n  ],\n  \"lnpls/lexical-units-20.sql\" : [\n    7\n  ],\n  \"lnpls/minimizing-cpu-overhead-0.sql\" : [\n    8,\n    19,\n    25,\n    38\n  ],\n  \"lnpls/minimizing-cpu-overhead-2.sql\" : [\n    25\n  ],\n  \"lnpls/package-example-0.sql\" : [\n    115\n  ],\n  \"lnpls/pl-sql-function-result-cache-10.sql\" : [\n    9\n  ],\n  \"lnpls/pl-sql-function-result-cache-13.sql\" : [\n    11\n  ],\n  \"lnpls/pl-sql-function-result-cache-15.sql\" : [\n    12\n  ],\n  \"lnpls/pl-sql-function-result-cache-4.sql\" : [\n    26,\n    30,\n    35\n  ],\n  \"lnpls/pl-sql-function-result-cache-6.sql\" : [\n    36\n  ],\n  \"lnpls/pl-sql-function-result-cache-9.sql\" : [\n    9\n  ],\n  \"lnpls/record-variables-30.sql\" : [\n    5\n  ],\n  \"lnpls/release-changes-0.sql\" : [\n    15\n  ],\n  \"lnpls/sequential-control-statements-0.sql\" : [\n    6\n  ],\n  \"lnpls/sql-data-types-32.sql\" : [\n    11\n  ],\n  \"lnpls/subprogram-parameters-37.sql\" : [\n    10\n  ],\n  \"lnpls/transaction-processing-and-control-8.sql\" : [\n    10,\n    15,\n    20\n  ],\n  \"lnpls/trigger-restrictions-0.sql\" : [\n    20\n  ],\n  \"lnpls/views-information-triggers-0.sql\" : [\n    7\n  ],\n  \"lnpls/views-information-triggers-5.sql\" : [\n    5\n  ],\n  \"lnpls/wrapping-pl-sql-source-text-dbms_ddl-subprograms-3.sql\" : [\n    5,\n    8\n  ],\n  \"sqlrf/BIN_TO_NUM-1.sql\" : [\n    11\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/oracle-database_23/RaiseStandardExceptionCheck.json",
    "content": "{\n  \"lnpls/raising-exceptions-explicitly-2.sql\" : [\n    8\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/oracle-database_23/SameBranchCheck.json",
    "content": "{\n  \"lnpls/system-triggers-1.sql\" : [\n    8\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/oracle-database_23/SameConditionCheck.json",
    "content": "{\n  \"sqlrf/boolean_and_agg-6.sql\" : [\n    2,\n    2\n  ],\n  \"sqlrf/boolean_or_agg-6.sql\" : [\n    2\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/oracle-database_23/SelectAllColumnsCheck.json",
    "content": "{\n  \"adjsn/creating-view-json-data-using-json_table-0.sql\" : [\n    3\n  ],\n  \"adjsn/json-data-type-7.sql\" : [\n    2\n  ],\n  \"adjsn/querying-data-guide-0.sql\" : [\n    4\n  ],\n  \"adjsn/querying-data-guide-1.sql\" : [\n    7\n  ],\n  \"adjsn/sql-json-function-json_table-2.sql\" : [\n    2\n  ],\n  \"adjsn/sql-json-function-json_table-3.sql\" : [\n    2\n  ],\n  \"adjsn/sql-nested-clause-instead-json_table-4.sql\" : [\n    2\n  ],\n  \"adjsn/type-clause-sql-functions-and-conditions-2.sql\" : [\n    2\n  ],\n  \"adjsn/types-filter-condition-comparisons-0.sql\" : [\n    2\n  ],\n  \"adjsn/using-geojson-geographic-data-3.sql\" : [\n    2\n  ],\n  \"adjsn/using-json_table-json-arrays-0.sql\" : [\n    2\n  ],\n  \"adjsn/using-json_table-json-arrays-1.sql\" : [\n    2\n  ],\n  \"adjsn/using-json_table-json-arrays-2.sql\" : [\n    2\n  ],\n  \"adjsn/using-json_table-json-arrays-4.sql\" : [\n    2\n  ],\n  \"adjsn/using-json_value-function-based-index-json_table-queries-0.sql\" : [\n    2\n  ],\n  \"lnpls/PIPELINED-clause-1.sql\" : [\n    2\n  ],\n  \"lnpls/SQL_MACRO-clause-11.sql\" : [\n    6\n  ],\n  \"lnpls/SQL_MACRO-clause-17.sql\" : [\n    2\n  ],\n  \"lnpls/SQL_MACRO-clause-20.sql\" : [\n    2\n  ],\n  \"lnpls/SQL_MACRO-clause-22.sql\" : [\n    6\n  ],\n  \"lnpls/SQL_MACRO-clause-25.sql\" : [\n    2\n  ],\n  \"lnpls/SQL_MACRO-clause-27.sql\" : [\n    2\n  ],\n  \"lnpls/SQL_MACRO-clause-29.sql\" : [\n    2\n  ],\n  \"lnpls/SQL_MACRO-clause-31.sql\" : [\n    2\n  ],\n  \"lnpls/autonomous-transactions-6.sql\" : [\n    16\n  ],\n  \"lnpls/autonomous-transactions-7.sql\" : [\n    4\n  ],\n  \"lnpls/avoiding-inner-capture-select-and-dml-statements-0.sql\" : [\n    10\n  ],\n  \"lnpls/avoiding-inner-capture-select-and-dml-statements-3.sql\" : [\n    2\n  ],\n  \"lnpls/bulk-sql-and-bulk-binding-19.sql\" : [\n    2\n  ],\n  \"lnpls/bulk-sql-and-bulk-binding-26.sql\" : [\n    2\n  ],\n  \"lnpls/chaining-pipelined-table-functions-multiple-transformations-0.sql\" : [\n    2\n  ],\n  \"lnpls/chaining-pipelined-table-functions-multiple-transformations-1.sql\" : [\n    2\n  ],\n  \"lnpls/chaining-pipelined-table-functions-multiple-transformations-10.sql\" : [\n    2,\n    2\n  ],\n  \"lnpls/chaining-pipelined-table-functions-multiple-transformations-14.sql\" : [\n    2,\n    4,\n    5\n  ],\n  \"lnpls/chaining-pipelined-table-functions-multiple-transformations-4.sql\" : [\n    2\n  ],\n  \"lnpls/chaining-pipelined-table-functions-multiple-transformations-6.sql\" : [\n    2\n  ],\n  \"lnpls/chaining-pipelined-table-functions-multiple-transformations-8.sql\" : [\n    36,\n    38\n  ],\n  \"lnpls/correlation-names-and-pseudorecords-15.sql\" : [\n    19\n  ],\n  \"lnpls/correlation-names-and-pseudorecords-6.sql\" : [\n    2\n  ],\n  \"lnpls/cursor-variables-12.sql\" : [\n    14\n  ],\n  \"lnpls/cursor-variables-14.sql\" : [\n    10\n  ],\n  \"lnpls/cursor-variables-15.sql\" : [\n    11,\n    15,\n    19\n  ],\n  \"lnpls/cursor-variables-16.sql\" : [\n    11,\n    13,\n    15\n  ],\n  \"lnpls/cursor-variables-17.sql\" : [\n    3,\n    4,\n    5\n  ],\n  \"lnpls/cursors-overview-6.sql\" : [\n    10,\n    16\n  ],\n  \"lnpls/dml-triggers-45.sql\" : [\n    22\n  ],\n  \"lnpls/dml-triggers-47.sql\" : [\n    8\n  ],\n  \"lnpls/dml-triggers-52.sql\" : [\n    2\n  ],\n  \"lnpls/dml-triggers-54.sql\" : [\n    2\n  ],\n  \"lnpls/dml-triggers-56.sql\" : [\n    2\n  ],\n  \"lnpls/inserting-records-tables-0.sql\" : [\n    48\n  ],\n  \"lnpls/main-features-pl-sql-1.sql\" : [\n    4\n  ],\n  \"lnpls/overview-polymorphic-table-functions-0.sql\" : [\n    2\n  ],\n  \"lnpls/overview-polymorphic-table-functions-1.sql\" : [\n    3,\n    4\n  ],\n  \"lnpls/overview-polymorphic-table-functions-10.sql\" : [\n    2\n  ],\n  \"lnpls/overview-polymorphic-table-functions-12.sql\" : [\n    2\n  ],\n  \"lnpls/overview-polymorphic-table-functions-14.sql\" : [\n    2\n  ],\n  \"lnpls/overview-polymorphic-table-functions-19.sql\" : [\n    2\n  ],\n  \"lnpls/overview-polymorphic-table-functions-23.sql\" : [\n    6\n  ],\n  \"lnpls/overview-polymorphic-table-functions-25.sql\" : [\n    10\n  ],\n  \"lnpls/overview-polymorphic-table-functions-6.sql\" : [\n    2\n  ],\n  \"lnpls/overview-polymorphic-table-functions-8.sql\" : [\n    2\n  ],\n  \"lnpls/package-writing-guidelines-0.sql\" : [\n    8\n  ],\n  \"lnpls/pl-sql-function-result-cache-16.sql\" : [\n    17\n  ],\n  \"lnpls/plsql-program-limits-2.sql\" : [\n    2\n  ],\n  \"lnpls/predefined-exceptions-3.sql\" : [\n    18,\n    21\n  ],\n  \"lnpls/processing-query-result-sets-4.sql\" : [\n    4\n  ],\n  \"lnpls/sql-data-types-34.sql\" : [\n    5\n  ],\n  \"lnpls/sql-data-types-36.sql\" : [\n    18\n  ],\n  \"lnpls/sql-injection-10.sql\" : [\n    2\n  ],\n  \"lnpls/sql-injection-14.sql\" : [\n    2\n  ],\n  \"lnpls/sql-injection-16.sql\" : [\n    2\n  ],\n  \"lnpls/subprogram-parameters-24.sql\" : [\n    14\n  ],\n  \"lnpls/transaction-processing-and-control-1.sql\" : [\n    2\n  ],\n  \"lnpls/transaction-processing-and-control-3.sql\" : [\n    2\n  ],\n  \"lnpls/trigger-restrictions-12.sql\" : [\n    2\n  ],\n  \"lnpls/trigger-restrictions-14.sql\" : [\n    2\n  ],\n  \"lnpls/trigger-restrictions-7.sql\" : [\n    2\n  ],\n  \"lnpls/trigger-restrictions-9.sql\" : [\n    2\n  ],\n  \"lnpls/updating-rows-records-0.sql\" : [\n    22\n  ],\n  \"lnpls/what-is-capture-1.sql\" : [\n    4\n  ],\n  \"sqlrf/ALTER-SESSION-23.sql\" : [\n    4\n  ],\n  \"sqlrf/ALTER-TABLE-119.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-121.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-14.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-23.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-44.sql\" : [\n    2\n  ],\n  \"sqlrf/ALTER-TABLE-46.sql\" : [\n    2\n  ],\n  \"sqlrf/APPROX_PERCENTILE_DETAIL-8.sql\" : [\n    6\n  ],\n  \"sqlrf/Arithmetic-Operators-0.sql\" : [\n    2,\n    7\n  ],\n  \"sqlrf/BETWEEN-Condition-5.sql\" : [\n    2\n  ],\n  \"sqlrf/COLUMN_VALUE-Pseudocolumn-0.sql\" : [\n    2\n  ],\n  \"sqlrf/CONVERT-1.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-15.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-CLUSTER-12.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-CONTEXT-1.sql\" : [\n    3\n  ],\n  \"sqlrf/CREATE-DATABASE-LINK-3.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-DATABASE-LINK-5.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-INDEX-18.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-MATERIALIZED-VIEW-0.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-MATERIALIZED-VIEW-1.sql\" : [\n    3\n  ],\n  \"sqlrf/CREATE-TABLE-47.sql\" : [\n    2\n  ],\n  \"sqlrf/Comments-16.sql\" : [\n    2\n  ],\n  \"sqlrf/Comments-17.sql\" : [\n    2\n  ],\n  \"sqlrf/Comments-22.sql\" : [\n    2\n  ],\n  \"sqlrf/Comments-25.sql\" : [\n    2\n  ],\n  \"sqlrf/Comments-30.sql\" : [\n    2\n  ],\n  \"sqlrf/Comments-31.sql\" : [\n    3\n  ],\n  \"sqlrf/Comments-35.sql\" : [\n    2\n  ],\n  \"sqlrf/Comments-36.sql\" : [\n    2\n  ],\n  \"sqlrf/Comments-37.sql\" : [\n    2\n  ],\n  \"sqlrf/Comments-48.sql\" : [\n    4\n  ],\n  \"sqlrf/Comments-52.sql\" : [\n    2\n  ],\n  \"sqlrf/Comments-59.sql\" : [\n    2\n  ],\n  \"sqlrf/Comments-60.sql\" : [\n    2\n  ],\n  \"sqlrf/Comments-61.sql\" : [\n    2\n  ],\n  \"sqlrf/Comments-63.sql\" : [\n    5\n  ],\n  \"sqlrf/Comments-64.sql\" : [\n    2\n  ],\n  \"sqlrf/Comments-9.sql\" : [\n    2\n  ],\n  \"sqlrf/Comparison-Conditions-0.sql\" : [\n    2\n  ],\n  \"sqlrf/Comparison-Conditions-1.sql\" : [\n    2\n  ],\n  \"sqlrf/Comparison-Conditions-2.sql\" : [\n    2,\n    5\n  ],\n  \"sqlrf/Comparison-Conditions-3.sql\" : [\n    2,\n    5\n  ],\n  \"sqlrf/Comparison-Conditions-4.sql\" : [\n    2\n  ],\n  \"sqlrf/Comparison-Conditions-5.sql\" : [\n    2\n  ],\n  \"sqlrf/DELETE-10.sql\" : [\n    2\n  ],\n  \"sqlrf/DELETE-13.sql\" : [\n    2\n  ],\n  \"sqlrf/DELETE-3.sql\" : [\n    2\n  ],\n  \"sqlrf/Data-Types-23.sql\" : [\n    2\n  ],\n  \"sqlrf/Data-Types-24.sql\" : [\n    2\n  ],\n  \"sqlrf/Data-Types-25.sql\" : [\n    2\n  ],\n  \"sqlrf/Data-Types-26.sql\" : [\n    2\n  ],\n  \"sqlrf/Data-Types-27.sql\" : [\n    2\n  ],\n  \"sqlrf/Data-Types-28.sql\" : [\n    2\n  ],\n  \"sqlrf/Data-Types-29.sql\" : [\n    2\n  ],\n  \"sqlrf/Data-Types-3.sql\" : [\n    7\n  ],\n  \"sqlrf/Data-Types-30.sql\" : [\n    2,\n    3,\n    4,\n    5\n  ],\n  \"sqlrf/Data-Types-31.sql\" : [\n    2\n  ],\n  \"sqlrf/Expression-Lists-1.sql\" : [\n    2\n  ],\n  \"sqlrf/FIRST_VALUE-0.sql\" : [\n    5\n  ],\n  \"sqlrf/FIRST_VALUE-1.sql\" : [\n    5\n  ],\n  \"sqlrf/FIRST_VALUE-2.sql\" : [\n    5,\n    11\n  ],\n  \"sqlrf/FIRST_VALUE-3.sql\" : [\n    5,\n    11\n  ],\n  \"sqlrf/FLASHBACK-TABLE-0.sql\" : [\n    2,\n    3\n  ],\n  \"sqlrf/IN-Condition-1.sql\" : [\n    2,\n    6\n  ],\n  \"sqlrf/IN-Condition-3.sql\" : [\n    2,\n    8\n  ],\n  \"sqlrf/INSERT-21.sql\" : [\n    2\n  ],\n  \"sqlrf/INSERT-25.sql\" : [\n    2\n  ],\n  \"sqlrf/INSERT-36.sql\" : [\n    9\n  ],\n  \"sqlrf/INSERT-38.sql\" : [\n    9\n  ],\n  \"sqlrf/INSERT-40.sql\" : [\n    24\n  ],\n  \"sqlrf/INSERT-42.sql\" : [\n    29\n  ],\n  \"sqlrf/IS-OF-type-Condition-0.sql\" : [\n    2,\n    4\n  ],\n  \"sqlrf/JSON_TABLE-0.sql\" : [\n    2\n  ],\n  \"sqlrf/JSON_TABLE-1.sql\" : [\n    2\n  ],\n  \"sqlrf/JSON_TABLE-11.sql\" : [\n    2\n  ],\n  \"sqlrf/JSON_TABLE-12.sql\" : [\n    2\n  ],\n  \"sqlrf/JSON_TABLE-13.sql\" : [\n    2\n  ],\n  \"sqlrf/JSON_TABLE-14.sql\" : [\n    2\n  ],\n  \"sqlrf/JSON_TABLE-15.sql\" : [\n    2\n  ],\n  \"sqlrf/JSON_TABLE-16.sql\" : [\n    2\n  ],\n  \"sqlrf/JSON_TABLE-2.sql\" : [\n    2\n  ],\n  \"sqlrf/JSON_TABLE-8.sql\" : [\n    2\n  ],\n  \"sqlrf/Joins-3.sql\" : [\n    2\n  ],\n  \"sqlrf/LAST_VALUE-0.sql\" : [\n    6\n  ],\n  \"sqlrf/LAST_VALUE-1.sql\" : [\n    6\n  ],\n  \"sqlrf/LAST_VALUE-2.sql\" : [\n    6,\n    13\n  ],\n  \"sqlrf/LAST_VALUE-3.sql\" : [\n    6,\n    13\n  ],\n  \"sqlrf/Literals-15.sql\" : [\n    4,\n    6,\n    9\n  ],\n  \"sqlrf/Literals-16.sql\" : [\n    2\n  ],\n  \"sqlrf/Literals-17.sql\" : [\n    2\n  ],\n  \"sqlrf/Logical-Conditions-1.sql\" : [\n    2,\n    6\n  ],\n  \"sqlrf/Logical-Conditions-3.sql\" : [\n    2\n  ],\n  \"sqlrf/Logical-Conditions-5.sql\" : [\n    2\n  ],\n  \"sqlrf/Logical-Conditions-6.sql\" : [\n    2\n  ],\n  \"sqlrf/MERGE-0.sql\" : [\n    7,\n    17\n  ],\n  \"sqlrf/MERGE-11.sql\" : [\n    2\n  ],\n  \"sqlrf/MERGE-13.sql\" : [\n    2\n  ],\n  \"sqlrf/MERGE-3.sql\" : [\n    2\n  ],\n  \"sqlrf/MERGE-5.sql\" : [\n    2\n  ],\n  \"sqlrf/MERGE-7.sql\" : [\n    2\n  ],\n  \"sqlrf/MERGE-9.sql\" : [\n    2\n  ],\n  \"sqlrf/NANVL-0.sql\" : [\n    4\n  ],\n  \"sqlrf/NLSSORT-1.sql\" : [\n    6,\n    9\n  ],\n  \"sqlrf/NLSSORT-2.sql\" : [\n    2,\n    6\n  ],\n  \"sqlrf/NLSSORT-3.sql\" : [\n    4\n  ],\n  \"sqlrf/NOAUDIT-Unified-Auditing-1.sql\" : [\n    2\n  ],\n  \"sqlrf/NOAUDIT-Unified-Auditing-6.sql\" : [\n    2\n  ],\n  \"sqlrf/PURGE-0.sql\" : [\n    2,\n    3\n  ],\n  \"sqlrf/ROWNUM-Pseudocolumn-0.sql\" : [\n    2\n  ],\n  \"sqlrf/ROWNUM-Pseudocolumn-1.sql\" : [\n    2\n  ],\n  \"sqlrf/ROWNUM-Pseudocolumn-2.sql\" : [\n    2,\n    3\n  ],\n  \"sqlrf/ROWNUM-Pseudocolumn-3.sql\" : [\n    2\n  ],\n  \"sqlrf/SELECT-102.sql\" : [\n    2\n  ],\n  \"sqlrf/SELECT-103.sql\" : [\n    2\n  ],\n  \"sqlrf/SELECT-12.sql\" : [\n    2\n  ],\n  \"sqlrf/SELECT-22.sql\" : [\n    2\n  ],\n  \"sqlrf/SELECT-24.sql\" : [\n    11\n  ],\n  \"sqlrf/SELECT-39.sql\" : [\n    2\n  ],\n  \"sqlrf/SELECT-4.sql\" : [\n    2\n  ],\n  \"sqlrf/SELECT-43.sql\" : [\n    2\n  ],\n  \"sqlrf/SELECT-61.sql\" : [\n    2\n  ],\n  \"sqlrf/SELECT-76.sql\" : [\n    2,\n    6\n  ],\n  \"sqlrf/SELECT-93.sql\" : [\n    2\n  ],\n  \"sqlrf/TO_BINARY_DOUBLE-0.sql\" : [\n    6\n  ],\n  \"sqlrf/Using-XML-in-SQL-Statements-7.sql\" : [\n    2,\n    5\n  ],\n  \"sqlrf/create-domain-22.sql\" : [\n    2\n  ],\n  \"sqlrf/create-domain-25.sql\" : [\n    2\n  ],\n  \"sqlrf/create-domain-30.sql\" : [\n    2\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/oracle-database_23/SelectWithRownumAndOrderByCheck.json",
    "content": "{\n  \"lnpls/cursors-overview-25.sql\" : [\n    5\n  ],\n  \"lnpls/cursors-overview-27.sql\" : [\n    5\n  ],\n  \"lnpls/cursors-overview-29.sql\" : [\n    5\n  ],\n  \"lnpls/processing-query-result-sets-6.sql\" : [\n    7\n  ],\n  \"sqlrf/ROWNUM-Pseudocolumn-1.sql\" : [\n    4\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/oracle-database_23/ToDateWithoutFormatCheck.json",
    "content": "{\n  \"adjsn/multiple-data-guides-document-set-0.sql\" : [\n    5\n  ],\n  \"adjsn/multiple-data-guides-document-set-1.sql\" : [\n    5\n  ],\n  \"adjsn/tables-json-columns-2.sql\" : [\n    5,\n    36\n  ],\n  \"sqlrf/ROUND-date-0.sql\" : [\n    2\n  ],\n  \"sqlrf/Sequence-Pseudocolumns-4.sql\" : [\n    4\n  ],\n  \"sqlrf/Sequence-Pseudocolumns-5.sql\" : [\n    3\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/oracle-database_23/UnhandledUserDefinedExceptionCheck.json",
    "content": "{\n  \"lnpls/exception-propagation-1.sql\" : [\n    10\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/oracle-database_23/UnnecessaryAliasInQueryCheck.json",
    "content": "{\n  \"adjsn/creating-view-json-data-using-json_table-0.sql\" : [\n    4\n  ],\n  \"adjsn/data-type-considerations-json_value-indexing-and-querying-0.sql\" : [\n    2\n  ],\n  \"adjsn/data-type-considerations-json_value-indexing-and-querying-1.sql\" : [\n    2\n  ],\n  \"adjsn/data-type-considerations-json_value-indexing-and-querying-2.sql\" : [\n    2\n  ],\n  \"adjsn/json-data-type-2.sql\" : [\n    11\n  ],\n  \"adjsn/json-data-type-3.sql\" : [\n    2\n  ],\n  \"adjsn/json-data-type-4.sql\" : [\n    2\n  ],\n  \"adjsn/json-data-type-6.sql\" : [\n    3\n  ],\n  \"adjsn/json-data-type-7.sql\" : [\n    3\n  ],\n  \"adjsn/json-data-type-8.sql\" : [\n    2\n  ],\n  \"adjsn/json-data-type-9.sql\" : [\n    2\n  ],\n  \"adjsn/json-schema-18.sql\" : [\n    2\n  ],\n  \"adjsn/oracle-sql-condition-json_textcontains-1.sql\" : [\n    3\n  ],\n  \"adjsn/overview-json-oracle-database-0.sql\" : [\n    2\n  ],\n  \"adjsn/partitioning-json-data-1.sql\" : [\n    2\n  ],\n  \"adjsn/performing-migration-check-1.sql\" : [\n    4\n  ],\n  \"adjsn/simple-dot-notation-access-json-data-0.sql\" : [\n    2\n  ],\n  \"adjsn/simple-dot-notation-access-json-data-1.sql\" : [\n    2\n  ],\n  \"adjsn/simple-dot-notation-access-json-data-2.sql\" : [\n    2\n  ],\n  \"adjsn/simple-dot-notation-access-json-data-3.sql\" : [\n    2\n  ],\n  \"adjsn/simple-dot-notation-access-json-data-5.sql\" : [\n    2\n  ],\n  \"adjsn/simple-dot-notation-access-json-data-6.sql\" : [\n    2\n  ],\n  \"adjsn/simple-dot-notation-access-json-data-7.sql\" : [\n    3\n  ],\n  \"adjsn/simple-dot-notation-access-json-data-8.sql\" : [\n    3\n  ],\n  \"adjsn/sql-json-condition-json_exists-1.sql\" : [\n    2\n  ],\n  \"adjsn/sql-json-function-json_arrayagg-1.sql\" : [\n    7,\n    9\n  ],\n  \"adjsn/sql-json-function-json_table-2.sql\" : [\n    3\n  ],\n  \"adjsn/sql-json-function-json_table-3.sql\" : [\n    3\n  ],\n  \"adjsn/sql-json-path-expression-syntax-4.sql\" : [\n    2\n  ],\n  \"adjsn/types-filter-condition-comparisons-0.sql\" : [\n    3\n  ],\n  \"adjsn/using-filters-json_exists-0.sql\" : [\n    2\n  ],\n  \"adjsn/using-filters-json_exists-1.sql\" : [\n    2,\n    5,\n    8\n  ],\n  \"adjsn/using-filters-json_exists-2.sql\" : [\n    2\n  ],\n  \"adjsn/using-filters-json_exists-3.sql\" : [\n    2\n  ],\n  \"adjsn/using-filters-json_exists-4.sql\" : [\n    2\n  ],\n  \"adjsn/using-json_table-json-arrays-4.sql\" : [\n    3\n  ],\n  \"adjsn/using-json_value-function-based-index-json_table-queries-0.sql\" : [\n    3\n  ],\n  \"adjsn/using-multivalue-function-based-index-1.sql\" : [\n    2,\n    4\n  ],\n  \"adjsn/using-pl-sql-object-types-json-2.sql\" : [\n    26\n  ],\n  \"lnpls/CREATE-TYPE-statement-13.sql\" : [\n    8,\n    13\n  ],\n  \"lnpls/SQL_MACRO-clause-7.sql\" : [\n    4\n  ],\n  \"lnpls/avoiding-inner-capture-select-and-dml-statements-0.sql\" : [\n    10\n  ],\n  \"lnpls/avoiding-inner-capture-select-and-dml-statements-10.sql\" : [\n    6,\n    12,\n    18\n  ],\n  \"lnpls/avoiding-inner-capture-select-and-dml-statements-7.sql\" : [\n    6\n  ],\n  \"lnpls/compiling-pl-sql-units-native-execution-1.sql\" : [\n    5,\n    5\n  ],\n  \"lnpls/cursor-expressions-1.sql\" : [\n    12,\n    16\n  ],\n  \"lnpls/cursors-overview-10.sql\" : [\n    5,\n    5\n  ],\n  \"lnpls/cursors-overview-20.sql\" : [\n    7,\n    7,\n    7\n  ],\n  \"lnpls/dbms_sql-package-4.sql\" : [\n    15,\n    15\n  ],\n  \"lnpls/dml-triggers-1.sql\" : [\n    5,\n    5\n  ],\n  \"lnpls/dml-triggers-12.sql\" : [\n    18,\n    23\n  ],\n  \"lnpls/dml-triggers-17.sql\" : [\n    4\n  ],\n  \"lnpls/dml-triggers-32.sql\" : [\n    21\n  ],\n  \"lnpls/dml-triggers-49.sql\" : [\n    6,\n    10\n  ],\n  \"lnpls/pl-sql-function-result-cache-4.sql\" : [\n    31,\n    31\n  ],\n  \"lnpls/processing-query-result-sets-8.sql\" : [\n    5\n  ],\n  \"sqlrf/ALTER-TABLE-23.sql\" : [\n    3,\n    3\n  ],\n  \"sqlrf/ANY_VALUE-0.sql\" : [\n    3,\n    3\n  ],\n  \"sqlrf/APPROX_COUNT_DISTINCT_DETAIL-0.sql\" : [\n    7,\n    7\n  ],\n  \"sqlrf/APPROX_PERCENTILE_DETAIL-7.sql\" : [\n    4,\n    4\n  ],\n  \"sqlrf/CASE-Expressions-1.sql\" : [\n    3\n  ],\n  \"sqlrf/CAST-11.sql\" : [\n    4,\n    8\n  ],\n  \"sqlrf/CAST-8.sql\" : [\n    8,\n    11\n  ],\n  \"sqlrf/CAST-9.sql\" : [\n    3\n  ],\n  \"sqlrf/COVAR_POP-2.sql\" : [\n    9\n  ],\n  \"sqlrf/CREATE-INDEX-11.sql\" : [\n    3\n  ],\n  \"sqlrf/CREATE-INDEX-18.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-MATERIALIZED-VIEW-10.sql\" : [\n    4,\n    4\n  ],\n  \"sqlrf/CREATE-TABLE-48.sql\" : [\n    2,\n    2\n  ],\n  \"sqlrf/CREATE-VIEW-12.sql\" : [\n    4\n  ],\n  \"sqlrf/CREATE-VIEW-13.sql\" : [\n    3\n  ],\n  \"sqlrf/CREATE-VIEW-15.sql\" : [\n    2\n  ],\n  \"sqlrf/CREATE-VIEW-7.sql\" : [\n    4,\n    4\n  ],\n  \"sqlrf/CURSOR-Expressions-0.sql\" : [\n    3,\n    5\n  ],\n  \"sqlrf/Comments-0.sql\" : [\n    6\n  ],\n  \"sqlrf/Comments-10.sql\" : [\n    3\n  ],\n  \"sqlrf/Comments-13.sql\" : [\n    3\n  ],\n  \"sqlrf/Comments-16.sql\" : [\n    3\n  ],\n  \"sqlrf/Comments-17.sql\" : [\n    3\n  ],\n  \"sqlrf/Comments-18.sql\" : [\n    3\n  ],\n  \"sqlrf/Comments-19.sql\" : [\n    3\n  ],\n  \"sqlrf/Comments-20.sql\" : [\n    3\n  ],\n  \"sqlrf/Comments-21.sql\" : [\n    3\n  ],\n  \"sqlrf/Comments-22.sql\" : [\n    3,\n    3,\n    3\n  ],\n  \"sqlrf/Comments-25.sql\" : [\n    3,\n    3\n  ],\n  \"sqlrf/Comments-28.sql\" : [\n    3\n  ],\n  \"sqlrf/Comments-31.sql\" : [\n    3\n  ],\n  \"sqlrf/Comments-32.sql\" : [\n    3,\n    3\n  ],\n  \"sqlrf/Comments-35.sql\" : [\n    3,\n    3\n  ],\n  \"sqlrf/Comments-36.sql\" : [\n    3,\n    3\n  ],\n  \"sqlrf/Comments-37.sql\" : [\n    3,\n    3\n  ],\n  \"sqlrf/Comments-41.sql\" : [\n    3,\n    3,\n    3\n  ],\n  \"sqlrf/Comments-53.sql\" : [\n    3\n  ],\n  \"sqlrf/Comments-56.sql\" : [\n    3,\n    3,\n    3,\n    3\n  ],\n  \"sqlrf/Comments-59.sql\" : [\n    3\n  ],\n  \"sqlrf/Comments-60.sql\" : [\n    3,\n    3\n  ],\n  \"sqlrf/Comments-62.sql\" : [\n    3,\n    3\n  ],\n  \"sqlrf/Comments-64.sql\" : [\n    3,\n    3\n  ],\n  \"sqlrf/DEREF-0.sql\" : [\n    5\n  ],\n  \"sqlrf/EXISTS-Condition-1.sql\" : [\n    3,\n    5\n  ],\n  \"sqlrf/EXTRACTVALUE-0.sql\" : [\n    3\n  ],\n  \"sqlrf/GROUPING-0.sql\" : [\n    8,\n    8\n  ],\n  \"sqlrf/GROUP_ID-0.sql\" : [\n    4,\n    4,\n    4\n  ],\n  \"sqlrf/INSERT-29.sql\" : [\n    16,\n    16\n  ],\n  \"sqlrf/INSERT-30.sql\" : [\n    16,\n    16\n  ],\n  \"sqlrf/IS-OF-type-Condition-0.sql\" : [\n    2,\n    4\n  ],\n  \"sqlrf/JSON-Object-Access-Expressions-0.sql\" : [\n    3\n  ],\n  \"sqlrf/JSON-Object-Access-Expressions-1.sql\" : [\n    3\n  ],\n  \"sqlrf/JSON-Object-Access-Expressions-2.sql\" : [\n    3\n  ],\n  \"sqlrf/JSON_OBJECT-3.sql\" : [\n    3,\n    3\n  ],\n  \"sqlrf/JSON_OBJECT-9.sql\" : [\n    6\n  ],\n  \"sqlrf/JSON_TABLE-0.sql\" : [\n    4\n  ],\n  \"sqlrf/JSON_TABLE-15.sql\" : [\n    3\n  ],\n  \"sqlrf/JSON_TABLE-16.sql\" : [\n    3\n  ],\n  \"sqlrf/MERGE-0.sql\" : [\n    4,\n    4\n  ],\n  \"sqlrf/Multiset-Operators-3.sql\" : [\n    5,\n    11\n  ],\n  \"sqlrf/NULLIF-1.sql\" : [\n    3,\n    3\n  ],\n  \"sqlrf/Object-Access-Expressions-0.sql\" : [\n    5\n  ],\n  \"sqlrf/SELECT-100.sql\" : [\n    2\n  ],\n  \"sqlrf/SELECT-101.sql\" : [\n    2\n  ],\n  \"sqlrf/SELECT-102.sql\" : [\n    2\n  ],\n  \"sqlrf/SELECT-103.sql\" : [\n    3,\n    5\n  ],\n  \"sqlrf/SELECT-24.sql\" : [\n    5,\n    5\n  ],\n  \"sqlrf/SELECT-25.sql\" : [\n    10,\n    10\n  ],\n  \"sqlrf/SELECT-26.sql\" : [\n    12,\n    12\n  ],\n  \"sqlrf/SELECT-27.sql\" : [\n    10,\n    10\n  ],\n  \"sqlrf/SELECT-28.sql\" : [\n    11,\n    11\n  ],\n  \"sqlrf/SELECT-29.sql\" : [\n    11,\n    11\n  ],\n  \"sqlrf/SELECT-30.sql\" : [\n    10,\n    10\n  ],\n  \"sqlrf/SELECT-55.sql\" : [\n    6,\n    6\n  ],\n  \"sqlrf/SELECT-56.sql\" : [\n    4\n  ],\n  \"sqlrf/SELECT-71.sql\" : [\n    3,\n    3\n  ],\n  \"sqlrf/SELECT-72.sql\" : [\n    3,\n    3\n  ],\n  \"sqlrf/SELECT-85.sql\" : [\n    3,\n    3\n  ],\n  \"sqlrf/SELECT-86.sql\" : [\n    3,\n    3\n  ],\n  \"sqlrf/SELECT-88.sql\" : [\n    4,\n    4\n  ],\n  \"sqlrf/SELECT-89.sql\" : [\n    3,\n    3\n  ],\n  \"sqlrf/SELECT-99.sql\" : [\n    2\n  ],\n  \"sqlrf/SYS_TYPEID-0.sql\" : [\n    2\n  ],\n  \"sqlrf/SYS_TYPEID-1.sql\" : [\n    3\n  ],\n  \"sqlrf/Syntax-for-Schema-Objects-and-Parts-in-SQL-Statements-5.sql\" : [\n    3\n  ],\n  \"sqlrf/Syntax-for-Schema-Objects-and-Parts-in-SQL-Statements-6.sql\" : [\n    3\n  ],\n  \"sqlrf/TREAT-0.sql\" : [\n    3\n  ],\n  \"sqlrf/UPDATE-4.sql\" : [\n    9\n  ],\n  \"sqlrf/Unnesting-of-Nested-Subqueries-0.sql\" : [\n    3,\n    5\n  ],\n  \"sqlrf/Unnesting-of-Nested-Subqueries-1.sql\" : [\n    3,\n    5\n  ],\n  \"sqlrf/Unnesting-of-Nested-Subqueries-2.sql\" : [\n    3,\n    5,\n    5\n  ],\n  \"sqlrf/Using-XML-in-SQL-Statements-2.sql\" : [\n    2\n  ],\n  \"sqlrf/Using-XML-in-SQL-Statements-7.sql\" : [\n    2,\n    5\n  ],\n  \"sqlrf/VALUE-0.sql\" : [\n    2\n  ],\n  \"sqlrf/VAR_POP-2.sql\" : [\n    7,\n    7\n  ],\n  \"sqlrf/XMLAGG-0.sql\" : [\n    7\n  ],\n  \"sqlrf/XMLAGG-1.sql\" : [\n    5\n  ],\n  \"sqlrf/XMLCOLATTVAL-0.sql\" : [\n    4\n  ],\n  \"sqlrf/XMLCONCAT-0.sql\" : [\n    4\n  ],\n  \"sqlrf/XMLELEMENT-0.sql\" : [\n    5\n  ],\n  \"sqlrf/XMLELEMENT-1.sql\" : [\n    6\n  ],\n  \"sqlrf/XMLELEMENT-2.sql\" : [\n    4,\n    8\n  ],\n  \"sqlrf/XMLFOREST-0.sql\" : [\n    5\n  ],\n  \"sqlrf/XMLSEQUENCE-0.sql\" : [\n    5\n  ],\n  \"sqlrf/XMLTRANSFORM-1.sql\" : [\n    3,\n    3\n  ],\n  \"sqlrf/create-domain-22.sql\" : [\n    2\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/oracle-database_23/UnnecessaryElseCheck.json",
    "content": "{\n  \"lnpls/CREATE-PACKAGE-BODY-statement-0.sql\" : [\n    54,\n    69\n  ],\n  \"lnpls/cursors-overview-27.sql\" : [\n    16\n  ],\n  \"lnpls/dml-triggers-34.sql\" : [\n    37\n  ],\n  \"lnpls/dml-triggers-35.sql\" : [\n    31\n  ],\n  \"lnpls/exception-propagation-13.sql\" : [\n    11\n  ],\n  \"lnpls/exception-propagation-15.sql\" : [\n    13\n  ],\n  \"lnpls/pl-sql-function-result-cache-7.sql\" : [\n    10\n  ],\n  \"lnpls/raising-exceptions-explicitly-2.sql\" : [\n    9\n  ],\n  \"lnpls/recursive-subprograms-1.sql\" : [\n    10\n  ],\n  \"lnpls/release-changes-0.sql\" : [\n    5\n  ],\n  \"sqlrf/CURSOR-Expressions-1.sql\" : [\n    20\n  ],\n  \"sqlrf/Using-Extensible-Indexing-2.sql\" : [\n    68\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/oracle-database_23/UnnecessaryLikeCheck.json",
    "content": "{\n  \"lnpls/expressions-37.sql\" : [\n    5\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/oracle-database_23/UnusedCursorCheck.json",
    "content": "{\n  \"lnpls/cursors-overview-6.sql\" : [\n    5,\n    15\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/oracle-database_23/UnusedParameterCheck.json",
    "content": "{\n  \"lnpls/CREATE-FUNCTION-statement-2.sql\" : [\n    2\n  ],\n  \"lnpls/CREATE-PACKAGE-BODY-statement-0.sql\" : [\n    6,\n    6,\n    7,\n    7,\n    8,\n    8,\n    22,\n    22\n  ],\n  \"lnpls/CREATE-PROCEDURE-statement-1.sql\" : [\n    3\n  ],\n  \"lnpls/Supresses-warning-pragma-6009-6.sql\" : [\n    3\n  ],\n  \"lnpls/assigning-values-variables-5.sql\" : [\n    6\n  ],\n  \"lnpls/conditional-compilation1-25.sql\" : [\n    3\n  ],\n  \"lnpls/expressions-57.sql\" : [\n    9\n  ],\n  \"lnpls/external-subprograms-1.sql\" : [\n    3,\n    4\n  ],\n  \"lnpls/external-subprograms-2.sql\" : [\n    3\n  ],\n  \"lnpls/minimizing-cpu-overhead-2.sql\" : [\n    14,\n    19\n  ],\n  \"lnpls/overloaded-subprograms-12.sql\" : [\n    8,\n    8,\n    9,\n    9\n  ],\n  \"lnpls/overloaded-subprograms-13.sql\" : [\n    9,\n    13\n  ],\n  \"lnpls/pl-sql-function-result-cache-13.sql\" : [\n    4\n  ],\n  \"lnpls/sequential-control-statements-1.sql\" : [\n    3,\n    4\n  ],\n  \"lnpls/subprogram-invocation-resolution-0.sql\" : [\n    4,\n    5,\n    12,\n    18,\n    19,\n    26,\n    27\n  ],\n  \"lnpls/subprogram-parameters-10.sql\" : [\n    3\n  ],\n  \"sqlrf/Using-Extensible-Indexing-1.sql\" : [\n    41,\n    41,\n    55,\n    65,\n    75,\n    87,\n    98,\n    99,\n    110,\n    110,\n    112,\n    175,\n    202\n  ],\n  \"sqlrf/Using-Extensible-Indexing-2.sql\" : [\n    3\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/oracle-database_23/UnusedVariableCheck.json",
    "content": "{\n  \"adjsn/using-pl-sql-object-types-json-2.sql\" : [\n    5\n  ],\n  \"lnpls/autonomous-transactions-9.sql\" : [\n    21\n  ],\n  \"lnpls/cursor-variables-1.sql\" : [\n    6,\n    7,\n    8,\n    11\n  ],\n  \"lnpls/cursor-variables-2.sql\" : [\n    9\n  ],\n  \"lnpls/dbms_sql-package-6.sql\" : [\n    19\n  ],\n  \"lnpls/declarations-0.sql\" : [\n    3,\n    4,\n    5,\n    6\n  ],\n  \"lnpls/declarations-1.sql\" : [\n    3,\n    5,\n    7\n  ],\n  \"lnpls/declarations-2.sql\" : [\n    3,\n    4,\n    5,\n    6,\n    7\n  ],\n  \"lnpls/declarations-3.sql\" : [\n    3,\n    4,\n    5\n  ],\n  \"lnpls/declarations-4.sql\" : [\n    3,\n    4,\n    8\n  ],\n  \"lnpls/dml-triggers-41.sql\" : [\n    5\n  ],\n  \"lnpls/dml-triggers-50.sql\" : [\n    8\n  ],\n  \"lnpls/exception-propagation-3.sql\" : [\n    3\n  ],\n  \"lnpls/exception-propagation-5.sql\" : [\n    5\n  ],\n  \"lnpls/inserting-records-tables-0.sql\" : [\n    15\n  ],\n  \"lnpls/lexical-units-12.sql\" : [\n    4\n  ],\n  \"lnpls/lexical-units-6.sql\" : [\n    3\n  ],\n  \"lnpls/loop-statements-10.sql\" : [\n    3\n  ],\n  \"lnpls/loop-statements-6.sql\" : [\n    4\n  ],\n  \"lnpls/multidimensional-collections-0.sql\" : [\n    10\n  ],\n  \"lnpls/multidimensional-collections-2.sql\" : [\n    11\n  ],\n  \"lnpls/multidimensional-collections-3.sql\" : [\n    11\n  ],\n  \"lnpls/native-dynamic-sql-12.sql\" : [\n    7\n  ],\n  \"lnpls/record-variables-21.sql\" : [\n    8\n  ],\n  \"lnpls/redeclared-predefined-exceptions-3.sql\" : [\n    4\n  ],\n  \"lnpls/redeclared-predefined-exceptions-5.sql\" : [\n    4,\n    5\n  ],\n  \"lnpls/scope-and-visibility-identifiers-0.sql\" : [\n    3,\n    4,\n    10,\n    11,\n    19\n  ],\n  \"lnpls/scope-and-visibility-identifiers-1.sql\" : [\n    4\n  ],\n  \"lnpls/scope-and-visibility-identifiers-5.sql\" : [\n    4\n  ],\n  \"lnpls/scope-and-visibility-identifiers-9.sql\" : [\n    4\n  ],\n  \"lnpls/subprogram-parameters-4.sql\" : [\n    4\n  ],\n  \"lnpls/user-defined-pl-sql-subtypes-2.sql\" : [\n    5,\n    6,\n    7,\n    8,\n    12,\n    14,\n    15\n  ],\n  \"sqlrf/Type-Constructor-Expressions-0.sql\" : [\n    6\n  ],\n  \"sqlrf/Using-Extensible-Indexing-1.sql\" : [\n    113,\n    121,\n    180\n  ],\n  \"sqlrf/Using-Extensible-Indexing-2.sql\" : [\n    8\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/oracle-database_23/VariableHidingCheck.json",
    "content": "{\n  \"lnpls/assigning-values-record-variables-1.sql\" : [\n    14\n  ],\n  \"lnpls/scope-and-visibility-identifiers-0.sql\" : [\n    10\n  ],\n  \"lnpls/scope-and-visibility-identifiers-1.sql\" : [\n    7\n  ],\n  \"lnpls/scope-and-visibility-identifiers-3.sql\" : [\n    6\n  ],\n  \"lnpls/scope-and-visibility-identifiers-5.sql\" : [\n    3\n  ],\n  \"lnpls/scope-and-visibility-identifiers-9.sql\" : [\n    7\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/oracle-database_23/VariableInitializationWithFunctionCallCheck.json",
    "content": "{\n  \"lnpls/declarations-1.sql\" : [\n    3,\n    5\n  ],\n  \"lnpls/dml-triggers-24.sql\" : [\n    24\n  ],\n  \"lnpls/exception-propagation-0.sql\" : [\n    9\n  ],\n  \"lnpls/exception-propagation-1.sql\" : [\n    7\n  ],\n  \"lnpls/sql-data-types-38.sql\" : [\n    3,\n    4,\n    5,\n    6\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/oracle-database_23/VariableInitializationWithNullCheck.json",
    "content": "{\n  \"lnpls/expressions-19.sql\" : [\n    4\n  ],\n  \"lnpls/expressions-21.sql\" : [\n    3,\n    4\n  ],\n  \"lnpls/pls_integer-and-binary_integer-data-types-4.sql\" : [\n    4\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/oracle-database_23/VariableNameCheck.json",
    "content": "{\n  \"lnpls/cursors-overview-18.sql\" : [\n    11,\n    12,\n    13\n  ],\n  \"lnpls/cursors-overview-22.sql\" : [\n    13,\n    14,\n    15\n  ],\n  \"lnpls/lexical-units-12.sql\" : [\n    3,\n    4\n  ],\n  \"lnpls/lexical-units-4.sql\" : [\n    3\n  ],\n  \"lnpls/lexical-units-6.sql\" : [\n    3\n  ],\n  \"lnpls/lexical-units-8.sql\" : [\n    3,\n    4,\n    5\n  ],\n  \"lnpls/pl-sql-function-result-cache-15.sql\" : [\n    10\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/pljson/CharacterDatatypeUsageCheck.json",
    "content": "{\n  \"src/addons/pljson_table_impl.type.impl.sql\" : [\n    127,\n    366,\n    374,\n    398\n  ],\n  \"src/pljson_parser.impl.sql\" : [\n    277,\n    303,\n    306,\n    691\n  ],\n  \"src/pljson_printer.package.sql\" : [\n    74,\n    148,\n    206,\n    419\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/pljson/CollapsibleIfStatementsCheck.json",
    "content": "{\n  \"examples/ex8.sql\" : [\n    62,\n    66,\n    73\n  ],\n  \"src/addons/pljson_helper.package.sql\" : [\n    394,\n    397,\n    417,\n    420\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/pljson/ColumnsShouldHaveTableNameCheck.json",
    "content": "{\n  \"examples/ex_pljson_table.sql\" : [\n    151,\n    165,\n    189\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/pljson/CommitRollbackCheck.json",
    "content": "{\n  \"testsuite-utplsql/utplsql_pljson_table_test.sql\" : [\n    132\n  ],\n  \"testsuite/pljson_ut.package.sql\" : [\n    155\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/pljson/ComparisonWithBooleanCheck.json",
    "content": "{\n  \"src/pljson_parser.impl.sql\" : [\n    339,\n    437,\n    452,\n    467,\n    506,\n    511,\n    521\n  ],\n  \"testsuite-utplsql/utplsql_pljson_simple_test.sql\" : [\n    125,\n    126,\n    132,\n    133,\n    139,\n    140,\n    146,\n    147,\n    153,\n    154,\n    160,\n    161,\n    167,\n    168,\n    174,\n    175,\n    181,\n    182,\n    188,\n    189,\n    195,\n    196,\n    202,\n    203,\n    209,\n    210,\n    216,\n    217,\n    224,\n    225\n  ],\n  \"testsuite/pljson_simple.test.sql\" : [\n    77,\n    78,\n    84,\n    85,\n    91,\n    92,\n    98,\n    99,\n    105,\n    106,\n    112,\n    113,\n    119,\n    120,\n    126,\n    127,\n    133,\n    134,\n    140,\n    141,\n    147,\n    148,\n    154,\n    155,\n    161,\n    162,\n    168,\n    169,\n    176,\n    177\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/pljson/ComparisonWithNullCheck.json",
    "content": "{\n  \"src/addons/pljson_xml.package.sql\" : [\n    129\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/pljson/DbmsOutputPutCheck.json",
    "content": "{\n  \"examples/ex10.sql\" : [\n    46,\n    50,\n    54,\n    58,\n    62,\n    66,\n    70\n  ],\n  \"examples/ex11.sql\" : [\n    45,\n    46,\n    51,\n    52\n  ],\n  \"examples/ex12.sql\" : [\n    31,\n    33\n  ],\n  \"examples/ex13.sql\" : [\n    44\n  ],\n  \"examples/ex14.sql\" : [\n    35,\n    46\n  ],\n  \"examples/ex17.sql\" : [\n    45,\n    47,\n    48\n  ],\n  \"examples/ex2.sql\" : [\n    34,\n    35\n  ],\n  \"examples/ex3.sql\" : [\n    43,\n    45\n  ],\n  \"examples/ex4.sql\" : [\n    31,\n    31,\n    52,\n    55,\n    59\n  ],\n  \"examples/ex5.sql\" : [\n    31,\n    31,\n    54\n  ],\n  \"examples/ex6.sql\" : [\n    34,\n    34\n  ],\n  \"examples/ex7.sql\" : [\n    32,\n    32,\n    40\n  ],\n  \"examples/ex8.sql\" : [\n    94,\n    103,\n    117,\n    118,\n    119,\n    120,\n    121,\n    122\n  ],\n  \"examples/ex9.sql\" : [\n    53,\n    55,\n    58,\n    60,\n    64,\n    67,\n    76,\n    82,\n    88\n  ],\n  \"src/addons/pljson_dyn.package.sql\" : [\n    197,\n    371\n  ],\n  \"src/addons/pljson_object_cache.impl.sql\" : [\n    42,\n    43,\n    44,\n    45,\n    46\n  ],\n  \"src/addons/pljson_util_pkg.package.sql\" : [\n    345,\n    346,\n    349,\n    350\n  ],\n  \"src/pljson_ext.impl.sql\" : [\n    942\n  ],\n  \"src/pljson_parser.impl.sql\" : [\n    187,\n    192\n  ],\n  \"src/pljson_printer.package.sql\" : [\n    603,\n    615,\n    626,\n    637,\n    643\n  ],\n  \"testsuite-utplsql/utplsql_pljson_base64_test.sql\" : [\n    36,\n    44,\n    115,\n    116,\n    117,\n    119,\n    120,\n    121,\n    231,\n    232,\n    233,\n    234,\n    236,\n    237,\n    238\n  ],\n  \"testsuite-utplsql/utplsql_pljson_ext_test.sql\" : [\n    35,\n    43\n  ],\n  \"testsuite-utplsql/utplsql_pljson_helper_test.sql\" : [\n    140,\n    148\n  ],\n  \"testsuite-utplsql/utplsql_pljson_list_test.sql\" : [\n    80,\n    88\n  ],\n  \"testsuite-utplsql/utplsql_pljson_parser_test.sql\" : [\n    70,\n    78\n  ],\n  \"testsuite-utplsql/utplsql_pljson_path_test.sql\" : [\n    71,\n    79\n  ],\n  \"testsuite-utplsql/utplsql_pljson_simple_test.sql\" : [\n    32,\n    40\n  ],\n  \"testsuite-utplsql/utplsql_pljson_table_test.sql\" : [\n    30,\n    38,\n    76\n  ],\n  \"testsuite-utplsql/utplsql_pljson_test.sql\" : [\n    68,\n    76\n  ],\n  \"testsuite-utplsql/utplsql_pljson_unicode_test.sql\" : [\n    73,\n    81,\n    132\n  ],\n  \"testsuite/pljson_base64.test.sql\" : [\n    60,\n    61,\n    62,\n    64,\n    65,\n    66,\n    176,\n    177,\n    178,\n    179,\n    181,\n    182,\n    183\n  ],\n  \"testsuite/pljson_table.test.sql\" : [\n    24\n  ],\n  \"testsuite/pljson_unicode.test.sql\" : [\n    233\n  ],\n  \"testsuite/pljson_ut.package.sql\" : [\n    74,\n    83,\n    95,\n    112,\n    136,\n    137,\n    157,\n    204\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/pljson/DeadCodeCheck.json",
    "content": "{\n  \"src/addons/pljson_helper.package.sql\" : [\n    308\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/pljson/EmptyStringAssignmentCheck.json",
    "content": "{\n  \"src/addons/pljson_dyn.package.sql\" : [\n    102\n  ],\n  \"src/addons/pljson_table_impl.type.impl.sql\" : [\n    260,\n    263,\n    307,\n    321\n  ],\n  \"src/pljson_parser.impl.sql\" : [\n    320\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/pljson/ExplicitInParameterCheck.json",
    "content": "{\n  \"examples/ex4.sql\" : [\n    31\n  ],\n  \"examples/ex5.sql\" : [\n    31\n  ],\n  \"examples/ex6.sql\" : [\n    34\n  ],\n  \"examples/ex7.sql\" : [\n    32\n  ],\n  \"src/addons/pljson_dyn.package.sql\" : [\n    31,\n    31,\n    31,\n    32,\n    33,\n    37,\n    37,\n    37,\n    38,\n    39,\n    82,\n    82,\n    82,\n    128,\n    128,\n    128,\n    129,\n    130,\n    316,\n    316,\n    316,\n    317,\n    318\n  ],\n  \"src/addons/pljson_helper.package.sql\" : [\n    17,\n    17,\n    21,\n    21,\n    25,\n    25,\n    29,\n    29,\n    32,\n    32,\n    32,\n    33,\n    33,\n    33,\n    34,\n    34,\n    34,\n    35,\n    35,\n    37,\n    37,\n    38,\n    38,\n    39,\n    39,\n    40,\n    40,\n    48,\n    48,\n    48,\n    53,\n    53,\n    53,\n    55,\n    55,\n    55,\n    56,\n    56,\n    56,\n    57,\n    57,\n    57,\n    58,\n    58,\n    58,\n    60,\n    60,\n    60,\n    65,\n    65,\n    65,\n    67,\n    67,\n    67,\n    68,\n    68,\n    68,\n    69,\n    69,\n    69,\n    70,\n    70,\n    70,\n    79,\n    79,\n    116,\n    116,\n    128,\n    128,\n    143,\n    143,\n    155,\n    155,\n    169,\n    169,\n    182,\n    182,\n    195,\n    195,\n    208,\n    208,\n    230,\n    230,\n    230,\n    263,\n    263,\n    263,\n    321,\n    321,\n    321,\n    382,\n    382,\n    382,\n    408,\n    408,\n    408,\n    437,\n    437,\n    437,\n    440,\n    440,\n    440,\n    442,\n    442,\n    442,\n    444,\n    444,\n    444,\n    446,\n    446,\n    446,\n    455,\n    455,\n    455,\n    458,\n    458,\n    458,\n    460,\n    460,\n    460,\n    462,\n    462,\n    462,\n    464,\n    464,\n    464\n  ],\n  \"src/addons/pljson_object_cache.decl.sql\" : [\n    19,\n    20,\n    26,\n    26,\n    27,\n    28,\n    28\n  ],\n  \"src/addons/pljson_object_cache.impl.sql\" : [\n    7,\n    17,\n    55,\n    55,\n    66,\n    82,\n    82\n  ],\n  \"src/addons/pljson_table_impl.type.decl.sql\" : [\n    131,\n    131,\n    131,\n    132,\n    138,\n    138,\n    138,\n    139,\n    144,\n    144,\n    144,\n    145,\n    155,\n    155,\n    155,\n    156\n  ],\n  \"src/addons/pljson_table_impl.type.impl.sql\" : [\n    45,\n    45,\n    45,\n    46,\n    78,\n    78,\n    78,\n    79,\n    110,\n    110,\n    110,\n    111,\n    373,\n    397,\n    412,\n    412\n  ],\n  \"src/addons/pljson_xml.package.sql\" : [\n    37,\n    37,\n    45,\n    65,\n    84,\n    149,\n    149\n  ],\n  \"src/pljson.type.decl.sql\" : [\n    36,\n    38,\n    39,\n    40,\n    41,\n    43,\n    43,\n    46,\n    48,\n    48,\n    48,\n    49,\n    49,\n    49,\n    50,\n    50,\n    50,\n    51,\n    51,\n    51,\n    53,\n    53,\n    53,\n    54,\n    54,\n    54,\n    56,\n    56,\n    56,\n    57,\n    57,\n    57,\n    60,\n    62,\n    63,\n    64,\n    65,\n    66,\n    67,\n    68,\n    70,\n    71,\n    72,\n    74,\n    78,\n    78,\n    81,\n    81,\n    81,\n    82,\n    82,\n    82,\n    83,\n    83,\n    83,\n    84,\n    84,\n    84,\n    86,\n    86,\n    86,\n    87,\n    87,\n    87,\n    88,\n    88,\n    88,\n    89,\n    89,\n    89,\n    92,\n    92,\n    99,\n    99,\n    102,\n    102,\n    102\n  ],\n  \"src/pljson.type.impl.sql\" : [\n    14,\n    30,\n    40,\n    63,\n    71,\n    94,\n    94,\n    100,\n    117,\n    117,\n    117,\n    179,\n    179,\n    179,\n    188,\n    188,\n    188,\n    197,\n    197,\n    197,\n    207,\n    207,\n    207,\n    216,\n    216,\n    216,\n    225,\n    225,\n    225,\n    234,\n    234,\n    234,\n    248,\n    261,\n    270,\n    279,\n    288,\n    297,\n    306,\n    315,\n    324,\n    332,\n    345,\n    350,\n    365,\n    365,\n    371,\n    371,\n    371,\n    376,\n    376,\n    376,\n    385,\n    385,\n    385,\n    394,\n    394,\n    394,\n    404,\n    404,\n    404,\n    413,\n    413,\n    413,\n    422,\n    422,\n    422,\n    431,\n    431,\n    431,\n    440,\n    440,\n    468,\n    468,\n    503,\n    503,\n    503\n  ],\n  \"src/pljson_bool.type.sql\" : [\n    7,\n    7,\n    29,\n    29\n  ],\n  \"src/pljson_element.type.decl.sql\" : [\n    29,\n    29,\n    34,\n    34,\n    49,\n    50,\n    52,\n    52,\n    55,\n    55,\n    56,\n    56,\n    56,\n    57,\n    57,\n    57,\n    58,\n    58,\n    58,\n    61,\n    61,\n    64,\n    64,\n    64\n  ],\n  \"src/pljson_element.type.impl.sql\" : [\n    56,\n    56,\n    64,\n    64,\n    104,\n    109,\n    114,\n    114,\n    120,\n    120,\n    129,\n    129,\n    129,\n    138,\n    138,\n    138,\n    147,\n    147,\n    147,\n    157,\n    157,\n    163,\n    163,\n    163\n  ],\n  \"src/pljson_ext.decl.sql\" : [\n    26,\n    26,\n    29,\n    29,\n    30,\n    30,\n    31,\n    31,\n    32,\n    32,\n    33,\n    33,\n    34,\n    34,\n    35,\n    35,\n    36,\n    36,\n    39,\n    39,\n    39,\n    42,\n    42,\n    42,\n    43,\n    43,\n    43,\n    44,\n    44,\n    44,\n    45,\n    45,\n    45,\n    46,\n    46,\n    46,\n    47,\n    47,\n    47,\n    48,\n    48,\n    48,\n    51,\n    51,\n    52,\n    52,\n    53,\n    53,\n    54,\n    54,\n    55,\n    55,\n    56,\n    56,\n    57,\n    57,\n    58,\n    58,\n    61,\n    61,\n    61,\n    62,\n    62,\n    62,\n    63,\n    63,\n    63,\n    64,\n    64,\n    64,\n    65,\n    65,\n    65,\n    66,\n    66,\n    66,\n    67,\n    67,\n    67,\n    69,\n    70,\n    70,\n    73,\n    73,\n    74,\n    74,\n    75,\n    75,\n    78,\n    82,\n    84,\n    86,\n    88,\n    90,\n    90,\n    90,\n    91,\n    91,\n    91,\n    102,\n    104,\n    105,\n    107,\n    108,\n    113,\n    113\n  ],\n  \"src/pljson_ext.impl.sql\" : [\n    32,\n    66,\n    72,\n    83,\n    96,\n    106,\n    217,\n    217,\n    366,\n    366,\n    392,\n    392,\n    403,\n    403,\n    414,\n    414,\n    425,\n    425,\n    436,\n    436,\n    447,\n    447,\n    458,\n    458,\n    471,\n    471,\n    471,\n    518,\n    518,\n    518,\n    525,\n    525,\n    525,\n    536,\n    536,\n    536,\n    548,\n    548,\n    548,\n    559,\n    559,\n    559,\n    570,\n    570,\n    570,\n    581,\n    581,\n    581,\n    592,\n    592,\n    592,\n    604,\n    604,\n    625,\n    625,\n    625,\n    762,\n    762,\n    762,\n    770,\n    770,\n    779,\n    779,\n    788,\n    788,\n    797,\n    797,\n    806,\n    806,\n    815,\n    815,\n    824,\n    824,\n    833,\n    833,\n    843,\n    843,\n    843,\n    852,\n    852,\n    852,\n    862,\n    862,\n    862,\n    871,\n    871,\n    871,\n    880,\n    880,\n    880,\n    889,\n    889,\n    889,\n    898,\n    898,\n    898,\n    907,\n    907,\n    907,\n    916,\n    921,\n    921,\n    929,\n    929,\n    940,\n    940,\n    946,\n    946,\n    957,\n    984,\n    1002,\n    1017,\n    1037,\n    1037\n  ],\n  \"src/pljson_list.type.decl.sql\" : [\n    37,\n    38,\n    39,\n    39,\n    40,\n    41,\n    42,\n    43,\n    45,\n    45,\n    48,\n    48,\n    49,\n    49,\n    50,\n    50,\n    51,\n    51,\n    53,\n    53,\n    54,\n    54,\n    55,\n    55,\n    57,\n    57,\n    58,\n    58,\n    59,\n    59,\n    60,\n    60,\n    62,\n    62,\n    63,\n    63,\n    64,\n    64,\n    66,\n    71,\n    72,\n    73,\n    74,\n    75,\n    76,\n    77,\n    83,\n    83,\n    85,\n    85,\n    85,\n    86,\n    86,\n    86,\n    87,\n    87,\n    87,\n    88,\n    88,\n    88,\n    90,\n    90,\n    90,\n    91,\n    91,\n    91,\n    92,\n    92,\n    92,\n    95,\n    95,\n    98,\n    98,\n    101,\n    101,\n    101\n  ],\n  \"src/pljson_list.type.impl.sql\" : [\n    13,\n    20,\n    27,\n    27,\n    36,\n    48,\n    60,\n    67,\n    79,\n    79,\n    85,\n    85,\n    123,\n    123,\n    132,\n    132,\n    141,\n    141,\n    151,\n    151,\n    160,\n    160,\n    169,\n    169,\n    178,\n    178,\n    197,\n    197,\n    206,\n    206,\n    215,\n    215,\n    225,\n    225,\n    234,\n    234,\n    243,\n    243,\n    252,\n    283,\n    291,\n    300,\n    309,\n    318,\n    327,\n    336,\n    374,\n    374,\n    381,\n    381,\n    381,\n    394,\n    394,\n    394,\n    411,\n    411,\n    411,\n    428,\n    428,\n    428,\n    446,\n    446,\n    446,\n    463,\n    463,\n    463,\n    480,\n    480,\n    480,\n    498,\n    498,\n    506,\n    506,\n    519,\n    519,\n    519\n  ],\n  \"src/pljson_null.type.sql\" : [\n    5,\n    5,\n    23,\n    23\n  ],\n  \"src/pljson_number.type.sql\" : [\n    8,\n    10,\n    12,\n    12,\n    33,\n    44,\n    60,\n    79,\n    79,\n    124\n  ],\n  \"src/pljson_parser.decl.sql\" : [\n    44,\n    46,\n    48,\n    49,\n    49,\n    50,\n    55,\n    64,\n    65,\n    66,\n    67,\n    68,\n    69\n  ],\n  \"src/pljson_parser.impl.sql\" : [\n    29,\n    48,\n    82,\n    145,\n    145,\n    154,\n    173,\n    185,\n    190,\n    196,\n    196,\n    196,\n    201,\n    201,\n    206,\n    206,\n    206,\n    206,\n    297,\n    303,\n    575,\n    575,\n    580,\n    636,\n    636,\n    636,\n    684,\n    764,\n    786,\n    808,\n    830,\n    853,\n    872\n  ],\n  \"src/pljson_printer.package.sql\" : [\n    29,\n    29,\n    29,\n    30,\n    30,\n    30,\n    31,\n    31,\n    31,\n    32,\n    32,\n    32,\n    32,\n    33,\n    33,\n    33,\n    33,\n    34,\n    34,\n    34,\n    34,\n    36,\n    36,\n    36,\n    37,\n    37,\n    39,\n    74,\n    103,\n    136,\n    147,\n    147,\n    155,\n    166,\n    171,\n    171,\n    183,\n    201,\n    201,\n    201,\n    203,\n    238,\n    238,\n    238,\n    280,\n    280,\n    280,\n    315,\n    315,\n    315,\n    329,\n    329,\n    329,\n    329,\n    344,\n    344,\n    344,\n    344,\n    361,\n    361,\n    361,\n    361,\n    416,\n    451,\n    451,\n    451,\n    453,\n    453,\n    453,\n    495,\n    495,\n    495,\n    530,\n    530,\n    530,\n    544,\n    544,\n    544,\n    553,\n    553,\n    553,\n    564,\n    564,\n    564,\n    595,\n    595,\n    595,\n    704,\n    704\n  ],\n  \"src/pljson_string.type.sql\" : [\n    9,\n    9,\n    10,\n    10,\n    11,\n    11,\n    12,\n    12,\n    14,\n    14,\n    16,\n    16,\n    27,\n    27,\n    28,\n    28,\n    42,\n    42,\n    43,\n    43,\n    77,\n    77,\n    82,\n    82\n  ],\n  \"testsuite-utplsql/utplsql_pljson_base64_test.sql\" : [\n    33,\n    41,\n    50,\n    50,\n    59,\n    59\n  ],\n  \"testsuite-utplsql/utplsql_pljson_ext_test.sql\" : [\n    32,\n    40,\n    49,\n    49,\n    58,\n    58,\n    68,\n    75\n  ],\n  \"testsuite-utplsql/utplsql_pljson_helper_test.sql\" : [\n    137,\n    145,\n    154,\n    154,\n    163,\n    163,\n    173,\n    180\n  ],\n  \"testsuite-utplsql/utplsql_pljson_list_test.sql\" : [\n    77,\n    85,\n    94,\n    94,\n    103,\n    103,\n    113,\n    120\n  ],\n  \"testsuite-utplsql/utplsql_pljson_parser_test.sql\" : [\n    67,\n    75,\n    84,\n    84,\n    93,\n    93,\n    102,\n    102,\n    114,\n    114\n  ],\n  \"testsuite-utplsql/utplsql_pljson_path_test.sql\" : [\n    68,\n    76,\n    85,\n    85,\n    94,\n    94\n  ],\n  \"testsuite-utplsql/utplsql_pljson_simple_test.sql\" : [\n    29,\n    37,\n    46,\n    46,\n    55,\n    55\n  ],\n  \"testsuite-utplsql/utplsql_pljson_table_test.sql\" : [\n    27,\n    35,\n    44,\n    44,\n    53,\n    53\n  ],\n  \"testsuite-utplsql/utplsql_pljson_test.sql\" : [\n    65,\n    73,\n    82,\n    82,\n    91,\n    91\n  ],\n  \"testsuite-utplsql/utplsql_pljson_unicode_test.sql\" : [\n    70,\n    78,\n    87,\n    87,\n    96,\n    96,\n    105,\n    105\n  ],\n  \"testsuite/pljson_ext.test.sql\" : [\n    11,\n    18\n  ],\n  \"testsuite/pljson_helper.test.sql\" : [\n    11,\n    18\n  ],\n  \"testsuite/pljson_list.test.sql\" : [\n    11,\n    18\n  ],\n  \"testsuite/pljson_parser.test.sql\" : [\n    15,\n    15,\n    26,\n    26\n  ],\n  \"testsuite/pljson_unicode.test.sql\" : [\n    39,\n    39\n  ],\n  \"testsuite/pljson_ut.package.sql\" : [\n    39,\n    39,\n    40,\n    42,\n    43,\n    45,\n    45,\n    46,\n    46,\n    66,\n    66,\n    77,\n    86,\n    99,\n    116,\n    116,\n    125,\n    125\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/pljson/FunctionWithOutParameterCheck.json",
    "content": "{\n  \"src/addons/pljson_table_impl.type.decl.sql\" : [\n    130,\n    136,\n    143,\n    149,\n    149\n  ],\n  \"src/addons/pljson_table_impl.type.impl.sql\" : [\n    44,\n    76,\n    109,\n    344,\n    344\n  ],\n  \"src/pljson.type.decl.sql\" : [\n    102\n  ],\n  \"src/pljson.type.impl.sql\" : [\n    503\n  ],\n  \"src/pljson_element.type.decl.sql\" : [\n    64\n  ],\n  \"src/pljson_element.type.impl.sql\" : [\n    163\n  ],\n  \"src/pljson_list.type.decl.sql\" : [\n    101\n  ],\n  \"src/pljson_list.type.impl.sql\" : [\n    519\n  ],\n  \"src/pljson_parser.decl.sql\" : [\n    48,\n    49,\n    50,\n    54\n  ],\n  \"src/pljson_parser.impl.sql\" : [\n    82,\n    145,\n    216,\n    216,\n    216,\n    275,\n    275,\n    275,\n    303,\n    303,\n    303,\n    415,\n    580,\n    636,\n    684\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/pljson/IfWithExitCheck.json",
    "content": "{\n  \"src/addons/pljson_table_impl.type.impl.sql\" : [\n    617\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/pljson/InequalityUsageCheck.json",
    "content": "{\n  \"src/addons/pljson_helper.package.sql\" : [\n    282,\n    341\n  ],\n  \"src/addons/pljson_table_impl.type.impl.sql\" : [\n    272,\n    275,\n    388,\n    518\n  ],\n  \"src/pljson_ext.impl.sql\" : [\n    166,\n    263,\n    268,\n    291,\n    299,\n    303,\n    320,\n    347\n  ],\n  \"src/pljson_number.type.sql\" : [\n    130,\n    133\n  ],\n  \"src/pljson_parser.impl.sql\" : [\n    312,\n    436,\n    451,\n    466,\n    590,\n    627,\n    746,\n    779,\n    801,\n    823,\n    846,\n    865,\n    883\n  ],\n  \"src/pljson_printer.package.sql\" : [\n    276,\n    320,\n    491,\n    535,\n    604\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/pljson/InsertWithoutColumnsCheck.json",
    "content": "{\n  \"examples/ex_pljson_table.sql\" : [\n    41,\n    53,\n    65\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/pljson/QueryWithoutExceptionHandlingCheck.json",
    "content": "{\n  \"examples/ex13.sql\" : [\n    46,\n    70\n  ],\n  \"src/addons/pljson_util_pkg.package.sql\" : [\n    260\n  ],\n  \"src/pljson_parser.impl.sql\" : [\n    70\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/pljson/ReturnOfBooleanExpressionCheck.json",
    "content": "{\n  \"src/addons/pljson_object_cache.impl.sql\" : [\n    19\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/pljson/SameBranchCheck.json",
    "content": "{\n  \"src/addons/pljson_helper.package.sql\" : [\n    366\n  ],\n  \"src/pljson_ext.impl.sql\" : [\n    503\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/pljson/SelectAllColumnsCheck.json",
    "content": "{\n  \"examples/ex_pljson_table.sql\" : [\n    129,\n    224,\n    249,\n    294\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/pljson/ToDateWithoutFormatCheck.json",
    "content": "{\n  \"src/pljson_ext.impl.sql\" : [\n    98\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/pljson/UnnecessaryElseCheck.json",
    "content": "{\n  \"src/addons/pljson_helper.package.sql\" : [\n    243\n  ],\n  \"src/addons/pljson_object_cache.impl.sql\" : [\n    21,\n    77\n  ],\n  \"src/addons/pljson_table_impl.type.impl.sql\" : [\n    380,\n    656\n  ],\n  \"src/pljson.type.impl.sql\" : [\n    555\n  ],\n  \"src/pljson_bool.type.sql\" : [\n    31\n  ],\n  \"src/pljson_element.type.impl.sql\" : [\n    124\n  ],\n  \"src/pljson_ext.impl.sql\" : [\n    87,\n    398,\n    409,\n    420,\n    431,\n    442,\n    453,\n    464,\n    531,\n    542,\n    554,\n    565,\n    576,\n    587,\n    598,\n    935\n  ],\n  \"src/pljson_list.type.impl.sql\" : [\n    368\n  ],\n  \"src/pljson_number.type.sql\" : [\n    161\n  ],\n  \"src/pljson_printer.package.sql\" : [\n    67,\n    139,\n    168,\n    175\n  ],\n  \"src/pljson_string.type.sql\" : [\n    98\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/pljson/UnusedParameterCheck.json",
    "content": "{\n  \"src/addons/pljson_table_impl.type.impl.sql\" : [\n    45,\n    46\n  ],\n  \"src/pljson_element.type.impl.sql\" : [\n    56,\n    56,\n    64,\n    64,\n    104,\n    109,\n    114,\n    114,\n    157,\n    157,\n    157,\n    163,\n    163,\n    163\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/pljson/UnusedVariableCheck.json",
    "content": "{\n  \"src/addons/pljson_helper.package.sql\" : [\n    323\n  ],\n  \"src/addons/pljson_table_impl.type.impl.sql\" : [\n    356,\n    357,\n    358\n  ],\n  \"src/pljson.type.impl.sql\" : [\n    119\n  ],\n  \"src/pljson_ext.impl.sql\" : [\n    474,\n    474,\n    962,\n    988,\n    1005,\n    1021\n  ],\n  \"src/pljson_parser.impl.sql\" : [\n    278,\n    856\n  ],\n  \"src/pljson_string.type.sql\" : [\n    47\n  ],\n  \"testsuite-utplsql/utplsql_pljson_base64_test.sql\" : [\n    28,\n    70,\n    80,\n    251,\n    384,\n    402,\n    420\n  ],\n  \"testsuite-utplsql/utplsql_pljson_ext_test.sql\" : [\n    27\n  ],\n  \"testsuite-utplsql/utplsql_pljson_helper_test.sql\" : [\n    132\n  ],\n  \"testsuite-utplsql/utplsql_pljson_list_test.sql\" : [\n    72,\n    157\n  ],\n  \"testsuite-utplsql/utplsql_pljson_parser_test.sql\" : [\n    62\n  ],\n  \"testsuite-utplsql/utplsql_pljson_path_test.sql\" : [\n    63\n  ],\n  \"testsuite-utplsql/utplsql_pljson_simple_test.sql\" : [\n    24\n  ],\n  \"testsuite-utplsql/utplsql_pljson_table_test.sql\" : [\n    22\n  ],\n  \"testsuite-utplsql/utplsql_pljson_test.sql\" : [\n    60,\n    160,\n    183,\n    196\n  ],\n  \"testsuite-utplsql/utplsql_pljson_unicode_test.sql\" : [\n    65\n  ],\n  \"testsuite/pljson.test.sql\" : [\n    77,\n    101,\n    115\n  ],\n  \"testsuite/pljson_base64.test.sql\" : [\n    15,\n    25,\n    198,\n    332,\n    351,\n    370\n  ],\n  \"testsuite/pljson_list.test.sql\" : [\n    63\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/pljson/VariableHidingCheck.json",
    "content": "{\n  \"src/addons/pljson_table_impl.type.impl.sql\" : [\n    374,\n    398\n  ],\n  \"testsuite-utplsql/utplsql_pljson_ext_test.sql\" : [\n    69,\n    76\n  ],\n  \"testsuite-utplsql/utplsql_pljson_helper_test.sql\" : [\n    174,\n    181\n  ],\n  \"testsuite-utplsql/utplsql_pljson_list_test.sql\" : [\n    114,\n    121\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/pljson/VariableInitializationWithFunctionCallCheck.json",
    "content": "{\n  \"examples/ex13.sql\" : [\n    30,\n    55\n  ],\n  \"examples/ex14.sql\" : [\n    29,\n    40\n  ],\n  \"src/addons/pljson_dyn.package.sql\" : [\n    83\n  ],\n  \"src/addons/pljson_helper.package.sql\" : [\n    345,\n    356,\n    357,\n    391,\n    414\n  ],\n  \"src/pljson.type.impl.sql\" : [\n    262,\n    271,\n    280,\n    289,\n    298,\n    307,\n    316\n  ],\n  \"src/pljson_ext.impl.sql\" : [\n    716,\n    732\n  ],\n  \"src/pljson_list.type.impl.sql\" : [\n    292,\n    301,\n    310,\n    319,\n    328,\n    337,\n    383,\n    396,\n    413,\n    430,\n    448,\n    465,\n    482\n  ],\n  \"src/pljson_printer.package.sql\" : [\n    331,\n    346,\n    364,\n    598\n  ],\n  \"testsuite-utplsql/utplsql_pljson_base64_test.sql\" : [\n    28\n  ],\n  \"testsuite-utplsql/utplsql_pljson_ext_test.sql\" : [\n    27\n  ],\n  \"testsuite-utplsql/utplsql_pljson_helper_test.sql\" : [\n    132\n  ],\n  \"testsuite-utplsql/utplsql_pljson_list_test.sql\" : [\n    72\n  ],\n  \"testsuite-utplsql/utplsql_pljson_parser_test.sql\" : [\n    62\n  ],\n  \"testsuite-utplsql/utplsql_pljson_path_test.sql\" : [\n    63\n  ],\n  \"testsuite-utplsql/utplsql_pljson_simple_test.sql\" : [\n    24\n  ],\n  \"testsuite-utplsql/utplsql_pljson_table_test.sql\" : [\n    22\n  ],\n  \"testsuite-utplsql/utplsql_pljson_test.sql\" : [\n    60\n  ],\n  \"testsuite-utplsql/utplsql_pljson_unicode_test.sql\" : [\n    65,\n    235\n  ],\n  \"testsuite/pljson_unicode.test.sql\" : [\n    211\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/pljson/VariableInitializationWithNullCheck.json",
    "content": "{\n  \"examples/ex8.sql\" : [\n    56,\n    99\n  ],\n  \"src/addons/pljson_ml.package.sql\" : [\n    29\n  ],\n  \"src/addons/pljson_xml.package.sql\" : [\n    46,\n    151\n  ],\n  \"src/pljson_parser.impl.sql\" : [\n    146,\n    217,\n    276,\n    304,\n    305,\n    894\n  ],\n  \"src/pljson_printer.package.sql\" : [\n    104,\n    148,\n    362,\n    496,\n    545,\n    554,\n    565\n  ],\n  \"testsuite-utplsql/utplsql_pljson_ext_test.sql\" : [\n    168\n  ],\n  \"testsuite-utplsql/utplsql_pljson_list_test.sql\" : [\n    350,\n    361,\n    362,\n    382,\n    393,\n    404\n  ],\n  \"testsuite-utplsql/utplsql_pljson_test.sql\" : [\n    275,\n    286,\n    287,\n    313,\n    324,\n    335,\n    346\n  ],\n  \"testsuite/pljson.test.sql\" : [\n    197,\n    209,\n    210,\n    237,\n    249,\n    261,\n    273\n  ],\n  \"testsuite/pljson_ext.test.sql\" : [\n    120\n  ],\n  \"testsuite/pljson_list.test.sql\" : [\n    267,\n    279,\n    280,\n    301,\n    313,\n    325\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL2/CharacterDatatypeUsageCheck.json",
    "content": "{\n  \"examples/employee_pipe.pkg\" : [\n    7,\n    68\n  ],\n  \"examples/filepath2.pkg\" : [\n    5,\n    45\n  ],\n  \"examples/te_employee.pkb\" : [\n    28,\n    29,\n    30,\n    31,\n    32,\n    33,\n    34,\n    35,\n    36,\n    37,\n    38,\n    43,\n    44\n  ],\n  \"source/ut_assert.pkb\" : [\n    601\n  ],\n  \"source/ut_assert.pks\" : [\n    34,\n    35,\n    296\n  ],\n  \"source/ut_assert2.pkb\" : [\n    304,\n    1675,\n    2011,\n    2220,\n    3425,\n    3426,\n    3532,\n    3580\n  ],\n  \"source/ut_assert2.pks\" : [\n    35,\n    36,\n    578,\n    590\n  ],\n  \"source/ut_config.pks\" : [\n    44,\n    46\n  ],\n  \"source/ut_config.tab\" : [\n    3,\n    4,\n    6,\n    15\n  ],\n  \"source/ut_eq.tab\" : [\n    11,\n    12\n  ],\n  \"source/ut_gen.pks\" : [\n    42,\n    43,\n    44,\n    122\n  ],\n  \"source/ut_outcome.pks\" : [\n    32,\n    33\n  ],\n  \"source/ut_plsql.pks\" : [\n    37,\n    38,\n    39,\n    40,\n    41,\n    42\n  ],\n  \"source/ut_plsql2.pks\" : [\n    32,\n    33\n  ],\n  \"source/ut_plsql_util.pkb\" : [\n    62,\n    880\n  ],\n  \"source/ut_result2.pkb\" : [\n    108,\n    168,\n    233\n  ],\n  \"source/ut_result2.pks\" : [\n    31,\n    32\n  ],\n  \"source/ut_suite.pks\" : [\n    37,\n    38\n  ],\n  \"source/ut_suiteutp.pkb\" : [\n    47\n  ],\n  \"source/ut_suiteutp.pks\" : [\n    31,\n    32\n  ],\n  \"source/ut_testcase.pks\" : [\n    32,\n    33\n  ],\n  \"source/ut_unittest.pks\" : [\n    32,\n    33\n  ],\n  \"source/ut_unittest.tab\" : [\n    9\n  ],\n  \"source/ut_utp.pkb\" : [\n    158\n  ],\n  \"source/ut_utp.pks\" : [\n    31,\n    32\n  ],\n  \"source/ut_utp.tab\" : [\n    19\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL2/ColumnsShouldHaveTableNameCheck.json",
    "content": "{\n  \"source/ut_result2.pkb\" : [\n    298,\n    298,\n    298,\n    298\n  ],\n  \"source/ut_result2.pks\" : [\n    46,\n    46,\n    46,\n    46\n  ],\n  \"source/utv_last_run.sql\" : [\n    3,\n    3\n  ],\n  \"source/utv_result_full.sql\" : [\n    3,\n    4,\n    5,\n    5\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL2/CommitRollbackCheck.json",
    "content": "{\n  \"examples/mybooks_setup.sql\" : [\n    55,\n    61,\n    67\n  ],\n  \"examples/test_te_employee.pkb\" : [\n    191,\n    237,\n    276,\n    315,\n    424,\n    466,\n    491,\n    516,\n    536,\n    565,\n    594,\n    615,\n    703,\n    756,\n    859,\n    885,\n    905\n  ],\n  \"examples/ut_te_employee.pkb\" : [\n    191,\n    237,\n    276,\n    315,\n    424,\n    466,\n    491,\n    516,\n    536,\n    565,\n    594,\n    615,\n    703,\n    756,\n    859,\n    885,\n    905\n  ],\n  \"source/ut_plsql2.pkb\" : [\n    333\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL2/CursorBodyInPackageSpecCheck.json",
    "content": "{\n  \"examples/te_employee.pks\" : [\n    50,\n    59,\n    68,\n    80,\n    92,\n    104,\n    115,\n    124,\n    136,\n    148,\n    160,\n    171,\n    191,\n    214,\n    237,\n    260\n  ],\n  \"source/ut_config.pks\" : [\n    62,\n    67\n  ],\n  \"source/ut_result2.pks\" : [\n    44\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL2/DbmsOutputPutCheck.json",
    "content": "{\n  \"examples/te_employee.pkb\" : [\n    1688,\n    1700\n  ],\n  \"examples/ut_betwnstr.pkb\" : [\n    6,\n    12\n  ],\n  \"examples/ut_bstr.pkb\" : [\n    6,\n    12\n  ],\n  \"examples/ut_mybooks_pkg.sql\" : [\n    287,\n    329\n  ],\n  \"examples/ut_str.pkb\" : [\n    6,\n    12\n  ],\n  \"source/ut_assert2.pkb\" : [\n    3620,\n    3626,\n    3647\n  ],\n  \"source/ut_output.pkb\" : [\n    123\n  ],\n  \"source/ut_outputreporter.pkb\" : [\n    84,\n    90,\n    99,\n    108,\n    113\n  ],\n  \"source/ut_plsql_util.pkb\" : [\n    329,\n    379,\n    391,\n    463,\n    489,\n    512,\n    519,\n    551,\n    566,\n    851,\n    856,\n    1026,\n    1159,\n    1183,\n    1187,\n    1227,\n    1245,\n    1375,\n    1382,\n    1389,\n    1396,\n    1451,\n    1458,\n    1465,\n    1472,\n    1486,\n    1499,\n    1506,\n    1529,\n    1530,\n    1532,\n    1535,\n    1549,\n    1563,\n    1568,\n    1576,\n    1590,\n    1610,\n    1617\n  ],\n  \"source/ut_suite.pkb\" : [\n    274,\n    276\n  ],\n  \"source/ut_utoutput.pkb\" : [\n    60,\n    66,\n    85,\n    86,\n    87,\n    101,\n    102,\n    103,\n    104,\n    137,\n    138,\n    160,\n    174,\n    175\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL2/DeadCodeCheck.json",
    "content": "{\n  \"examples/temp.sql\" : [\n    11\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL2/EmptyBlockCheck.json",
    "content": "{\n  \"examples/employee_pipe.pkg\" : [\n    220,\n    225\n  ],\n  \"examples/qu_betwnstr.pkb\" : [\n    8,\n    14\n  ],\n  \"examples/simple_example.sql\" : [\n    42,\n    48\n  ],\n  \"examples/str.pkb\" : [\n    57,\n    63\n  ],\n  \"examples/te_employee.pkb\" : [\n    1649\n  ],\n  \"examples/temp.sql\" : [\n    25,\n    31\n  ],\n  \"examples/ut_betwnstr_failures.pkb\" : [\n    6,\n    12\n  ],\n  \"examples/ut_betwnstr_gen.pkg\" : [\n    15,\n    21\n  ],\n  \"examples/ut_calc_secs_between.pkb\" : [\n    6,\n    12\n  ],\n  \"examples/ut_department2file.pkg\" : [\n    15,\n    21\n  ],\n  \"examples/ut_plvdate.pkb\" : [\n    6,\n    12\n  ],\n  \"examples/ut_plvstr.pkb\" : [\n    6,\n    12\n  ],\n  \"examples/ut_vda$strings1.pkg\" : [\n    20,\n    26\n  ],\n  \"source/ut_outputreporter.pkb\" : [\n    37,\n    43\n  ],\n  \"source/ut_result2.pkb\" : [\n    37\n  ],\n  \"source/ut_utoutput.pkb\" : [\n    49\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL2/ExplicitInParameterCheck.json",
    "content": "{\n  \"examples/mybooks_setup.sql\" : [\n    28,\n    29,\n    30,\n    31,\n    31,\n    31,\n    32,\n    32,\n    32,\n    33,\n    38,\n    45,\n    52,\n    52,\n    52,\n    58,\n    58,\n    58,\n    64,\n    70\n  ],\n  \"examples/te_employee.pkb\" : [\n    936\n  ],\n  \"examples/te_employee.pks\" : [\n    465\n  ],\n  \"source/ut_assert.pkb\" : [\n    477,\n    489\n  ],\n  \"source/ut_assert.pks\" : [\n    236,\n    243\n  ],\n  \"source/ut_assert2.pkb\" : [\n    1467,\n    1468,\n    2473,\n    2556,\n    2638,\n    2654,\n    3115,\n    3134,\n    3152,\n    3168,\n    3428\n  ],\n  \"source/ut_assert2.pks\" : [\n    266,\n    282,\n    484,\n    500\n  ],\n  \"source/ut_filereporter.pkb\" : [\n    44,\n    44,\n    44,\n    193\n  ],\n  \"source/ut_filereporter.pks\" : [\n    32,\n    35,\n    35,\n    35\n  ],\n  \"source/ut_htmlreporter.pkb\" : [\n    63,\n    147,\n    151\n  ],\n  \"source/ut_htmlreporter.pks\" : [\n    43\n  ],\n  \"source/ut_output.pkb\" : [\n    137,\n    137\n  ],\n  \"source/ut_output.pks\" : [\n    64,\n    64\n  ],\n  \"source/ut_outputreporter.pkb\" : [\n    50,\n    51,\n    52,\n    61,\n    213,\n    298,\n    302,\n    314\n  ],\n  \"source/ut_outputreporter.pks\" : [\n    42\n  ],\n  \"source/ut_package.pkb\" : [\n    352,\n    353,\n    354,\n    415,\n    416,\n    417\n  ],\n  \"source/ut_package.pks\" : [\n    70,\n    71,\n    72,\n    97,\n    98,\n    99\n  ],\n  \"source/ut_plsql_util.pkb\" : [\n    62,\n    88,\n    89,\n    90,\n    91,\n    92,\n    110,\n    111,\n    120,\n    121,\n    157,\n    158,\n    174,\n    175,\n    184,\n    185,\n    201,\n    202,\n    218,\n    219,\n    244,\n    264,\n    265,\n    266,\n    297,\n    321,\n    484,\n    501,\n    541,\n    571,\n    580,\n    581,\n    609,\n    632,\n    642,\n    756,\n    768,\n    784,\n    800,\n    800,\n    819,\n    819,\n    843,\n    860,\n    868,\n    869,\n    971,\n    993,\n    994,\n    995,\n    1035,\n    1036,\n    1037,\n    1099,\n    1120,\n    1120,\n    1136,\n    1137,\n    1138,\n    1154,\n    1192,\n    1209,\n    1281,\n    1281,\n    1311,\n    1312,\n    1338,\n    1339,\n    1340,\n    1341,\n    1342,\n    1441,\n    1514,\n    1515,\n    1516,\n    1517,\n    1518\n  ],\n  \"source/ut_plsql_util.pks\" : [\n    75,\n    76,\n    88,\n    89,\n    94,\n    95,\n    100,\n    101,\n    106,\n    107,\n    112,\n    113,\n    118,\n    119,\n    125,\n    126,\n    127,\n    131,\n    136,\n    141,\n    146,\n    147,\n    152,\n    154,\n    156,\n    159,\n    162,\n    162,\n    165,\n    167,\n    174,\n    175,\n    184,\n    187,\n    188,\n    189,\n    195,\n    196,\n    197,\n    200,\n    204,\n    205,\n    206,\n    207,\n    208\n  ],\n  \"source/ut_receq.pkb\" : [\n    34\n  ],\n  \"source/ut_report.pkb\" : [\n    213\n  ],\n  \"source/ut_report.pks\" : [\n    41,\n    42,\n    46,\n    51\n  ],\n  \"source/ut_result.pkb\" : [\n    233,\n    257,\n    266,\n    286\n  ],\n  \"source/ut_result.pks\" : [\n    106,\n    110,\n    115,\n    120\n  ],\n  \"source/ut_result2.pkb\" : [\n    335\n  ],\n  \"source/ut_result2.pks\" : [\n    106\n  ],\n  \"source/ut_suite.pkb\" : [\n    173,\n    174,\n    230,\n    231,\n    232\n  ],\n  \"source/ut_suite.pks\" : [\n    63,\n    64,\n    65,\n    71,\n    72,\n    73\n  ],\n  \"source/ut_test.pkb\" : [\n    138,\n    139,\n    140,\n    173,\n    174,\n    175\n  ],\n  \"source/ut_test.pks\" : [\n    59,\n    60,\n    61,\n    67,\n    68,\n    69\n  ],\n  \"source/ut_testcase.pkb\" : [\n    137,\n    138,\n    139,\n    172,\n    173,\n    174\n  ],\n  \"source/ut_testcase.pks\" : [\n    62,\n    63,\n    64,\n    70,\n    71,\n    72\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL2/FunctionWithOutParameterCheck.json",
    "content": "{\n  \"examples/employee_pipe.pkg\" : [\n    30,\n    31,\n    32,\n    33,\n    34,\n    35,\n    36,\n    37,\n    38,\n    39,\n    40,\n    41,\n    45,\n    108,\n    109,\n    110,\n    111,\n    112,\n    113,\n    114,\n    115,\n    116,\n    117,\n    118,\n    119,\n    170\n  ],\n  \"source/ut_output.pkb\" : [\n    54\n  ],\n  \"source/ut_output.pks\" : [\n    43\n  ],\n  \"source/ut_plsql_util.pkb\" : [\n    244,\n    297,\n    870,\n    871\n  ],\n  \"source/ut_plsql_util.pks\" : [\n    176,\n    177\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL2/IfWithExitCheck.json",
    "content": "{\n  \"source/ut_result2.pkb\" : [\n    347\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL2/InequalityUsageCheck.json",
    "content": "{\n  \"examples/employee_pipe.pkg\" : [\n    212\n  ],\n  \"source/ut_assert2.pkb\" : [\n    1409,\n    1739\n  ],\n  \"source/ut_pipe.pkb\" : [\n    52\n  ],\n  \"source/ut_plsql_util.pkb\" : [\n    1223,\n    1232,\n    1252,\n    1298,\n    1318\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL2/InsertWithoutColumnsCheck.json",
    "content": "{\n  \"examples/mybooks_setup.sql\" : [\n    19,\n    20,\n    21,\n    22,\n    23,\n    54\n  ],\n  \"source/ut_receq.pkb\" : [\n    245,\n    255\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL2/ParsingErrorCheck.json",
    "content": "{\n  \"examples/filepath1.pkg\" : [\n    104\n  ],\n  \"examples/str2list.pkg\" : [\n    62\n  ],\n  \"source/ut_assertion.tab\" : [\n    33\n  ],\n  \"source/ut_config.pkb\" : [\n    680\n  ],\n  \"source/ut_gen.pkb\" : [\n    222\n  ],\n  \"source/ut_i_preprocess.sql\" : [\n    23\n  ],\n  \"source/ut_i_synonyms.sql\" : [\n    24\n  ],\n  \"source/ut_outcome.tab\" : [\n    22\n  ],\n  \"source/ut_package.tab\" : [\n    21\n  ],\n  \"source/ut_plsql.pkb\" : [\n    778\n  ],\n  \"source/ut_receq.tab\" : [\n    12\n  ],\n  \"source/ut_suite.tab\" : [\n    17\n  ],\n  \"source/ut_test.tab\" : [\n    14\n  ],\n  \"source/ut_testcase.tab\" : [\n    25\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL2/QueryWithoutExceptionHandlingCheck.json",
    "content": "{\n  \"examples/mybooks_setup.sql\" : [\n    48\n  ],\n  \"examples/te_employee.pkb\" : [\n    863,\n    874,\n    890,\n    904,\n    918,\n    967\n  ],\n  \"examples/test_te_employee.pkb\" : [\n    369\n  ],\n  \"examples/ut_te_employee.pkb\" : [\n    369\n  ],\n  \"source/ut_plsql2.pkb\" : [\n    57\n  ],\n  \"source/ut_plsql_util.pkb\" : [\n    615,\n    959,\n    963\n  ],\n  \"source/ut_receq.pkb\" : [\n    151\n  ],\n  \"source/ut_result.pkb\" : [\n    291,\n    298\n  ],\n  \"source/ut_routcome.pkb\" : [\n    162\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL2/RaiseStandardExceptionCheck.json",
    "content": "{\n  \"examples/temp.sql\" : [\n    9\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL2/SameBranchCheck.json",
    "content": "{\n  \"source/ut_outputreporter.pkb\" : [\n    90\n  ],\n  \"source/ut_plsql_util.pkb\" : [\n    233\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL2/SelectAllColumnsCheck.json",
    "content": "{\n  \"examples/employee_pipe.pkg\" : [\n    199,\n    238\n  ],\n  \"examples/mybooks_setup.sql\" : [\n    41,\n    72\n  ],\n  \"examples/test_te_employee.pkb\" : [\n    179\n  ],\n  \"examples/ut_te_employee.pkb\" : [\n    179\n  ],\n  \"source/ut_plsql2.pkb\" : [\n    313,\n    413\n  ],\n  \"source/ut_receq.pkb\" : [\n    168\n  ],\n  \"source/ut_result.pkb\" : [\n    68,\n    95\n  ],\n  \"source/ut_suite.pkb\" : [\n    247,\n    265\n  ],\n  \"source/ut_utp.pkb\" : [\n    402\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL2/UnhandledUserDefinedExceptionCheck.json",
    "content": "{\n  \"source/ut_filereporter.pkb\" : [\n    130\n  ],\n  \"source/ut_htmlreporter.pkb\" : [\n    47\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL2/UnnecessaryAliasInQueryCheck.json",
    "content": "{\n  \"examples/showfailures.sql\" : [\n    33,\n    33,\n    33\n  ],\n  \"source/ut_assert2.pkb\" : [\n    808\n  ],\n  \"source/ut_outcome.pkb\" : [\n    104,\n    104,\n    104,\n    123,\n    123\n  ],\n  \"source/ut_result.pkb\" : [\n    302\n  ],\n  \"source/ut_result2.pkb\" : [\n    343\n  ],\n  \"source/ut_routcome.pkb\" : [\n    199,\n    199\n  ],\n  \"source/ut_rutp.pkb\" : [\n    174,\n    218\n  ],\n  \"source/ut_suiteutp.pkb\" : [\n    174,\n    174\n  ],\n  \"source/utv_last_run.sql\" : [\n    4\n  ],\n  \"source/utv_result_full.sql\" : [\n    7,\n    8,\n    9\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL2/UnnecessaryElseCheck.json",
    "content": "{\n  \"examples/str.pkb\" : [\n    40\n  ],\n  \"examples/te_employee.pkb\" : [\n    1439\n  ],\n  \"source/ut_assert2.pkb\" : [\n    96,\n    422,\n    3434\n  ],\n  \"source/ut_output.pkb\" : [\n    150\n  ],\n  \"source/ut_outputreporter.pkb\" : [\n    123\n  ],\n  \"source/ut_plsql_util.pkb\" : [\n    1130,\n    1149\n  ],\n  \"source/ut_rerror.pkb\" : [\n    43,\n    64\n  ],\n  \"source/ut_result.pkb\" : [\n    186\n  ],\n  \"source/ut_result2.pkb\" : [\n    144,\n    157,\n    207,\n    222,\n    272,\n    287\n  ],\n  \"source/ut_suite.pkb\" : [\n    129\n  ],\n  \"source/ut_suiteutp.pkb\" : [\n    129\n  ],\n  \"source/ut_unittest.pkb\" : [\n    109,\n    148,\n    185\n  ],\n  \"source/ut_utp.pkb\" : [\n    202,\n    277,\n    350\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL2/UnnecessaryNullStatementCheck.json",
    "content": "{\n  \"examples/te_employee.pkb\" : [\n    1707\n  ],\n  \"source/ut_routcome.pkb\" : [\n    59\n  ],\n  \"source/ut_rsuite.pkb\" : [\n    59\n  ],\n  \"source/ut_rtestcase.pkb\" : [\n    52\n  ],\n  \"source/ut_runittest.pkb\" : [\n    58\n  ],\n  \"source/ut_rutp.pkb\" : [\n    59\n  ],\n  \"source/ut_suiteutp.pkb\" : [\n    122\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL2/UnusedParameterCheck.json",
    "content": "{\n  \"examples/te_employee.pkb\" : [\n    70,\n    1212,\n    1213,\n    1373\n  ],\n  \"source/ut_assert.pkb\" : [\n    296,\n    297,\n    298,\n    299,\n    336,\n    337,\n    430,\n    442,\n    454,\n    466\n  ],\n  \"source/ut_assert2.pkb\" : [\n    294,\n    683,\n    1261,\n    1262,\n    1263,\n    1264,\n    1265,\n    1303,\n    1646,\n    1657,\n    1659,\n    1661,\n    1663,\n    1669,\n    1792,\n    2891,\n    2892,\n    2893,\n    2894,\n    2895,\n    3188\n  ],\n  \"source/ut_htmlreporter.pkb\" : [\n    118,\n    124,\n    139\n  ],\n  \"source/ut_outputreporter.pkb\" : [\n    253,\n    265,\n    281\n  ],\n  \"source/ut_plsql2.pkb\" : [\n    151,\n    308\n  ],\n  \"source/ut_plsql_util.pkb\" : [\n    995\n  ],\n  \"source/ut_result.pkb\" : [\n    48,\n    131,\n    154,\n    160,\n    177,\n    195,\n    211,\n    222\n  ],\n  \"source/ut_result2.pkb\" : [\n    32,\n    33\n  ],\n  \"source/ut_testprep.pkb\" : [\n    32,\n    39\n  ],\n  \"source/ut_utp.pkb\" : [\n    231\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL2/UnusedVariableCheck.json",
    "content": "{\n  \"examples/qu_betwnstr.pkb\" : [\n    23\n  ],\n  \"examples/te_employee.pkb\" : [\n    23,\n    44\n  ],\n  \"examples/test_te_employee.pkb\" : [\n    320,\n    429,\n    430,\n    431,\n    432,\n    433,\n    434,\n    435,\n    436,\n    437,\n    438,\n    439,\n    440\n  ],\n  \"examples/ut_plvdate.pkb\" : [\n    28\n  ],\n  \"examples/ut_te_employee.pkb\" : [\n    320,\n    429,\n    430,\n    431,\n    432,\n    433,\n    434,\n    435,\n    436,\n    437,\n    438,\n    439,\n    440\n  ],\n  \"source/ut_assert2.pkb\" : [\n    902,\n    950,\n    1674,\n    1675,\n    1676,\n    1677,\n    1678,\n    1679,\n    3261,\n    3262\n  ],\n  \"source/ut_filereporter.pkb\" : [\n    114\n  ],\n  \"source/ut_plsql2.pkb\" : [\n    155,\n    405,\n    406,\n    407,\n    408\n  ],\n  \"source/ut_plsql_util.pkb\" : [\n    586,\n    587,\n    600,\n    601,\n    602,\n    603,\n    604,\n    605,\n    1000\n  ],\n  \"source/ut_receq.pkb\" : [\n    115\n  ],\n  \"source/ut_result.pkb\" : [\n    32,\n    61,\n    63,\n    142\n  ],\n  \"source/ut_suite.pkb\" : [\n    166\n  ],\n  \"source/ut_suiteutp.pkb\" : [\n    189\n  ],\n  \"source/ut_unittest.pkb\" : [\n    102\n  ],\n  \"source/ut_utoutput.pkb\" : [\n    78\n  ],\n  \"source/ut_utp.pkb\" : [\n    195\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL2/VariableHidingCheck.json",
    "content": "{\n  \"source/ut_plsql.pks\" : [\n    44\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL2/VariableInitializationWithFunctionCallCheck.json",
    "content": "{\n  \"examples/filepath2.pkg\" : [\n    128\n  ],\n  \"examples/te_employee.pkb\" : [\n    88,\n    115,\n    137,\n    161,\n    185,\n    209,\n    236,\n    258,\n    282,\n    306,\n    330,\n    357,\n    379,\n    403,\n    427\n  ],\n  \"source/ut_assert2.pkb\" : [\n    819,\n    3266\n  ],\n  \"source/ut_output.pkb\" : [\n    59\n  ],\n  \"source/ut_outputreporter.pkb\" : [\n    59\n  ],\n  \"source/ut_package.pkb\" : [\n    63,\n    135,\n    139\n  ],\n  \"source/ut_plsql2.pkb\" : [\n    248,\n    266\n  ],\n  \"source/ut_result.pkb\" : [\n    62\n  ],\n  \"source/ut_result2.pkb\" : [\n    50\n  ],\n  \"source/ut_runittest.pkb\" : [\n    99\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL2/VariableInitializationWithNullCheck.json",
    "content": "{\n  \"examples/te_employee.pkb\" : [\n    24\n  ],\n  \"source/ut_filereporter.pkb\" : [\n    35\n  ],\n  \"source/ut_package.pkb\" : [\n    184,\n    227\n  ],\n  \"source/ut_plsql_util.pkb\" : [\n    300,\n    301,\n    586,\n    587\n  ],\n  \"source/ut_report.pkb\" : [\n    50,\n    82\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL3/AddParenthesesInNestedExpressionCheck.json",
    "content": "{\n  \"development/utplsql_style_check.sql\" : [\n    43,\n    44,\n    59,\n    60\n  ],\n  \"source/api/ut_runner.pkb\" : [\n    52\n  ],\n  \"source/core/output_buffers/ut_output_bulk_buffer.tpb\" : [\n    57\n  ],\n  \"source/core/output_buffers/ut_output_clob_table_buffer.tpb\" : [\n    48\n  ],\n  \"source/core/output_buffers/ut_output_table_buffer.tpb\" : [\n    57\n  ],\n  \"source/core/ut_suite_cache_manager.pkb\" : [\n    210\n  ],\n  \"source/core/ut_utils.pkb\" : [\n    357\n  ],\n  \"source/expectations/data_values/ut_compound_data_helper.pkb\" : [\n    735\n  ],\n  \"source/expectations/matchers/ut_be_within.tpb\" : [\n    114,\n    116\n  ],\n  \"source/install_above_12_1.sql\" : [\n    6\n  ],\n  \"test/install_above_12_1.sql\" : [\n    13\n  ],\n  \"test/install_below_12_2.sql\" : [\n    13\n  ],\n  \"test/ut3_tester_helper/run_helper.pkb\" : [\n    153,\n    154\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL3/CharacterDatatypeUsageCheck.json",
    "content": "{\n  \"source/core/types/ut_executable_test.tpb\" : [\n    151\n  ],\n  \"test/ut3_tester/core/test_ut_utils.pkb\" : [\n    290\n  ],\n  \"test/ut3_user/expectations/test_expectations_cursor.pkb\" : [\n    673\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL3/CommitRollbackCheck.json",
    "content": "{\n  \"source/api/ut_runner.pkb\" : [\n    32\n  ],\n  \"test/ut3_tester_helper/ut_example_tests.pkb\" : [\n    32\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL3/ComparisonWithBooleanCheck.json",
    "content": "{\n  \"source/core/annotations/ut_annotation_manager.pkb\" : [\n    68\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL3/ComparisonWithNullCheck.json",
    "content": "{\n  \"test/ut3_user/expectations/unary/test_expect_to_be_true_false.pkb\" : [\n    12,\n    44,\n    77,\n    109\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL3/ConcatenationWithNullCheck.json",
    "content": "{\n  \"source/core/ut_expectation_processor.pkb\" : [\n    89\n  ],\n  \"source/reporters/ut_coverage_report_html_helper.pkb\" : [\n    335\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL3/DbmsOutputPutCheck.json",
    "content": "{\n  \"development/mystats/mystats_pkg.sql\" : [\n    193,\n    194,\n    195,\n    196,\n    212,\n    218,\n    219,\n    331,\n    337,\n    346,\n    350,\n    351,\n    361,\n    367,\n    369,\n    421,\n    441\n  ],\n  \"examples/developer_examples/RunExampleTestAnnotationsParsingTimeHugePackage.sql\" : [\n    17,\n    18\n  ],\n  \"examples/developer_examples/RunExampleTestSuite.sql\" : [\n    39,\n    40,\n    41,\n    42,\n    45,\n    46,\n    49\n  ],\n  \"source/api/ut_runner.pkb\" : [\n    149,\n    150\n  ],\n  \"source/core/coverage/proftab.sql\" : [\n    25,\n    56,\n    88,\n    102\n  ],\n  \"source/core/coverage/ut_coverage_helper_block.pkb\" : [\n    45,\n    46,\n    47,\n    48\n  ],\n  \"source/core/coverage/ut_coverage_runs.sql\" : [\n    17\n  ],\n  \"source/core/output_buffers/ut_output_buffer_base.tpb\" : [\n    135,\n    138\n  ],\n  \"source/core/output_buffers/ut_output_bulk_buffer.tpb\" : [\n    82\n  ],\n  \"source/core/output_buffers/ut_output_table_buffer.tpb\" : [\n    82\n  ],\n  \"source/core/ut_expectation_processor.pkb\" : [\n    89,\n    91,\n    94\n  ],\n  \"source/core/ut_utils.pkb\" : [\n    70,\n    82,\n    567,\n    569\n  ],\n  \"source/expectations/json_objects_specs.sql\" : [\n    4,\n    10\n  ],\n  \"source/uninstall.sql\" : [\n    34,\n    35,\n    36\n  ],\n  \"source/uninstall_all.sql\" : [\n    36,\n    37,\n    38\n  ],\n  \"source/uninstall_coverage_tables.sql\" : [\n    15,\n    29\n  ],\n  \"source/uninstall_objects.sql\" : [\n    14,\n    16,\n    403,\n    416,\n    421,\n    426,\n    427\n  ],\n  \"source/uninstall_synonyms.sql\" : [\n    6,\n    20,\n    24,\n    27,\n    28,\n    35,\n    52,\n    57,\n    61,\n    62\n  ],\n  \"test/install_ut3_tester_helper.sql\" : [\n    63\n  ],\n  \"test/install_ut3_tester_tests.sql\" : [\n    73\n  ],\n  \"test/install_ut3_user_tests.sql\" : [\n    125\n  ],\n  \"test/ut3_tester/core/test_ut_executable.pkb\" : [\n    69\n  ],\n  \"test/ut3_user/api/test_ut_runner.pkb\" : [\n    182\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL3/EmptyBlockCheck.json",
    "content": "{\n  \"examples/RunWithDocumentationReporter.sql\" : [\n    27,\n    76\n  ],\n  \"examples/developer_examples/ut_exampletest.pkb\" : [\n    7,\n    13\n  ],\n  \"examples/developer_examples/ut_exampletest2.pkb\" : [\n    7,\n    13\n  ],\n  \"source/core/types/ut_reporter_base.tpb\" : [\n    44,\n    50,\n    55,\n    59,\n    64,\n    68,\n    74,\n    79,\n    83,\n    88,\n    92,\n    97,\n    101,\n    106,\n    112,\n    116,\n    121,\n    125,\n    130,\n    136\n  ],\n  \"test/ut3_tester/core/test_ut_executable.pkb\" : [\n    64\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL3/ExplicitInParameterCheck.json",
    "content": "{\n  \"examples/award_bonus/award_bonus.sql\" : [\n    4,\n    4\n  ],\n  \"examples/award_bonus/test_award_bonus.pkg\" : [\n    67,\n    67,\n    67\n  ],\n  \"examples/between_string/betwnstr.sql\" : [\n    1,\n    1,\n    1\n  ],\n  \"examples/custom_reporters/ut_custom_reporter.tpb\" : [\n    3,\n    19,\n    19,\n    24,\n    30,\n    36,\n    42\n  ],\n  \"examples/custom_reporters/ut_custom_reporter.tps\" : [\n    6,\n    14,\n    14,\n    15,\n    16,\n    17,\n    18\n  ],\n  \"examples/custom_reporters/ut_expectations_reporter.tpb\" : [\n    19,\n    36,\n    39,\n    57\n  ],\n  \"examples/custom_reporters/ut_expectations_reporter.tps\" : [\n    21,\n    23\n  ],\n  \"examples/remove_rooms_by_name/remove_rooms_by_name.sql\" : [\n    1\n  ],\n  \"source/api/ut.pkb\" : [\n    31,\n    36,\n    41,\n    46,\n    51,\n    56,\n    61,\n    66,\n    71,\n    76,\n    81,\n    86,\n    91,\n    96,\n    101,\n    123,\n    125,\n    126,\n    127,\n    128,\n    129,\n    130,\n    131,\n    132,\n    133,\n    134,\n    135,\n    136,\n    137,\n    138,\n    167,\n    169,\n    170,\n    171,\n    172,\n    173,\n    174,\n    175,\n    176,\n    177,\n    178,\n    179,\n    180,\n    181,\n    182,\n    211,\n    242,\n    243,\n    244,\n    245,\n    246,\n    247,\n    248,\n    249,\n    250,\n    251,\n    252,\n    253,\n    254,\n    255,\n    256,\n    290,\n    291,\n    292,\n    293,\n    294,\n    295,\n    296,\n    297,\n    298,\n    299,\n    300,\n    301,\n    302,\n    303,\n    304,\n    338,\n    339,\n    340,\n    341,\n    342,\n    343,\n    344,\n    345,\n    346,\n    347,\n    348,\n    349,\n    350,\n    351,\n    352,\n    353,\n    387,\n    388,\n    389,\n    390,\n    391,\n    392,\n    393,\n    394,\n    395,\n    396,\n    397,\n    398,\n    399,\n    400,\n    401,\n    402,\n    436,\n    437,\n    438,\n    439,\n    440,\n    441,\n    442,\n    443,\n    444,\n    445,\n    446,\n    447,\n    448,\n    449,\n    450,\n    451,\n    485,\n    486,\n    487,\n    488,\n    489,\n    490,\n    491,\n    492,\n    493,\n    494,\n    495,\n    496,\n    497,\n    498,\n    499,\n    500,\n    534,\n    535,\n    536,\n    537,\n    538,\n    539,\n    540,\n    541,\n    542,\n    543,\n    544,\n    545,\n    546,\n    547,\n    548,\n    549,\n    550,\n    603,\n    604,\n    605,\n    606,\n    607,\n    608,\n    609,\n    610,\n    611,\n    612,\n    613,\n    614,\n    615,\n    616,\n    617,\n    618,\n    619,\n    645,\n    646,\n    647,\n    648,\n    649,\n    650,\n    651,\n    652,\n    653,\n    654,\n    655,\n    656,\n    657,\n    658,\n    659,\n    660,\n    685,\n    686,\n    687,\n    688,\n    689,\n    690,\n    691,\n    692,\n    693,\n    694,\n    695,\n    696,\n    697,\n    698,\n    699,\n    700,\n    725,\n    726,\n    727,\n    728,\n    729,\n    730,\n    731,\n    732,\n    733,\n    734,\n    735,\n    736,\n    737,\n    738,\n    739,\n    740,\n    741,\n    766,\n    767,\n    768,\n    769,\n    770,\n    771,\n    772,\n    773,\n    774,\n    775,\n    776,\n    777,\n    778,\n    779,\n    780,\n    781,\n    782\n  ],\n  \"source/api/ut.pks\" : [\n    22,\n    24,\n    26,\n    28,\n    30,\n    32,\n    34,\n    36,\n    38,\n    40,\n    42,\n    44,\n    46,\n    48,\n    50,\n    55,\n    56,\n    57,\n    58,\n    59,\n    60,\n    61,\n    62,\n    63,\n    64,\n    65,\n    66,\n    67,\n    68,\n    69,\n    73,\n    74,\n    75,\n    76,\n    77,\n    78,\n    79,\n    80,\n    81,\n    82,\n    83,\n    84,\n    85,\n    86,\n    87,\n    91,\n    92,\n    93,\n    94,\n    95,\n    96,\n    97,\n    98,\n    99,\n    100,\n    101,\n    102,\n    103,\n    104,\n    105,\n    106,\n    110,\n    111,\n    112,\n    113,\n    114,\n    115,\n    116,\n    117,\n    118,\n    119,\n    120,\n    121,\n    122,\n    123,\n    124,\n    125,\n    129,\n    130,\n    131,\n    132,\n    133,\n    134,\n    135,\n    136,\n    137,\n    138,\n    139,\n    140,\n    141,\n    142,\n    143,\n    144,\n    148,\n    149,\n    150,\n    151,\n    152,\n    153,\n    154,\n    155,\n    156,\n    157,\n    158,\n    159,\n    160,\n    161,\n    162,\n    163,\n    167,\n    168,\n    169,\n    170,\n    171,\n    172,\n    173,\n    174,\n    175,\n    176,\n    177,\n    178,\n    179,\n    180,\n    181,\n    182,\n    186,\n    187,\n    188,\n    189,\n    190,\n    191,\n    192,\n    193,\n    194,\n    195,\n    196,\n    197,\n    198,\n    199,\n    200,\n    201,\n    205,\n    206,\n    207,\n    208,\n    209,\n    210,\n    211,\n    212,\n    213,\n    214,\n    215,\n    216,\n    217,\n    218,\n    219,\n    220,\n    221,\n    225,\n    226,\n    227,\n    228,\n    229,\n    230,\n    231,\n    232,\n    233,\n    234,\n    235,\n    236,\n    237,\n    238,\n    239,\n    240,\n    241,\n    245,\n    246,\n    247,\n    248,\n    249,\n    250,\n    251,\n    252,\n    253,\n    254,\n    255,\n    256,\n    257,\n    258,\n    259,\n    260,\n    261,\n    265,\n    266,\n    267,\n    268,\n    269,\n    270,\n    271,\n    272,\n    273,\n    274,\n    275,\n    276,\n    277,\n    278,\n    279,\n    280,\n    281\n  ],\n  \"source/api/ut_runner.pkb\" : [\n    24,\n    24,\n    45,\n    45,\n    59,\n    60,\n    61,\n    62,\n    63,\n    64,\n    65,\n    66,\n    67,\n    68,\n    69,\n    70,\n    71,\n    72,\n    73,\n    74,\n    75,\n    76,\n    158,\n    158,\n    163,\n    163,\n    168,\n    168,\n    187,\n    207,\n    207,\n    207,\n    219,\n    219,\n    231,\n    261\n  ],\n  \"source/api/ut_runner.pks\" : [\n    33,\n    33,\n    61,\n    62,\n    63,\n    64,\n    65,\n    66,\n    67,\n    68,\n    69,\n    70,\n    71,\n    72,\n    73,\n    74,\n    75,\n    76,\n    77,\n    78,\n    89,\n    89,\n    97,\n    97,\n    107,\n    107,\n    114,\n    124,\n    124,\n    124,\n    132,\n    132,\n    139,\n    154\n  ],\n  \"source/api/ut_suite_item_info.tpb\" : [\n    18,\n    18,\n    18,\n    19,\n    19,\n    19,\n    19,\n    19,\n    20,\n    20\n  ],\n  \"source/api/ut_suite_item_info.tps\" : [\n    28,\n    28,\n    28,\n    29,\n    29,\n    29,\n    29,\n    29,\n    30,\n    30\n  ],\n  \"source/check_object_grants.sql\" : [\n    11\n  ],\n  \"source/core/annotations/ut_annotation_cache_manager.pkb\" : [\n    19,\n    68,\n    120,\n    120,\n    120,\n    138,\n    138,\n    153,\n    153,\n    163,\n    178,\n    178,\n    178,\n    200,\n    200\n  ],\n  \"source/core/annotations/ut_annotation_cache_manager.pks\" : [\n    28,\n    38,\n    38,\n    38,\n    40,\n    40,\n    42,\n    42,\n    47,\n    47,\n    47,\n    54,\n    61,\n    69,\n    69\n  ],\n  \"source/core/annotations/ut_annotation_manager.pkb\" : [\n    22,\n    29,\n    29,\n    56,\n    57,\n    58,\n    102,\n    102,\n    102,\n    133,\n    134,\n    135,\n    175,\n    176,\n    177,\n    222,\n    222,\n    232,\n    232,\n    232,\n    257,\n    257,\n    257,\n    308,\n    308,\n    308,\n    320,\n    320\n  ],\n  \"source/core/annotations/ut_annotation_manager.pks\" : [\n    33,\n    33,\n    33,\n    43,\n    43,\n    56,\n    56\n  ],\n  \"source/core/annotations/ut_annotation_parser.pkb\" : [\n    36,\n    37,\n    38,\n    58,\n    70,\n    71,\n    72,\n    92,\n    186,\n    218,\n    218\n  ],\n  \"source/core/annotations/ut_annotation_parser.pks\" : [\n    30,\n    30,\n    41\n  ],\n  \"source/core/coverage/ut_coverage.pkb\" : [\n    33,\n    33,\n    199,\n    226,\n    262\n  ],\n  \"source/core/coverage/ut_coverage.pks\" : [\n    67,\n    75\n  ],\n  \"source/core/coverage/ut_coverage_block.pkb\" : [\n    26\n  ],\n  \"source/core/coverage/ut_coverage_block.pks\" : [\n    19\n  ],\n  \"source/core/coverage/ut_coverage_helper.pkb\" : [\n    35,\n    73,\n    73,\n    86,\n    86,\n    86\n  ],\n  \"source/core/coverage/ut_coverage_helper.pks\" : [\n    54,\n    62,\n    62,\n    64,\n    64,\n    64\n  ],\n  \"source/core/coverage/ut_coverage_helper_block.pkb\" : [\n    26,\n    52,\n    52,\n    87,\n    87\n  ],\n  \"source/core/coverage/ut_coverage_helper_block.pks\" : [\n    23,\n    23\n  ],\n  \"source/core/coverage/ut_coverage_helper_profiler.pkb\" : [\n    34,\n    58,\n    58,\n    80,\n    80\n  ],\n  \"source/core/coverage/ut_coverage_helper_profiler.pks\" : [\n    27,\n    27\n  ],\n  \"source/core/coverage/ut_coverage_profiler.pkb\" : [\n    22\n  ],\n  \"source/core/coverage/ut_coverage_profiler.pks\" : [\n    19\n  ],\n  \"source/core/coverage/ut_coverage_reporter_base.tpb\" : [\n    19,\n    89,\n    89,\n    101,\n    101\n  ],\n  \"source/core/coverage/ut_coverage_reporter_base.tps\" : [\n    19,\n    40,\n    40,\n    41,\n    41\n  ],\n  \"source/core/events/ut_event_listener.tps\" : [\n    33,\n    33\n  ],\n  \"source/core/events/ut_event_manager.pkb\" : [\n    60,\n    60,\n    63,\n    64,\n    65,\n    88,\n    88,\n    93,\n    93,\n    100,\n    110\n  ],\n  \"source/core/events/ut_event_manager.pks\" : [\n    59,\n    59,\n    63\n  ],\n  \"source/core/output_buffers/ut_output_buffer_base.tpb\" : [\n    19,\n    19,\n    38,\n    66,\n    66,\n    66,\n    84,\n    84,\n    84,\n    113,\n    113,\n    122,\n    122,\n    144\n  ],\n  \"source/core/output_buffers/ut_output_buffer_base.tps\" : [\n    24,\n    24,\n    25,\n    26,\n    26,\n    26,\n    27,\n    27,\n    27,\n    29,\n    29,\n    30,\n    30,\n    31,\n    34,\n    34,\n    35,\n    35,\n    36,\n    36,\n    37,\n    37\n  ],\n  \"source/core/output_buffers/ut_output_bulk_buffer.tpb\" : [\n    19,\n    25,\n    25,\n    44,\n    44,\n    54,\n    54,\n    73,\n    73,\n    90,\n    90,\n    141,\n    141\n  ],\n  \"source/core/output_buffers/ut_output_bulk_buffer.tps\" : [\n    19,\n    20,\n    20,\n    21,\n    21,\n    22,\n    22,\n    23,\n    23,\n    24,\n    24,\n    25,\n    25\n  ],\n  \"source/core/output_buffers/ut_output_clob_table_buffer.tpb\" : [\n    19,\n    25,\n    25,\n    35,\n    35,\n    45,\n    45,\n    55,\n    55,\n    85\n  ],\n  \"source/core/output_buffers/ut_output_clob_table_buffer.tps\" : [\n    19,\n    20,\n    20,\n    21,\n    21,\n    22,\n    22,\n    23,\n    23\n  ],\n  \"source/core/output_buffers/ut_output_table_buffer.tpb\" : [\n    19,\n    25,\n    25,\n    44,\n    44,\n    54,\n    54,\n    73,\n    73,\n    94,\n    94\n  ],\n  \"source/core/output_buffers/ut_output_table_buffer.tps\" : [\n    19,\n    20,\n    20,\n    21,\n    21,\n    22,\n    22,\n    23,\n    23,\n    24,\n    24\n  ],\n  \"source/core/session_context/ut_session_context.pkb\" : [\n    20,\n    20,\n    25\n  ],\n  \"source/core/session_context/ut_session_context.pks\" : [\n    22,\n    22,\n    27\n  ],\n  \"source/core/session_context/ut_session_info.tpb\" : [\n    141,\n    141\n  ],\n  \"source/core/session_context/ut_session_info.tps\" : [\n    46,\n    46\n  ],\n  \"source/core/types/ut_console_reporter_base.tpb\" : [\n    19,\n    24,\n    29,\n    34,\n    39\n  ],\n  \"source/core/types/ut_console_reporter_base.tps\" : [\n    18,\n    20,\n    22,\n    24,\n    26\n  ],\n  \"source/core/types/ut_coverage_options.tpb\" : [\n    21,\n    22,\n    23,\n    24,\n    25,\n    26,\n    27,\n    28,\n    29,\n    31,\n    31\n  ],\n  \"source/core/types/ut_coverage_options.tps\" : [\n    30,\n    31,\n    32,\n    33,\n    34,\n    35,\n    36,\n    37,\n    38\n  ],\n  \"source/core/types/ut_executable.tpb\" : [\n    20,\n    20,\n    21,\n    21,\n    32\n  ],\n  \"source/core/types/ut_executable.tps\" : [\n    32,\n    32,\n    32,\n    32,\n    33\n  ],\n  \"source/core/types/ut_executable_test.tpb\" : [\n    20,\n    20,\n    21,\n    21,\n    59,\n    96\n  ],\n  \"source/core/types/ut_executable_test.tps\" : [\n    19,\n    19,\n    20,\n    20\n  ],\n  \"source/core/types/ut_expectation_result.tpb\" : [\n    20,\n    21,\n    21,\n    21\n  ],\n  \"source/core/types/ut_expectation_result.tps\" : [\n    37,\n    38,\n    38,\n    38\n  ],\n  \"source/core/types/ut_logical_suite.tpb\" : [\n    31,\n    31,\n    78\n  ],\n  \"source/core/types/ut_logical_suite.tps\" : [\n    25,\n    25,\n    28\n  ],\n  \"source/core/types/ut_object_name.tpb\" : [\n    18,\n    18,\n    25\n  ],\n  \"source/core/types/ut_object_name.tps\" : [\n    20,\n    20,\n    21\n  ],\n  \"source/core/types/ut_output_reporter_base.tpb\" : [\n    24,\n    24,\n    31,\n    37,\n    44,\n    44,\n    49,\n    49,\n    54,\n    54,\n    59,\n    59,\n    66,\n    66,\n    71,\n    71\n  ],\n  \"source/core/types/ut_output_reporter_base.tps\" : [\n    20,\n    20,\n    21,\n    22,\n    24,\n    24,\n    25,\n    25,\n    26,\n    26,\n    28,\n    28,\n    29,\n    29,\n    30,\n    30\n  ],\n  \"source/core/types/ut_path_item.tpb\" : [\n    18,\n    18,\n    18,\n    26,\n    26,\n    33,\n    33,\n    33,\n    33\n  ],\n  \"source/core/types/ut_path_item.tps\" : [\n    22,\n    22,\n    22,\n    23,\n    23,\n    24,\n    24,\n    24,\n    24\n  ],\n  \"source/core/types/ut_reporter_base.tpb\" : [\n    19,\n    26,\n    167,\n    167\n  ],\n  \"source/core/types/ut_reporter_base.tps\" : [\n    19,\n    20,\n    78,\n    78\n  ],\n  \"source/core/types/ut_results_counter.tpb\" : [\n    28,\n    36,\n    45\n  ],\n  \"source/core/types/ut_results_counter.tps\" : [\n    24,\n    25,\n    26\n  ],\n  \"source/core/types/ut_run.tpb\" : [\n    21,\n    22,\n    23,\n    24,\n    25,\n    26,\n    27,\n    71,\n    71,\n    95\n  ],\n  \"source/core/types/ut_run.tps\" : [\n    31,\n    32,\n    33,\n    34,\n    35,\n    36,\n    37,\n    41,\n    41,\n    43\n  ],\n  \"source/core/types/ut_stack.tpb\" : [\n    37\n  ],\n  \"source/core/types/ut_stack.tps\" : [\n    22\n  ],\n  \"source/core/types/ut_suite.tpb\" : [\n    20,\n    20,\n    20,\n    21,\n    37,\n    87\n  ],\n  \"source/core/types/ut_suite.tps\" : [\n    30,\n    30,\n    30,\n    31,\n    34\n  ],\n  \"source/core/types/ut_suite_context.tpb\" : [\n    20,\n    20,\n    20,\n    20\n  ],\n  \"source/core/types/ut_suite_context.tps\" : [\n    19,\n    19,\n    19,\n    19\n  ],\n  \"source/core/types/ut_suite_item.tpb\" : [\n    19,\n    19,\n    19,\n    19,\n    37,\n    37,\n    63,\n    94,\n    101,\n    101,\n    101,\n    116\n  ],\n  \"source/core/types/ut_suite_item.tps\" : [\n    71,\n    71,\n    71,\n    71,\n    74,\n    74,\n    77,\n    79,\n    88,\n    91,\n    92,\n    92,\n    92\n  ],\n  \"source/core/types/ut_test.tpb\" : [\n    20,\n    20,\n    20,\n    21,\n    21,\n    21,\n    119,\n    130\n  ],\n  \"source/core/types/ut_test.tps\" : [\n    59,\n    59,\n    59,\n    60,\n    60,\n    60,\n    65,\n    66\n  ],\n  \"source/core/ut_expectation_processor.pkb\" : [\n    36,\n    80,\n    151,\n    160,\n    164,\n    168,\n    177,\n    204,\n    210,\n    210\n  ],\n  \"source/core/ut_expectation_processor.pks\" : [\n    25,\n    35,\n    49,\n    51,\n    53,\n    53\n  ],\n  \"source/core/ut_file_mapper.pkb\" : [\n    25,\n    52,\n    53,\n    54,\n    55,\n    56,\n    57,\n    67,\n    68,\n    69,\n    70,\n    71,\n    72,\n    73\n  ],\n  \"source/core/ut_file_mapper.pks\" : [\n    27,\n    28,\n    29,\n    30,\n    31,\n    32,\n    36,\n    37,\n    38,\n    39,\n    40,\n    41,\n    42\n  ],\n  \"source/core/ut_metadata.pkb\" : [\n    24,\n    24,\n    24,\n    37,\n    55,\n    72,\n    72,\n    72,\n    103,\n    146,\n    156,\n    174,\n    174,\n    183,\n    183,\n    202,\n    222,\n    222,\n    273,\n    315\n  ],\n  \"source/core/ut_metadata.pks\" : [\n    52,\n    52,\n    52,\n    58,\n    64,\n    70,\n    70,\n    70,\n    83,\n    99,\n    111,\n    121,\n    121,\n    126,\n    131,\n    131,\n    136,\n    136,\n    151,\n    166\n  ],\n  \"source/core/ut_suite_builder.pkb\" : [\n    99,\n    100,\n    121,\n    135,\n    136,\n    137,\n    138,\n    148,\n    162,\n    163,\n    188,\n    190,\n    239,\n    255,\n    256,\n    257,\n    258,\n    304,\n    305,\n    306,\n    322,\n    323,\n    324,\n    325,\n    351,\n    352,\n    429,\n    430,\n    455,\n    456,\n    457,\n    469,\n    492,\n    520,\n    588,\n    589,\n    604,\n    627,\n    641,\n    642,\n    643,\n    690,\n    802,\n    820,\n    838,\n    864\n  ],\n  \"source/core/ut_suite_builder.pks\" : [\n    27\n  ],\n  \"source/core/ut_suite_cache_manager.pkb\" : [\n    71,\n    90,\n    128,\n    200,\n    235,\n    276,\n    288,\n    299,\n    300,\n    301,\n    302,\n    411,\n    431,\n    438,\n    453,\n    466,\n    467,\n    468\n  ],\n  \"source/core/ut_suite_cache_manager.pks\" : [\n    27,\n    28,\n    29,\n    30,\n    36,\n    41,\n    50,\n    58,\n    69,\n    73,\n    77,\n    86,\n    95,\n    96,\n    97\n  ],\n  \"source/core/ut_suite_manager.pkb\" : [\n    42,\n    107,\n    139,\n    140,\n    141,\n    142,\n    143,\n    255,\n    301,\n    329,\n    330,\n    353,\n    354,\n    355,\n    356,\n    377,\n    384,\n    385,\n    427,\n    449,\n    451,\n    452,\n    470,\n    471,\n    472,\n    473,\n    474,\n    475,\n    494,\n    494,\n    511,\n    518,\n    518,\n    526,\n    528,\n    529,\n    567,\n    599,\n    600,\n    601\n  ],\n  \"source/core/ut_suite_manager.pks\" : [\n    33,\n    33,\n    43,\n    43,\n    63,\n    71,\n    72,\n    73,\n    74,\n    75,\n    76,\n    86,\n    99,\n    100,\n    101\n  ],\n  \"source/core/ut_suite_tag_filter.pkb\" : [\n    53,\n    206,\n    224,\n    225,\n    274,\n    275\n  ],\n  \"source/core/ut_suite_tag_filter.pks\" : [\n    46,\n    50,\n    51\n  ],\n  \"source/core/ut_utils.pkb\" : [\n    28,\n    28,\n    33,\n    51,\n    67,\n    76,\n    90,\n    91,\n    110,\n    111,\n    132,\n    133,\n    153,\n    158,\n    163,\n    168,\n    173,\n    178,\n    183,\n    188,\n    194,\n    199,\n    204,\n    204,\n    204,\n    233,\n    233,\n    233,\n    246,\n    246,\n    246,\n    291,\n    291,\n    305,\n    305,\n    319,\n    319,\n    333,\n    333,\n    342,\n    342,\n    342,\n    362,\n    373,\n    386,\n    399,\n    409,\n    429,\n    429,\n    444,\n    454,\n    464,\n    477,\n    477,\n    484,\n    484,\n    509,\n    533,\n    533,\n    584,\n    589,\n    589,\n    596,\n    601,\n    612,\n    612,\n    661,\n    750,\n    777,\n    777,\n    795,\n    803,\n    820,\n    831,\n    846,\n    860,\n    860,\n    860,\n    875,\n    875,\n    875,\n    880,\n    880,\n    880,\n    885,\n    885,\n    891,\n    891,\n    897,\n    897,\n    928,\n    937,\n    971,\n    999\n  ],\n  \"source/core/ut_utils.pks\" : [\n    166,\n    168,\n    177,\n    179,\n    182,\n    183,\n    188,\n    189,\n    194,\n    195,\n    199,\n    201,\n    203,\n    205,\n    207,\n    209,\n    211,\n    213,\n    215,\n    217,\n    236,\n    236,\n    236,\n    255,\n    255,\n    255,\n    274,\n    274,\n    274,\n    276,\n    276,\n    278,\n    278,\n    280,\n    280,\n    285,\n    285,\n    290,\n    290,\n    290,\n    301,\n    306,\n    311,\n    316,\n    321,\n    323,\n    323,\n    325,\n    327,\n    329,\n    331,\n    331,\n    333,\n    333,\n    342,\n    375,\n    377,\n    377,\n    383,\n    389,\n    408,\n    413,\n    418,\n    418,\n    423,\n    429,\n    435,\n    440,\n    440,\n    440,\n    442,\n    442,\n    442,\n    444,\n    444,\n    444,\n    452,\n    452,\n    457,\n    457,\n    462,\n    462,\n    468,\n    473,\n    478,\n    483\n  ],\n  \"source/expectations/data_values/ut_compound_data_helper.pkb\" : [\n    75,\n    76,\n    77,\n    129,\n    129,\n    154,\n    154,\n    181,\n    181,\n    203,\n    203,\n    225,\n    252,\n    253,\n    254,\n    321,\n    322,\n    323,\n    324,\n    325,\n    346,\n    397,\n    412,\n    412,\n    413,\n    413,\n    413,\n    414,\n    414,\n    414,\n    415,\n    563,\n    563,\n    563,\n    568,\n    568,\n    583,\n    600,\n    629,\n    629,\n    636,\n    644,\n    644,\n    644,\n    649,\n    649,\n    664,\n    674,\n    674,\n    745,\n    745,\n    745,\n    763,\n    775,\n    788\n  ],\n  \"source/expectations/data_values/ut_compound_data_helper.pks\" : [\n    83,\n    83,\n    83,\n    87,\n    87,\n    88,\n    88,\n    88,\n    89,\n    89,\n    89,\n    90,\n    93,\n    93,\n    93,\n    96,\n    97,\n    98,\n    99,\n    100,\n    103,\n    103,\n    105,\n    111,\n    115,\n    115,\n    117,\n    119,\n    119,\n    119,\n    121,\n    121,\n    126,\n    128,\n    128,\n    130,\n    130,\n    130,\n    132,\n    135,\n    137\n  ],\n  \"source/expectations/data_values/ut_cursor_column.tpb\" : [\n    5,\n    5,\n    6,\n    6,\n    6,\n    6,\n    7,\n    7,\n    7,\n    8,\n    58,\n    58,\n    59,\n    59,\n    59,\n    59,\n    60,\n    60,\n    61\n  ],\n  \"source/expectations/data_values/ut_cursor_column.tps\" : [\n    38,\n    38,\n    39,\n    39,\n    39,\n    39,\n    40,\n    40,\n    41,\n    44,\n    44,\n    45,\n    45,\n    45,\n    45,\n    46,\n    46,\n    47\n  ],\n  \"source/expectations/data_values/ut_cursor_details.tpb\" : [\n    3,\n    3,\n    18,\n    152,\n    167,\n    228\n  ],\n  \"source/expectations/data_values/ut_cursor_details.tps\" : [\n    26,\n    26,\n    29,\n    35,\n    36,\n    37\n  ],\n  \"source/expectations/data_values/ut_data_value.tpb\" : [\n    18,\n    33,\n    33,\n    48,\n    48\n  ],\n  \"source/expectations/data_values/ut_data_value.tps\" : [\n    25,\n    25,\n    26,\n    29,\n    29,\n    30\n  ],\n  \"source/expectations/data_values/ut_data_value_anydata.tpb\" : [\n    24,\n    39,\n    62,\n    101,\n    111,\n    119,\n    120,\n    121,\n    122\n  ],\n  \"source/expectations/data_values/ut_data_value_anydata.tps\" : [\n    20,\n    21,\n    22,\n    23,\n    24,\n    26,\n    27,\n    28,\n    29\n  ],\n  \"source/expectations/data_values/ut_data_value_blob.tpb\" : [\n    19,\n    47\n  ],\n  \"source/expectations/data_values/ut_data_value_blob.tps\" : [\n    19,\n    24\n  ],\n  \"source/expectations/data_values/ut_data_value_boolean.tpb\" : [\n    19,\n    38\n  ],\n  \"source/expectations/data_values/ut_data_value_boolean.tps\" : [\n    19,\n    22\n  ],\n  \"source/expectations/data_values/ut_data_value_clob.tpb\" : [\n    19,\n    47\n  ],\n  \"source/expectations/data_values/ut_data_value_clob.tps\" : [\n    19,\n    24\n  ],\n  \"source/expectations/data_values/ut_data_value_date.tpb\" : [\n    19,\n    38\n  ],\n  \"source/expectations/data_values/ut_data_value_date.tps\" : [\n    19,\n    22\n  ],\n  \"source/expectations/data_values/ut_data_value_dsinterval.tpb\" : [\n    19,\n    38\n  ],\n  \"source/expectations/data_values/ut_data_value_dsinterval.tps\" : [\n    19,\n    22\n  ],\n  \"source/expectations/data_values/ut_data_value_json.tpb\" : [\n    19,\n    29,\n    35,\n    57,\n    57,\n    68,\n    79,\n    131,\n    138\n  ],\n  \"source/expectations/data_values/ut_data_value_json.tps\" : [\n    20,\n    21,\n    22,\n    26,\n    26,\n    27,\n    28,\n    28\n  ],\n  \"source/expectations/data_values/ut_data_value_number.tpb\" : [\n    19,\n    38\n  ],\n  \"source/expectations/data_values/ut_data_value_number.tps\" : [\n    19,\n    22\n  ],\n  \"source/expectations/data_values/ut_data_value_refcursor.tpb\" : [\n    19,\n    26,\n    75,\n    135,\n    135,\n    155,\n    171,\n    171,\n    191,\n    191,\n    298,\n    304,\n    305,\n    306,\n    307,\n    315,\n    316,\n    317\n  ],\n  \"source/expectations/data_values/ut_data_value_refcursor.tps\" : [\n    38,\n    39,\n    40,\n    42,\n    42,\n    43,\n    45,\n    46,\n    47,\n    48\n  ],\n  \"source/expectations/data_values/ut_data_value_timestamp.tpb\" : [\n    19,\n    38\n  ],\n  \"source/expectations/data_values/ut_data_value_timestamp.tps\" : [\n    19,\n    22\n  ],\n  \"source/expectations/data_values/ut_data_value_timestamp_ltz.tpb\" : [\n    19,\n    38\n  ],\n  \"source/expectations/data_values/ut_data_value_timestamp_ltz.tps\" : [\n    19,\n    22\n  ],\n  \"source/expectations/data_values/ut_data_value_timestamp_tz.tpb\" : [\n    19,\n    38\n  ],\n  \"source/expectations/data_values/ut_data_value_timestamp_tz.tps\" : [\n    19,\n    22\n  ],\n  \"source/expectations/data_values/ut_data_value_varchar2.tpb\" : [\n    19,\n    38\n  ],\n  \"source/expectations/data_values/ut_data_value_varchar2.tps\" : [\n    19,\n    23\n  ],\n  \"source/expectations/data_values/ut_data_value_xmltype.tpb\" : [\n    19,\n    38\n  ],\n  \"source/expectations/data_values/ut_data_value_xmltype.tps\" : [\n    19,\n    22\n  ],\n  \"source/expectations/data_values/ut_data_value_yminterval.tpb\" : [\n    19,\n    38\n  ],\n  \"source/expectations/data_values/ut_data_value_yminterval.tps\" : [\n    19,\n    22\n  ],\n  \"source/expectations/data_values/ut_json_leaf.tpb\" : [\n    4,\n    4,\n    4,\n    5,\n    5,\n    5,\n    6,\n    6,\n    6,\n    21,\n    21,\n    21,\n    22,\n    22,\n    22,\n    23,\n    23,\n    23\n  ],\n  \"source/expectations/data_values/ut_json_leaf.tps\" : [\n    32,\n    32,\n    32,\n    33,\n    33,\n    33,\n    34,\n    34,\n    34,\n    37,\n    37,\n    37,\n    38,\n    38,\n    38,\n    39,\n    39,\n    39\n  ],\n  \"source/expectations/data_values/ut_json_tree_details.tpb\" : [\n    3,\n    22,\n    22,\n    40,\n    40,\n    60,\n    61,\n    62,\n    63,\n    64,\n    65,\n    66,\n    67,\n    68,\n    69,\n    83,\n    84,\n    85,\n    86,\n    136,\n    137,\n    138,\n    139,\n    186,\n    196\n  ],\n  \"source/expectations/data_values/ut_json_tree_details.tps\" : [\n    19,\n    20,\n    20,\n    21,\n    21,\n    24,\n    25,\n    26,\n    27,\n    28,\n    29,\n    32,\n    33,\n    37,\n    38,\n    39,\n    40,\n    44,\n    45,\n    46,\n    47,\n    49,\n    51\n  ],\n  \"source/expectations/data_values/ut_key_anyvalues.tpb\" : [\n    24,\n    31,\n    31,\n    36,\n    36,\n    41,\n    41,\n    46,\n    46,\n    51,\n    51,\n    56,\n    56,\n    60,\n    60,\n    65,\n    65,\n    70,\n    70,\n    75,\n    75,\n    80,\n    80,\n    85,\n    85\n  ],\n  \"source/expectations/data_values/ut_key_anyvalues.tps\" : [\n    20,\n    21,\n    21,\n    22,\n    22,\n    23,\n    23,\n    24,\n    24,\n    25,\n    25,\n    26,\n    26,\n    27,\n    27,\n    28,\n    28,\n    29,\n    29,\n    30,\n    30,\n    31,\n    31,\n    32,\n    32\n  ],\n  \"source/expectations/matchers/ut_be_between.tpb\" : [\n    19,\n    19,\n    26,\n    26,\n    32,\n    32,\n    38,\n    38,\n    44,\n    44,\n    50,\n    50,\n    56,\n    56,\n    63,\n    63,\n    70,\n    70,\n    77,\n    94,\n    101\n  ],\n  \"source/expectations/matchers/ut_be_between.tps\" : [\n    20,\n    20,\n    21,\n    21,\n    23,\n    23,\n    25,\n    25,\n    27,\n    27,\n    29,\n    29,\n    31,\n    31,\n    33,\n    33,\n    35,\n    35,\n    37,\n    38,\n    39\n  ],\n  \"source/expectations/matchers/ut_be_empty.tpb\" : [\n    30\n  ],\n  \"source/expectations/matchers/ut_be_empty.tps\" : [\n    20\n  ],\n  \"source/expectations/matchers/ut_be_false.tpb\" : [\n    25\n  ],\n  \"source/expectations/matchers/ut_be_false.tps\" : [\n    19\n  ],\n  \"source/expectations/matchers/ut_be_greater_or_equal.tpb\" : [\n    19,\n    25,\n    31,\n    37,\n    43,\n    49,\n    55,\n    61,\n    67,\n    78,\n    83\n  ],\n  \"source/expectations/matchers/ut_be_greater_or_equal.tps\" : [\n    18,\n    19,\n    20,\n    21,\n    22,\n    23,\n    24,\n    25,\n    26,\n    27,\n    28\n  ],\n  \"source/expectations/matchers/ut_be_greater_than.tpb\" : [\n    19,\n    25,\n    31,\n    37,\n    43,\n    49,\n    55,\n    61,\n    67,\n    78,\n    83\n  ],\n  \"source/expectations/matchers/ut_be_greater_than.tps\" : [\n    18,\n    19,\n    20,\n    21,\n    22,\n    23,\n    24,\n    25,\n    26,\n    27,\n    28\n  ],\n  \"source/expectations/matchers/ut_be_less_or_equal.tpb\" : [\n    19,\n    25,\n    31,\n    37,\n    43,\n    49,\n    55,\n    61,\n    67,\n    78,\n    83\n  ],\n  \"source/expectations/matchers/ut_be_less_or_equal.tps\" : [\n    18,\n    19,\n    20,\n    21,\n    22,\n    23,\n    24,\n    25,\n    26,\n    27,\n    28\n  ],\n  \"source/expectations/matchers/ut_be_less_than.tpb\" : [\n    19,\n    25,\n    31,\n    37,\n    44,\n    51,\n    58,\n    65,\n    72,\n    83,\n    88\n  ],\n  \"source/expectations/matchers/ut_be_less_than.tps\" : [\n    18,\n    19,\n    20,\n    21,\n    22,\n    23,\n    24,\n    25,\n    26,\n    27,\n    28\n  ],\n  \"source/expectations/matchers/ut_be_like.tpb\" : [\n    27,\n    50,\n    62\n  ],\n  \"source/expectations/matchers/ut_be_like.tps\" : [\n    21,\n    22,\n    23\n  ],\n  \"source/expectations/matchers/ut_be_not_null.tpb\" : [\n    25\n  ],\n  \"source/expectations/matchers/ut_be_not_null.tps\" : [\n    19\n  ],\n  \"source/expectations/matchers/ut_be_null.tpb\" : [\n    25\n  ],\n  \"source/expectations/matchers/ut_be_null.tps\" : [\n    19\n  ],\n  \"source/expectations/matchers/ut_be_true.tpb\" : [\n    25\n  ],\n  \"source/expectations/matchers/ut_be_true.tps\" : [\n    19\n  ],\n  \"source/expectations/matchers/ut_be_within.tpb\" : [\n    19,\n    25,\n    31,\n    37,\n    48,\n    55,\n    66,\n    73,\n    84,\n    91,\n    102,\n    109,\n    126,\n    131\n  ],\n  \"source/expectations/matchers/ut_be_within.tps\" : [\n    20,\n    21,\n    22,\n    23,\n    24,\n    25,\n    26,\n    27,\n    28,\n    29,\n    30,\n    31,\n    32,\n    33\n  ],\n  \"source/expectations/matchers/ut_be_within_helper.pkb\" : [\n    20,\n    20,\n    20\n  ],\n  \"source/expectations/matchers/ut_be_within_helper.pks\" : [\n    20,\n    20,\n    20\n  ],\n  \"source/expectations/matchers/ut_be_within_pct.tpb\" : [\n    19,\n    25,\n    25,\n    31,\n    42,\n    49,\n    64,\n    69,\n    74\n  ],\n  \"source/expectations/matchers/ut_be_within_pct.tps\" : [\n    25,\n    26,\n    26,\n    27,\n    28,\n    29,\n    30,\n    31,\n    32\n  ],\n  \"source/expectations/matchers/ut_comparison_matcher.tpb\" : [\n    19\n  ],\n  \"source/expectations/matchers/ut_comparison_matcher.tps\" : [\n    20\n  ],\n  \"source/expectations/matchers/ut_contain.tpb\" : [\n    19,\n    26,\n    33,\n    48,\n    54,\n    67\n  ],\n  \"source/expectations/matchers/ut_contain.tps\" : [\n    26,\n    27,\n    28,\n    29,\n    30,\n    31\n  ],\n  \"source/expectations/matchers/ut_equal.tpb\" : [\n    19,\n    19,\n    19,\n    26,\n    26,\n    32,\n    32,\n    38,\n    38,\n    38,\n    50,\n    50,\n    50,\n    61,\n    61,\n    67,\n    67,\n    73,\n    73,\n    79,\n    79,\n    85,\n    85,\n    91,\n    91,\n    97,\n    97,\n    97,\n    108,\n    108,\n    108,\n    119,\n    119,\n    125,\n    125,\n    131,\n    131,\n    137,\n    137,\n    143,\n    143,\n    149,\n    149,\n    155,\n    155,\n    161,\n    161,\n    167,\n    174,\n    181,\n    186,\n    193,\n    200,\n    207,\n    212,\n    233,\n    241,\n    249,\n    254,\n    286,\n    304,\n    324\n  ],\n  \"source/expectations/matchers/ut_equal.tps\" : [\n    25,\n    25,\n    25,\n    26,\n    26,\n    27,\n    27,\n    28,\n    28,\n    28,\n    29,\n    29,\n    29,\n    30,\n    30,\n    31,\n    31,\n    32,\n    32,\n    33,\n    33,\n    34,\n    34,\n    35,\n    35,\n    36,\n    36,\n    36,\n    37,\n    37,\n    37,\n    38,\n    38,\n    39,\n    39,\n    40,\n    40,\n    41,\n    41,\n    42,\n    42,\n    43,\n    43,\n    44,\n    44,\n    45,\n    45,\n    46,\n    47,\n    48,\n    49,\n    50,\n    51,\n    52,\n    53,\n    56,\n    57,\n    58,\n    59,\n    60,\n    61,\n    62\n  ],\n  \"source/expectations/matchers/ut_have_count.tpb\" : [\n    19,\n    26,\n    39,\n    46\n  ],\n  \"source/expectations/matchers/ut_have_count.tps\" : [\n    21,\n    22,\n    23,\n    24\n  ],\n  \"source/expectations/matchers/ut_match.tpb\" : [\n    27,\n    40,\n    52\n  ],\n  \"source/expectations/matchers/ut_match.tps\" : [\n    21,\n    22,\n    23\n  ],\n  \"source/expectations/matchers/ut_matcher.tpb\" : [\n    19,\n    26,\n    46,\n    55,\n    60\n  ],\n  \"source/expectations/matchers/ut_matcher.tps\" : [\n    31,\n    32,\n    36,\n    37,\n    38\n  ],\n  \"source/expectations/matchers/ut_matcher_options_items.tpb\" : [\n    25,\n    38\n  ],\n  \"source/expectations/matchers/ut_matcher_options_items.tps\" : [\n    25,\n    26\n  ],\n  \"source/expectations/ut_expectation.tpb\" : [\n    69,\n    69,\n    74,\n    74,\n    74,\n    85,\n    85,\n    85,\n    96,\n    96,\n    101,\n    101,\n    106,\n    106,\n    111,\n    111,\n    116,\n    116,\n    121,\n    121,\n    126,\n    126,\n    126,\n    135,\n    135,\n    135,\n    144,\n    144,\n    149,\n    149,\n    154,\n    154,\n    159,\n    159,\n    164,\n    164,\n    169,\n    169,\n    174,\n    174,\n    179,\n    179,\n    184,\n    184,\n    189,\n    189,\n    189,\n    198,\n    198,\n    198,\n    207,\n    207,\n    212,\n    212,\n    217,\n    217,\n    222,\n    222,\n    227,\n    227,\n    232,\n    232,\n    237,\n    237,\n    237,\n    246,\n    246,\n    246,\n    255,\n    255,\n    260,\n    260,\n    265,\n    265,\n    270,\n    270,\n    275,\n    275,\n    280,\n    280,\n    285,\n    285,\n    314,\n    314,\n    319,\n    319,\n    324,\n    324,\n    329,\n    329,\n    334,\n    334,\n    339,\n    339,\n    344,\n    344,\n    349,\n    349,\n    355,\n    360,\n    365,\n    370,\n    375,\n    380,\n    385,\n    390,\n    395,\n    400,\n    405,\n    410,\n    415,\n    420,\n    426,\n    431,\n    436,\n    441,\n    446,\n    451,\n    456,\n    462,\n    467,\n    472,\n    477,\n    482,\n    487,\n    492,\n    498,\n    498,\n    503,\n    503,\n    508,\n    508,\n    513,\n    513,\n    518,\n    518,\n    523,\n    523,\n    528,\n    528,\n    533,\n    533,\n    539,\n    544,\n    549,\n    554,\n    559,\n    564,\n    569,\n    575,\n    580,\n    585,\n    590,\n    595,\n    600,\n    605,\n    611,\n    616,\n    621,\n    626,\n    631,\n    636,\n    641,\n    647,\n    652,\n    657,\n    662,\n    667,\n    672,\n    677,\n    682,\n    687,\n    692,\n    697,\n    702,\n    710,\n    718,\n    726,\n    734,\n    742,\n    750,\n    758\n  ],\n  \"source/expectations/ut_expectation.tps\" : [\n    34,\n    34,\n    35,\n    35,\n    35,\n    36,\n    36,\n    36,\n    37,\n    37,\n    38,\n    38,\n    39,\n    39,\n    40,\n    40,\n    41,\n    41,\n    42,\n    42,\n    43,\n    43,\n    43,\n    44,\n    44,\n    44,\n    45,\n    45,\n    46,\n    46,\n    47,\n    47,\n    48,\n    48,\n    49,\n    49,\n    50,\n    50,\n    51,\n    51,\n    52,\n    52,\n    54,\n    54,\n    55,\n    55,\n    55,\n    56,\n    56,\n    56,\n    57,\n    57,\n    58,\n    58,\n    59,\n    59,\n    60,\n    60,\n    61,\n    61,\n    62,\n    62,\n    63,\n    63,\n    63,\n    64,\n    64,\n    64,\n    65,\n    65,\n    66,\n    66,\n    67,\n    67,\n    68,\n    68,\n    69,\n    69,\n    70,\n    70,\n    71,\n    71,\n    81,\n    81,\n    82,\n    82,\n    83,\n    83,\n    84,\n    84,\n    85,\n    85,\n    86,\n    86,\n    87,\n    87,\n    88,\n    88,\n    90,\n    91,\n    92,\n    93,\n    94,\n    95,\n    96,\n    98,\n    99,\n    100,\n    101,\n    102,\n    103,\n    104,\n    106,\n    107,\n    108,\n    109,\n    110,\n    111,\n    112,\n    114,\n    115,\n    116,\n    117,\n    118,\n    119,\n    120,\n    122,\n    122,\n    123,\n    123,\n    124,\n    124,\n    125,\n    125,\n    126,\n    126,\n    127,\n    127,\n    128,\n    128,\n    129,\n    129,\n    131,\n    132,\n    133,\n    134,\n    135,\n    136,\n    137,\n    139,\n    140,\n    141,\n    142,\n    143,\n    144,\n    145,\n    147,\n    148,\n    149,\n    150,\n    151,\n    152,\n    153,\n    155,\n    156,\n    157,\n    158,\n    159,\n    160,\n    161,\n    163,\n    164,\n    165,\n    166,\n    168,\n    169,\n    170,\n    171,\n    172,\n    173,\n    174,\n    175\n  ],\n  \"source/expectations/ut_expectation_base.tpb\" : [\n    18,\n    33\n  ],\n  \"source/expectations/ut_expectation_base.tps\" : [\n    22,\n    23\n  ],\n  \"source/expectations/ut_expectation_compound.tpb\" : [\n    19,\n    19,\n    26,\n    31,\n    37,\n    37,\n    45,\n    45,\n    53,\n    53,\n    61,\n    61,\n    69,\n    77,\n    85,\n    93\n  ],\n  \"source/expectations/ut_expectation_compound.tps\" : [\n    20,\n    20,\n    22,\n    23,\n    25,\n    25,\n    26,\n    26,\n    27,\n    27,\n    28,\n    28,\n    29,\n    30,\n    31,\n    32\n  ],\n  \"source/expectations/ut_expectation_json.tpb\" : [\n    19,\n    19,\n    26,\n    26,\n    33,\n    33,\n    40,\n    45\n  ],\n  \"source/expectations/ut_expectation_json.tps\" : [\n    20,\n    20,\n    22,\n    22,\n    23,\n    23,\n    24,\n    25\n  ],\n  \"source/reporters/ut_ansiconsole_helper.pkb\" : [\n    25,\n    30,\n    30,\n    39,\n    44,\n    49,\n    54\n  ],\n  \"source/reporters/ut_ansiconsole_helper.pks\" : [\n    18,\n    20,\n    22,\n    24,\n    26\n  ],\n  \"source/reporters/ut_coverage_cobertura_reporter.tpb\" : [\n    37,\n    82,\n    83\n  ],\n  \"source/reporters/ut_coverage_html_reporter.tpb\" : [\n    21,\n    22\n  ],\n  \"source/reporters/ut_coverage_html_reporter.tps\" : [\n    22,\n    23\n  ],\n  \"source/reporters/ut_coverage_report_html_helper.pkb\" : [\n    38,\n    68,\n    68,\n    73,\n    86,\n    86,\n    91,\n    96,\n    105,\n    106,\n    107,\n    110,\n    121,\n    132,\n    132,\n    132,\n    132,\n    218,\n    229,\n    229,\n    284,\n    285,\n    286,\n    287,\n    288\n  ],\n  \"source/reporters/ut_coverage_report_html_helper.pks\" : [\n    20,\n    20,\n    22,\n    26,\n    28,\n    30,\n    30,\n    32,\n    35,\n    36,\n    37,\n    38,\n    39\n  ],\n  \"source/reporters/ut_coverage_sonar_reporter.tpb\" : [\n    30,\n    60,\n    61\n  ],\n  \"source/reporters/ut_coveralls_reporter.tpb\" : [\n    29,\n    62\n  ],\n  \"source/reporters/ut_debug_reporter.tpb\" : [\n    32,\n    32,\n    71\n  ],\n  \"source/reporters/ut_debug_reporter.tps\" : [\n    29,\n    29,\n    31\n  ],\n  \"source/reporters/ut_documentation_reporter.tpb\" : [\n    32,\n    32,\n    47,\n    47,\n    58,\n    64,\n    101,\n    115,\n    126,\n    144\n  ],\n  \"source/reporters/ut_documentation_reporter.tps\" : [\n    23,\n    23,\n    24,\n    24,\n    25,\n    26,\n    29\n  ],\n  \"source/reporters/ut_junit_reporter.tpb\" : [\n    30,\n    30,\n    35,\n    79,\n    143,\n    149\n  ],\n  \"source/reporters/ut_junit_reporter.tps\" : [\n    26,\n    27\n  ],\n  \"source/reporters/ut_sonar_test_reporter.tpb\" : [\n    29,\n    29,\n    45,\n    65,\n    65\n  ],\n  \"source/reporters/ut_teamcity_reporter.tpb\" : [\n    63,\n    63,\n    71,\n    71\n  ],\n  \"source/reporters/ut_teamcity_reporter_helper.pkb\" : [\n    27,\n    52,\n    52,\n    59,\n    59,\n    67,\n    67,\n    67,\n    81,\n    81,\n    81,\n    90,\n    90,\n    90,\n    100,\n    100,\n    100,\n    100,\n    100,\n    116\n  ],\n  \"source/reporters/ut_teamcity_reporter_helper.pks\" : [\n    19,\n    19,\n    20,\n    20,\n    22,\n    22,\n    22,\n    23,\n    23,\n    23,\n    24,\n    24,\n    24,\n    25,\n    25,\n    25,\n    25,\n    25,\n    26\n  ],\n  \"source/reporters/ut_tfs_junit_reporter.tpb\" : [\n    33,\n    43,\n    49,\n    49,\n    54,\n    90,\n    156\n  ],\n  \"source/uninstall_objects.sql\" : [\n    3,\n    3\n  ],\n  \"test/ut3_tester/core/annotations/test_annotation_cache.pkb\" : [\n    3,\n    17,\n    30,\n    43,\n    58,\n    76,\n    97,\n    110,\n    126,\n    143\n  ],\n  \"test/ut3_tester/core/annotations/test_annotation_manager.pkb\" : [\n    3,\n    97,\n    117\n  ],\n  \"test/ut3_tester/core/annotations/test_before_after_annotations.pkb\" : [\n    8,\n    8,\n    13\n  ],\n  \"test/ut3_tester/core/annotations/test_before_after_annotations.pks\" : [\n    9,\n    9,\n    11\n  ],\n  \"test/ut3_tester/core/test_output_buffer.pkb\" : [\n    125\n  ],\n  \"test/ut3_tester/core/test_suite_builder.pkb\" : [\n    4,\n    5\n  ],\n  \"test/ut3_tester/core/test_ut_test.pkb\" : [\n    297\n  ],\n  \"test/ut3_tester/core/test_ut_utils.pkb\" : [\n    14,\n    36,\n    36,\n    36,\n    36,\n    234,\n    234,\n    234\n  ],\n  \"test/ut3_tester_helper/annotation_cache_helper.pkb\" : [\n    121,\n    136,\n    162\n  ],\n  \"test/ut3_tester_helper/annotation_cache_helper.pks\" : [\n    18\n  ],\n  \"test/ut3_tester_helper/coverage_helper.pkb\" : [\n    23,\n    23,\n    286,\n    286,\n    293,\n    293,\n    308,\n    338,\n    338,\n    367,\n    391,\n    445,\n    486\n  ],\n  \"test/ut3_tester_helper/coverage_helper.pks\" : [\n    7,\n    7,\n    23,\n    23,\n    24,\n    24,\n    26,\n    27,\n    28\n  ],\n  \"test/ut3_tester_helper/expectations_helper.pkb\" : [\n    4,\n    5,\n    6,\n    21,\n    22,\n    23,\n    24,\n    36,\n    37,\n    38,\n    39,\n    40\n  ],\n  \"test/ut3_tester_helper/expectations_helper.pks\" : [\n    4,\n    5,\n    6,\n    10,\n    11,\n    12,\n    13,\n    17,\n    18,\n    19,\n    20,\n    21\n  ],\n  \"test/ut3_tester_helper/main_helper.pkb\" : [\n    22,\n    31,\n    38,\n    94,\n    129,\n    134,\n    139,\n    144\n  ],\n  \"test/ut3_tester_helper/main_helper.pks\" : [\n    6,\n    8,\n    10,\n    28,\n    38,\n    40,\n    42,\n    44\n  ],\n  \"test/ut3_tester_helper/run_helper.pkb\" : [\n    688,\n    693,\n    693,\n    698,\n    698,\n    703,\n    703,\n    703,\n    713,\n    720,\n    720,\n    720,\n    732,\n    732,\n    740,\n    740,\n    748,\n    748,\n    760,\n    760,\n    765,\n    765,\n    765,\n    770,\n    770,\n    770,\n    775,\n    775,\n    782,\n    782,\n    782,\n    790,\n    790,\n    790,\n    798,\n    798,\n    798,\n    890,\n    891,\n    903,\n    904,\n    905\n  ],\n  \"test/ut3_tester_helper/run_helper.pks\" : [\n    31,\n    32,\n    32,\n    33,\n    33,\n    34,\n    34,\n    35,\n    36,\n    37,\n    37,\n    38,\n    39,\n    39,\n    41,\n    41,\n    43,\n    43,\n    46,\n    46,\n    47,\n    47,\n    47,\n    48,\n    48,\n    48,\n    49,\n    49,\n    50,\n    50,\n    50,\n    52,\n    52,\n    52,\n    55,\n    55,\n    55,\n    67,\n    68,\n    72,\n    73,\n    74\n  ],\n  \"test/ut3_user/api/test_ut_runner.pkb\" : [\n    41,\n    123,\n    123\n  ],\n  \"test/ut3_user/expectations/binary/test_be_greater_or_equal.pkb\" : [\n    9,\n    10,\n    11,\n    20,\n    21,\n    22\n  ],\n  \"test/ut3_user/expectations/binary/test_be_greater_than.pkb\" : [\n    9,\n    10,\n    11,\n    20,\n    21,\n    22\n  ],\n  \"test/ut3_user/expectations/binary/test_be_less_or_equal.pkb\" : [\n    9,\n    10,\n    11,\n    20,\n    21,\n    22\n  ],\n  \"test/ut3_user/expectations/binary/test_equal.pkb\" : [\n    14,\n    15,\n    16,\n    17,\n    18,\n    19,\n    34,\n    35,\n    36,\n    37,\n    38,\n    48,\n    49,\n    50,\n    51,\n    59,\n    60,\n    61,\n    62,\n    63,\n    73,\n    74,\n    75,\n    76,\n    77,\n    87,\n    88,\n    89,\n    90\n  ],\n  \"test/ut3_user/expectations/binary/test_expect_to_be_less_than.pkb\" : [\n    9,\n    10,\n    11,\n    20,\n    21,\n    22\n  ],\n  \"test/ut3_user/expectations/binary/test_to_be_within.pkb\" : [\n    9,\n    10,\n    11,\n    12,\n    13,\n    14,\n    15,\n    16,\n    34,\n    35,\n    36,\n    37,\n    38,\n    39,\n    40,\n    52,\n    53,\n    54,\n    55,\n    56,\n    57,\n    58\n  ],\n  \"test/ut3_user/expectations/binary/test_to_be_within_pct.pkb\" : [\n    9,\n    10,\n    11,\n    12,\n    13,\n    14,\n    15,\n    16,\n    34,\n    35,\n    36,\n    37,\n    38,\n    39,\n    40,\n    41,\n    42,\n    59,\n    60,\n    61,\n    62,\n    63,\n    64,\n    65,\n    66,\n    79,\n    80,\n    81,\n    82,\n    83,\n    84,\n    85,\n    86,\n    87\n  ],\n  \"test/ut3_user/expectations/test_matchers.pkb\" : [\n    8,\n    8,\n    8,\n    8,\n    8,\n    8,\n    27,\n    27,\n    27,\n    27,\n    27,\n    47,\n    47,\n    47,\n    47,\n    47,\n    47,\n    67,\n    67,\n    67,\n    67,\n    67,\n    67,\n    87,\n    87,\n    87,\n    87,\n    87,\n    87\n  ],\n  \"test/ut3_user/reporters.pkb\" : [\n    161,\n    162,\n    177\n  ],\n  \"test/ut3_user/reporters.pks\" : [\n    13,\n    14,\n    18\n  ],\n  \"test/ut3_user/reporters/test_coverage/test_coverage_standalone.pkb\" : [\n    3,\n    3,\n    3\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL3/FunctionWithOutParameterCheck.json",
    "content": "{\n  \"source/core/annotations/ut_annotation_parser.pkb\" : [\n    134\n  ],\n  \"source/core/types/ut_executable.tpb\" : [\n    47,\n    47\n  ],\n  \"source/core/types/ut_executable.tps\" : [\n    40,\n    40\n  ],\n  \"source/core/types/ut_executable_test.tpb\" : [\n    42,\n    42,\n    49\n  ],\n  \"source/core/types/ut_executable_test.tps\" : [\n    29,\n    29\n  ],\n  \"source/core/types/ut_logical_suite.tpb\" : [\n    39\n  ],\n  \"source/core/types/ut_logical_suite.tps\" : [\n    26\n  ],\n  \"source/core/types/ut_run.tpb\" : [\n    47\n  ],\n  \"source/core/types/ut_run.tps\" : [\n    40\n  ],\n  \"source/core/types/ut_stack.tpb\" : [\n    26,\n    50\n  ],\n  \"source/core/types/ut_stack.tps\" : [\n    21,\n    24\n  ],\n  \"source/core/types/ut_suite.tpb\" : [\n    33\n  ],\n  \"source/core/types/ut_suite.tps\" : [\n    33\n  ],\n  \"source/core/types/ut_suite_item.tps\" : [\n    85\n  ],\n  \"source/core/types/ut_test.tpb\" : [\n    50\n  ],\n  \"source/core/types/ut_test.tps\" : [\n    63\n  ],\n  \"source/core/ut_suite_builder.pkb\" : [\n    689\n  ],\n  \"source/core/ut_suite_manager.pkb\" : [\n    52\n  ],\n  \"source/expectations/matchers/ut_be_between.tpb\" : [\n    77\n  ],\n  \"source/expectations/matchers/ut_be_between.tps\" : [\n    37\n  ],\n  \"source/expectations/matchers/ut_be_empty.tpb\" : [\n    30\n  ],\n  \"source/expectations/matchers/ut_be_empty.tps\" : [\n    20\n  ],\n  \"source/expectations/matchers/ut_be_false.tpb\" : [\n    25\n  ],\n  \"source/expectations/matchers/ut_be_false.tps\" : [\n    19\n  ],\n  \"source/expectations/matchers/ut_be_greater_or_equal.tpb\" : [\n    67\n  ],\n  \"source/expectations/matchers/ut_be_greater_or_equal.tps\" : [\n    26\n  ],\n  \"source/expectations/matchers/ut_be_greater_than.tpb\" : [\n    67\n  ],\n  \"source/expectations/matchers/ut_be_greater_than.tps\" : [\n    26\n  ],\n  \"source/expectations/matchers/ut_be_less_or_equal.tpb\" : [\n    67\n  ],\n  \"source/expectations/matchers/ut_be_less_or_equal.tps\" : [\n    26\n  ],\n  \"source/expectations/matchers/ut_be_less_than.tpb\" : [\n    72\n  ],\n  \"source/expectations/matchers/ut_be_less_than.tps\" : [\n    26\n  ],\n  \"source/expectations/matchers/ut_be_like.tpb\" : [\n    27\n  ],\n  \"source/expectations/matchers/ut_be_like.tps\" : [\n    21\n  ],\n  \"source/expectations/matchers/ut_be_not_null.tpb\" : [\n    25\n  ],\n  \"source/expectations/matchers/ut_be_not_null.tps\" : [\n    19\n  ],\n  \"source/expectations/matchers/ut_be_null.tpb\" : [\n    25\n  ],\n  \"source/expectations/matchers/ut_be_null.tps\" : [\n    19\n  ],\n  \"source/expectations/matchers/ut_be_true.tpb\" : [\n    25\n  ],\n  \"source/expectations/matchers/ut_be_true.tps\" : [\n    19\n  ],\n  \"source/expectations/matchers/ut_be_within.tpb\" : [\n    109\n  ],\n  \"source/expectations/matchers/ut_be_within.tps\" : [\n    31\n  ],\n  \"source/expectations/matchers/ut_be_within_pct.tpb\" : [\n    49\n  ],\n  \"source/expectations/matchers/ut_be_within_pct.tps\" : [\n    29\n  ],\n  \"source/expectations/matchers/ut_contain.tpb\" : [\n    33,\n    48\n  ],\n  \"source/expectations/matchers/ut_contain.tps\" : [\n    28,\n    29\n  ],\n  \"source/expectations/matchers/ut_equal.tpb\" : [\n    286\n  ],\n  \"source/expectations/matchers/ut_equal.tps\" : [\n    60\n  ],\n  \"source/expectations/matchers/ut_have_count.tpb\" : [\n    26\n  ],\n  \"source/expectations/matchers/ut_have_count.tps\" : [\n    22\n  ],\n  \"source/expectations/matchers/ut_match.tpb\" : [\n    27\n  ],\n  \"source/expectations/matchers/ut_match.tps\" : [\n    21\n  ],\n  \"source/expectations/matchers/ut_matcher.tpb\" : [\n    19,\n    26\n  ],\n  \"source/expectations/matchers/ut_matcher.tps\" : [\n    31,\n    32\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL3/IdenticalExpressionCheck.json",
    "content": "{\n  \"source/uninstall_objects.sql\" : [\n    407\n  ],\n  \"source/uninstall_synonyms.sql\" : [\n    43\n  ],\n  \"test/ut3_user/expectations/unary/test_expect_to_be_true_false.pkb\" : [\n    20,\n    60,\n    93,\n    117\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL3/InequalityUsageCheck.json",
    "content": "{\n  \"development/utplsql_style_check.sql\" : [\n    28,\n    45\n  ],\n  \"examples/award_bonus/test_award_bonus.pkg\" : [\n    53\n  ],\n  \"source/api/ut.pkb\" : [\n    225\n  ],\n  \"source/check_sys_grants.sql\" : [\n    8,\n    10\n  ],\n  \"source/core/annotations/ut_annotation_manager.pkb\" : [\n    149\n  ],\n  \"source/core/annotations/ut_annotation_parser.pkb\" : [\n    78\n  ],\n  \"source/core/output_buffers/ut_output_buffer_base.tpb\" : [\n    42,\n    51\n  ],\n  \"source/core/output_buffers/ut_output_bulk_buffer.tpb\" : [\n    57\n  ],\n  \"source/core/output_buffers/ut_output_clob_table_buffer.tpb\" : [\n    48\n  ],\n  \"source/core/output_buffers/ut_output_table_buffer.tpb\" : [\n    57\n  ],\n  \"source/core/types/ut_executable.tpb\" : [\n    94,\n    97,\n    170\n  ],\n  \"source/core/ut_suite_cache_manager.pkb\" : [\n    153\n  ],\n  \"source/core/ut_suite_manager.pkb\" : [\n    315\n  ],\n  \"source/core/ut_utils.pkb\" : [\n    849\n  ],\n  \"source/expectations/data_values/ut_compound_data_helper.pkb\" : [\n    682,\n    688,\n    724\n  ],\n  \"source/expectations/data_values/ut_cursor_details.tpb\" : [\n    178\n  ],\n  \"source/expectations/data_values/ut_data_value_json.tpb\" : [\n    124\n  ],\n  \"source/expectations/data_values/ut_data_value_refcursor.tpb\" : [\n    291\n  ],\n  \"source/expectations/matchers/ut_have_count.tpb\" : [\n    29\n  ],\n  \"source/reporters/ut_documentation_reporter.tpb\" : [\n    89,\n    96\n  ],\n  \"source/reporters/ut_junit_reporter.tpb\" : [\n    43\n  ],\n  \"source/reporters/ut_tfs_junit_reporter.tpb\" : [\n    131\n  ],\n  \"source/uninstall_synonyms.sql\" : [\n    14\n  ],\n  \"test/install_ut3_tester_helper.sql\" : [\n    53\n  ],\n  \"test/install_ut3_tester_tests.sql\" : [\n    63\n  ],\n  \"test/install_ut3_user_tests.sql\" : [\n    115\n  ],\n  \"test/ut3_tester_helper/main_helper.pkb\" : [\n    10,\n    13\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL3/InsertWithoutColumnsCheck.json",
    "content": "{\n  \"examples/award_bonus/employees_test.sql\" : [\n    2,\n    3,\n    4,\n    6\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL3/ParsingErrorCheck.json",
    "content": "{\n  \"development/mystats/mystats.sql\" : [\n    425\n  ],\n  \"source/core/annotations/ut_annotation_cache.sql\" : [\n    24\n  ],\n  \"source/core/annotations/ut_annotation_cache_info.sql\" : [\n    21\n  ],\n  \"source/core/annotations/ut_annotation_cache_schema.sql\" : [\n    20\n  ],\n  \"source/core/output_buffers/ut_output_buffer_info_tmp.sql\" : [\n    23\n  ],\n  \"source/core/output_buffers/ut_output_buffer_tmp.sql\" : [\n    30\n  ],\n  \"source/core/ut_savepoint_seq.sql\" : [\n    15\n  ],\n  \"source/core/ut_suite_cache.sql\" : [\n    15\n  ],\n  \"source/core/ut_suite_cache_package.sql\" : [\n    20\n  ],\n  \"source/core/ut_suite_cache_schema.sql\" : [\n    18\n  ],\n  \"source/create_grants.sql\" : [\n    38\n  ],\n  \"source/create_synonyms.sql\" : [\n    54\n  ],\n  \"source/create_utplsql_owner.sql\" : [\n    30\n  ],\n  \"source/define_ut3_owner_param.sql\" : [\n    49\n  ],\n  \"source/install.sql\" : [\n    37\n  ],\n  \"source/install_ddl_trigger.sql\" : [\n    22\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL3/QueryWithoutExceptionHandlingCheck.json",
    "content": "{\n  \"examples/award_bonus/award_bonus.sql\" : [\n    8\n  ],\n  \"source/api/ut.pkb\" : [\n    810\n  ],\n  \"source/check_sys_grants.sql\" : [\n    16\n  ],\n  \"source/core/coverage/dbms_plssqlcode.sql\" : [\n    4,\n    31,\n    50\n  ],\n  \"source/core/coverage/proftab.sql\" : [\n    4,\n    33,\n    64,\n    96\n  ],\n  \"source/core/coverage/ut_coverage_runs.sql\" : [\n    4\n  ],\n  \"source/core/output_buffers/ut_output_buffer_base.tpb\" : [\n    27\n  ],\n  \"source/core/output_buffers/ut_output_bulk_buffer.tpb\" : [\n    106\n  ],\n  \"source/core/ut_dbms_output_cache.sql\" : [\n    22\n  ],\n  \"source/core/ut_metadata.pkb\" : [\n    126,\n    160\n  ],\n  \"source/core/ut_suite_cache_manager.pkb\" : [\n    291,\n    321,\n    473,\n    482,\n    490\n  ],\n  \"source/core/ut_suite_manager.pkb\" : [\n    613\n  ],\n  \"source/core/ut_suite_tag_filter.pkb\" : [\n    62,\n    68\n  ],\n  \"source/core/ut_utils.pkb\" : [\n    654\n  ],\n  \"source/expectations/data_values/ut_cursor_details.tpb\" : [\n    6,\n    146,\n    231,\n    243\n  ],\n  \"source/reporters/ut_debug_reporter.tpb\" : [\n    74\n  ],\n  \"source/uninstall_coverage_tables.sql\" : [\n    23\n  ],\n  \"source/uninstall_objects.sql\" : [\n    6\n  ],\n  \"test/ut3_tester/core/annotations/test_annotation_manager.pkb\" : [\n    102,\n    154,\n    374,\n    408,\n    443\n  ],\n  \"test/ut3_tester/core/test_output_buffer.pkb\" : [\n    23,\n    31,\n    85,\n    119,\n    177,\n    195\n  ],\n  \"test/ut3_tester/core/test_suite_builder.pkb\" : [\n    33\n  ],\n  \"test/ut3_tester/core/test_ut_utils.pkb\" : [\n    10,\n    271\n  ],\n  \"test/ut3_tester_helper/other_dummy_object.tps\" : [\n    4\n  ],\n  \"test/ut3_tester_helper/run_helper.pkb\" : [\n    164\n  ],\n  \"test/ut3_tester_helper/test_dummy_dble_nest_lst_obj.tps\" : [\n    4\n  ],\n  \"test/ut3_tester_helper/test_dummy_double_nested_list.tps\" : [\n    4\n  ],\n  \"test/ut3_tester_helper/test_dummy_double_nested_object.tps\" : [\n    4\n  ],\n  \"test/ut3_tester_helper/test_dummy_nested_object.tps\" : [\n    4\n  ],\n  \"test/ut3_tester_helper/test_dummy_nested_object_list.tps\" : [\n    4\n  ],\n  \"test/ut3_tester_helper/test_dummy_number.tps\" : [\n    4\n  ],\n  \"test/ut3_tester_helper/test_dummy_object.tps\" : [\n    4\n  ],\n  \"test/ut3_tester_helper/test_dummy_object_list.tps\" : [\n    4\n  ],\n  \"test/ut3_tester_helper/test_event_object.tps\" : [\n    4\n  ],\n  \"test/ut3_tester_helper/test_nested_tab_varray.tps\" : [\n    4\n  ],\n  \"test/ut3_tester_helper/test_tab_varchar2.tps\" : [\n    4\n  ],\n  \"test/ut3_tester_helper/test_tab_varray.tps\" : [\n    4\n  ],\n  \"test/ut3_tester_helper/ut_test_table.sql\" : [\n    4\n  ],\n  \"test/ut3_user/api/test_ut_run.pkb\" : [\n    829\n  ],\n  \"test/ut3_user/expectations/test_expectations_cursor.pkb\" : [\n    1972,\n    1975,\n    1996,\n    1999,\n    2020,\n    2023,\n    2046,\n    2049,\n    2081,\n    2084\n  ],\n  \"test/ut3_user/reporters/test_junit_reporter.pkb\" : [\n    142\n  ],\n  \"test/ut3_user/reporters/test_realtime_reporter.pkb\" : [\n    254,\n    264,\n    275,\n    336,\n    350,\n    371,\n    388,\n    406,\n    423,\n    440,\n    456,\n    495,\n    513\n  ],\n  \"test/ut3_user/reporters/test_tfs_junit_reporter.pkb\" : [\n    198\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL3/RaiseStandardExceptionCheck.json",
    "content": "{\n  \"examples/remove_rooms_by_name/remove_rooms_by_name.sql\" : [\n    4\n  ],\n  \"source/api/ut.pkb\" : [\n    223\n  ],\n  \"source/expectations/data_values/ut_data_value.tpb\" : [\n    30\n  ],\n  \"source/expectations/data_values/ut_data_value_anydata.tpb\" : [\n    127,\n    138\n  ],\n  \"source/expectations/data_values/ut_data_value_boolean.tpb\" : [\n    52\n  ],\n  \"source/expectations/data_values/ut_data_value_date.tpb\" : [\n    52\n  ],\n  \"source/expectations/data_values/ut_data_value_json.tpb\" : [\n    101\n  ],\n  \"source/expectations/data_values/ut_data_value_number.tpb\" : [\n    52\n  ],\n  \"source/expectations/data_values/ut_data_value_refcursor.tpb\" : [\n    206,\n    361\n  ],\n  \"source/expectations/data_values/ut_data_value_timestamp.tpb\" : [\n    52\n  ],\n  \"source/expectations/data_values/ut_data_value_timestamp_ltz.tpb\" : [\n    52\n  ],\n  \"source/expectations/data_values/ut_data_value_timestamp_tz.tpb\" : [\n    52\n  ],\n  \"source/expectations/data_values/ut_data_value_varchar2.tpb\" : [\n    52\n  ],\n  \"test/ut3_tester/core/test_ut_executable.pkb\" : [\n    74\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL3/SameBranchCheck.json",
    "content": "{\n  \"source/core/ut_suite_tag_filter.pkb\" : [\n    124\n  ],\n  \"source/core/ut_utils.pkb\" : [\n    812\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL3/SelectAllColumnsCheck.json",
    "content": "{\n  \"examples/award_bonus/test_award_bonus.pkg\" : [\n    40,\n    53\n  ],\n  \"examples/remove_rooms_by_name/test_remove_rooms_by_name.pkg\" : [\n    52,\n    56,\n    64,\n    74,\n    83,\n    93\n  ],\n  \"source/core/annotations/ut_annotation_cache_manager.pkb\" : [\n    142\n  ],\n  \"source/core/output_buffers/ut_output_clob_table_buffer.tpb\" : [\n    80\n  ],\n  \"source/core/output_buffers/ut_output_table_buffer.tpb\" : [\n    115\n  ],\n  \"source/core/ut_suite_cache_manager.pkb\" : [\n    133,\n    172,\n    174,\n    176,\n    178\n  ],\n  \"source/core/ut_suite_manager.pkb\" : [\n    20,\n    372\n  ],\n  \"source/core/ut_utils.pkb\" : [\n    771\n  ],\n  \"test/ut3_tester/core/annotations/test_annot_disabled_reason.pkb\" : [\n    350,\n    373,\n    397,\n    422,\n    441,\n    466\n  ],\n  \"test/ut3_tester/core/annotations/test_annot_throws_exception.pkb\" : [\n    254\n  ],\n  \"test/ut3_tester/core/annotations/test_annotation_cache.pkb\" : [\n    8\n  ],\n  \"test/ut3_tester/core/annotations/test_annotation_manager.pkb\" : [\n    199,\n    209,\n    235\n  ],\n  \"test/ut3_tester/core/annotations/test_before_after_annotations.pkb\" : [\n    203,\n    218,\n    229,\n    242,\n    254,\n    267,\n    275,\n    294\n  ],\n  \"test/ut3_tester/core/test_output_buffer.pkb\" : [\n    53\n  ],\n  \"test/ut3_tester/core/test_suite_manager.pkb\" : [\n    1214,\n    1220,\n    1257,\n    1728,\n    1734,\n    1747\n  ],\n  \"test/ut3_tester/core/test_ut_test.pkb\" : [\n    305,\n    717\n  ],\n  \"test/ut3_tester_helper/main_helper.pkb\" : [\n    34\n  ],\n  \"test/ut3_tester_helper/run_helper.pkb\" : [\n    716,\n    723,\n    736,\n    744,\n    752,\n    778,\n    786,\n    794,\n    875,\n    896,\n    910\n  ],\n  \"test/ut3_user/api/test_ut_run.pkb\" : [\n    401,\n    416,\n    426,\n    470,\n    532,\n    558,\n    584,\n    630,\n    689,\n    754,\n    836,\n    856,\n    861,\n    876,\n    887,\n    889,\n    1085,\n    1431\n  ],\n  \"test/ut3_user/api/test_ut_runner.pkb\" : [\n    145,\n    151,\n    186,\n    288,\n    320,\n    342,\n    374,\n    399,\n    508,\n    521,\n    534,\n    547,\n    560,\n    574,\n    593\n  ],\n  \"test/ut3_user/expectations/test_expectations_cursor.pkb\" : [\n    113,\n    114,\n    157,\n    169,\n    181,\n    193,\n    205,\n    227,\n    239,\n    252,\n    1014,\n    2849,\n    2932\n  ],\n  \"test/ut3_user/expectations/unary/test_expect_to_be_empty.pkb\" : [\n    11,\n    22,\n    35,\n    52,\n    63\n  ],\n  \"test/ut3_user/expectations/unary/test_expect_to_have_count.pkb\" : [\n    12,\n    23,\n    36,\n    51,\n    62\n  ],\n  \"test/ut3_user/reporters.pkb\" : [\n    168,\n    183\n  ],\n  \"test/ut3_user/reporters/test_coverage/test_coverage_standalone.pkb\" : [\n    53\n  ],\n  \"test/ut3_user/reporters/test_debug_reporter.pkb\" : [\n    8\n  ],\n  \"test/ut3_user/reporters/test_documentation_reporter.pkb\" : [\n    47\n  ],\n  \"test/ut3_user/reporters/test_junit_reporter.pkb\" : [\n    84,\n    100,\n    114,\n    128,\n    147,\n    162,\n    189,\n    211,\n    274,\n    303\n  ],\n  \"test/ut3_user/reporters/test_sonar_test_reporter.pkb\" : [\n    18\n  ],\n  \"test/ut3_user/reporters/test_teamcity_reporter.pkb\" : [\n    102,\n    120,\n    138,\n    158,\n    180\n  ],\n  \"test/ut3_user/reporters/test_tfs_junit_reporter.pkb\" : [\n    137,\n    151,\n    165,\n    178,\n    203,\n    223,\n    248,\n    270,\n    292\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL3/ToDateWithoutFormatCheck.json",
    "content": "{\n  \"examples/RunWithDocumentationReporter.sql\" : [\n    45\n  ],\n  \"test/ut3_user/expectations/test_expectations_cursor.pkb\" : [\n    442\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL3/UnhandledUserDefinedExceptionCheck.json",
    "content": "{\n  \"examples/award_bonus/award_bonus.sql\" : [\n    13\n  ],\n  \"source/api/ut.pkb\" : [\n    117\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL3/UnnecessaryAliasInQueryCheck.json",
    "content": "{\n  \"source/check_sys_grants.sql\" : [\n    29,\n    30,\n    34\n  ],\n  \"source/core/annotations/ut_annotation_cache_manager.pkb\" : [\n    24,\n    37,\n    51,\n    73,\n    76,\n    84,\n    131,\n    144,\n    156,\n    167,\n    192,\n    193\n  ],\n  \"source/core/coverage/ut_coverage_helper.pkb\" : [\n    67,\n    78\n  ],\n  \"source/core/coverage/ut_coverage_helper_profiler.pkb\" : [\n    65,\n    66,\n    69\n  ],\n  \"source/core/output_buffers/ut_output_buffer_base.tpb\" : [\n    61,\n    150\n  ],\n  \"source/core/output_buffers/ut_output_bulk_buffer.tpb\" : [\n    107,\n    127\n  ],\n  \"source/core/output_buffers/ut_output_clob_table_buffer.tpb\" : [\n    82,\n    89\n  ],\n  \"source/core/ut_metadata.pkb\" : [\n    162\n  ],\n  \"source/core/ut_suite_cache_manager.pkb\" : [\n    31,\n    42,\n    43,\n    52,\n    54,\n    65,\n    79,\n    138,\n    138,\n    148,\n    148,\n    157,\n    157,\n    165,\n    207,\n    248,\n    253,\n    259,\n    293,\n    311,\n    315,\n    323,\n    329,\n    339,\n    350,\n    378,\n    404,\n    418,\n    422,\n    459,\n    476,\n    485,\n    493\n  ],\n  \"source/core/ut_suite_manager.pkb\" : [\n    318,\n    615,\n    618\n  ],\n  \"source/core/ut_utils.pkb\" : [\n    356,\n    770\n  ],\n  \"source/expectations/data_values/ut_compound_data_helper.pkb\" : [\n    768\n  ],\n  \"source/expectations/data_values/ut_cursor_details.tpb\" : [\n    190,\n    203\n  ],\n  \"source/uninstall_synonyms.sql\" : [\n    13,\n    15,\n    42\n  ],\n  \"test/install_ut3_tester_helper.sql\" : [\n    66\n  ],\n  \"test/install_ut3_user_tests.sql\" : [\n    128\n  ],\n  \"test/ut3_tester/core/test_ut_utils.pkb\" : [\n    10\n  ],\n  \"test/ut3_user/expectations/test_expectations_cursor.pkb\" : [\n    455,\n    456,\n    469,\n    470,\n    482,\n    483,\n    495,\n    496,\n    511,\n    512,\n    550,\n    551,\n    564,\n    565,\n    578,\n    579,\n    606,\n    607,\n    1042,\n    1267,\n    1268,\n    1290,\n    1291,\n    1315,\n    1316,\n    1338,\n    1339,\n    1361,\n    1362,\n    1383,\n    1384,\n    1508,\n    1509,\n    1522,\n    1523,\n    1536,\n    1537,\n    1550,\n    1551,\n    1564,\n    1565,\n    1578,\n    1579,\n    1592,\n    1593,\n    2265,\n    2266,\n    2279,\n    2280,\n    2293,\n    2294,\n    2307,\n    2308,\n    2443,\n    2444,\n    2456,\n    2457,\n    2469,\n    2470,\n    2482,\n    2483,\n    2495,\n    2497,\n    2498,\n    2513,\n    2514,\n    2515\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL3/UnnecessaryElseCheck.json",
    "content": "{\n  \"examples/award_bonus/award_bonus.sql\" : [\n    14\n  ],\n  \"source/core/output_buffers/ut_output_buffer_base.tpb\" : [\n    77,\n    95\n  ],\n  \"source/core/ut_suite_manager.pkb\" : [\n    31\n  ],\n  \"source/core/ut_utils.pkb\" : [\n    346\n  ],\n  \"source/expectations/data_values/ut_data_value_anydata.tpb\" : [\n    137\n  ],\n  \"source/expectations/data_values/ut_data_value_refcursor.tpb\" : [\n    196\n  ],\n  \"source/reporters/ut_ansiconsole_helper.pkb\" : [\n    34\n  ],\n  \"test/install_ut3_tester_helper.sql\" : [\n    62\n  ],\n  \"test/install_ut3_tester_tests.sql\" : [\n    72\n  ],\n  \"test/install_ut3_user_tests.sql\" : [\n    124\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL3/UnnecessaryLikeCheck.json",
    "content": "{\n  \"development/utplsql_style_check.sql\" : [\n    41,\n    58\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL3/UnnecessaryNullStatementCheck.json",
    "content": "{\n  \"source/expectations/json_objects_specs.sql\" : [\n    2\n  ],\n  \"source/uninstall_objects.sql\" : [\n    257\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL3/UnusedParameterCheck.json",
    "content": "{\n  \"source/core/output_buffers/ut_output_buffer_base.tpb\" : [\n    38\n  ],\n  \"source/core/session_context/ut_session_info.tpb\" : [\n    35,\n    83,\n    100,\n    107\n  ],\n  \"source/core/types/ut_reporter_base.tpb\" : [\n    42,\n    48,\n    53,\n    57,\n    62,\n    66,\n    72,\n    77,\n    81,\n    86,\n    90,\n    95,\n    99,\n    104,\n    110,\n    114,\n    119,\n    123,\n    128,\n    134\n  ],\n  \"source/core/ut_suite_manager.pkb\" : [\n    518\n  ],\n  \"source/expectations/data_values/ut_data_value.tpb\" : [\n    33,\n    33\n  ],\n  \"source/expectations/data_values/ut_data_value_json.tpb\" : [\n    138\n  ],\n  \"source/expectations/data_values/ut_json_tree_details.tpb\" : [\n    186\n  ],\n  \"source/reporters/ut_tfs_junit_reporter.tpb\" : [\n    156\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL3/UnusedVariableCheck.json",
    "content": "{\n  \"source/core/types/ut_logical_suite.tpb\" : [\n    40,\n    41\n  ],\n  \"source/expectations/data_values/ut_data_value_refcursor.tpb\" : [\n    32\n  ],\n  \"source/expectations/matchers/ut_be_empty.tpb\" : [\n    31\n  ],\n  \"source/expectations/matchers/ut_contain.tpb\" : [\n    68\n  ],\n  \"source/expectations/matchers/ut_equal.tpb\" : [\n    39,\n    325\n  ],\n  \"source/reporters/ut_coverage_cobertura_reporter.tpb\" : [\n    29,\n    86,\n    92\n  ],\n  \"source/reporters/ut_coverage_report_html_helper.pkb\" : [\n    27\n  ],\n  \"source/reporters/ut_tfs_junit_reporter.tpb\" : [\n    97\n  ],\n  \"test/ut3_tester/core/annotations/test_annotation_cache.pkb\" : [\n    19,\n    32,\n    45,\n    60,\n    78,\n    99,\n    112,\n    128,\n    145\n  ],\n  \"test/ut3_tester/core/annotations/test_annotation_manager.pkb\" : [\n    100,\n    118,\n    217,\n    218\n  ],\n  \"test/ut3_tester/core/expectations/test_expectation_processor.pkb\" : [\n    7,\n    45,\n    72\n  ],\n  \"test/ut3_tester/core/test_output_buffer.pkb\" : [\n    46,\n    62,\n    63\n  ],\n  \"test/ut3_tester/core/test_suite_manager.pkb\" : [\n    730,\n    822,\n    852,\n    1840,\n    2193\n  ],\n  \"test/ut3_tester/core/test_ut_test.pkb\" : [\n    10\n  ],\n  \"test/ut3_tester/core/test_ut_utils.pkb\" : [\n    220\n  ],\n  \"test/ut3_tester_helper/run_helper.pkb\" : [\n    184\n  ],\n  \"test/ut3_user/api/test_ut_run.pkb\" : [\n    582,\n    1000\n  ],\n  \"test/ut3_user/api/test_ut_runner.pkb\" : [\n    418\n  ],\n  \"test/ut3_user/expectations/test_expectation_anydata.pkb\" : [\n    220,\n    221,\n    367,\n    368,\n    693,\n    813,\n    832,\n    833,\n    1193,\n    1194\n  ],\n  \"test/ut3_user/expectations/test_expectations_cursor.pkb\" : [\n    761,\n    762,\n    1129,\n    1130,\n    1727,\n    1728,\n    1794,\n    1795,\n    1901,\n    1902\n  ],\n  \"test/ut3_user/expectations/test_expectations_json.pkb\" : [\n    10,\n    232,\n    233,\n    268,\n    269,\n    301,\n    302,\n    1720,\n    1721,\n    1756,\n    1757\n  ],\n  \"test/ut3_user/reporters/test_coverage/test_extended_coverage.pkb\" : [\n    302\n  ],\n  \"test/ut3_user/reporters/test_coverage/test_html_coverage_reporter.pkb\" : [\n    80\n  ],\n  \"test/ut3_user/reporters/test_junit_reporter.pkb\" : [\n    282,\n    283\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL3/VariableHidingCheck.json",
    "content": "{\n  \"source/core/types/ut_executable.tpb\" : [\n    89\n  ],\n  \"source/expectations/data_values/ut_data_value_refcursor.tpb\" : [\n    174,\n    320\n  ],\n  \"test/ut3_user/reporters/test_realtime_reporter.pkb\" : [\n    487\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL3/VariableInitializationWithFunctionCallCheck.json",
    "content": "{\n  \"examples/custom_reporters/ut_expectations_reporter.tpb\" : [\n    87\n  ],\n  \"examples/developer_examples/RunExampleTestSuiteWithCompositeReporter.sql\" : [\n    16,\n    17\n  ],\n  \"source/api/ut_runner.pkb\" : [\n    244\n  ],\n  \"source/check_object_grants.sql\" : [\n    13\n  ],\n  \"source/core/annotations/ut_annotation_manager.pkb\" : [\n    30,\n    62,\n    104,\n    259\n  ],\n  \"source/core/output_buffers/ut_output_buffer_base.tpb\" : [\n    145\n  ],\n  \"source/core/output_buffers/ut_output_bulk_buffer.tpb\" : [\n    91\n  ],\n  \"source/core/output_buffers/ut_output_clob_table_buffer.tpb\" : [\n    56\n  ],\n  \"source/core/output_buffers/ut_output_table_buffer.tpb\" : [\n    95\n  ],\n  \"source/core/types/ut_stack.tpb\" : [\n    51\n  ],\n  \"source/core/ut_file_mapper.pkb\" : [\n    75,\n    76,\n    77,\n    78,\n    79\n  ],\n  \"source/core/ut_metadata.pkb\" : [\n    58,\n    73,\n    104,\n    158\n  ],\n  \"source/core/ut_suite_builder.pkb\" : [\n    356,\n    609\n  ],\n  \"source/core/ut_suite_cache_manager.pkb\" : [\n    306,\n    307\n  ],\n  \"source/core/ut_suite_manager.pkb\" : [\n    56,\n    431,\n    605,\n    606,\n    607\n  ],\n  \"source/core/ut_suite_tag_filter.pkb\" : [\n    55,\n    229\n  ],\n  \"source/core/ut_utils.pkb\" : [\n    25,\n    95,\n    115,\n    137,\n    207,\n    248,\n    293,\n    307,\n    321,\n    672\n  ],\n  \"source/core/ut_utils.pks\" : [\n    132\n  ],\n  \"source/expectations/data_values/ut_compound_data_helper.pkb\" : [\n    132,\n    157,\n    417,\n    418,\n    419,\n    746\n  ],\n  \"source/expectations/data_values/ut_cursor_details.tpb\" : [\n    252\n  ],\n  \"source/expectations/data_values/ut_data_value_json.tpb\" : [\n    36\n  ],\n  \"source/reporters/ut_coverage_report_html_helper.pkb\" : [\n    234\n  ],\n  \"source/reporters/ut_debug_reporter.tpb\" : [\n    33,\n    36\n  ],\n  \"source/reporters/ut_documentation_reporter.tpb\" : [\n    113\n  ],\n  \"test/ut3_tester/core/expectations/test_expectation_processor.pkb\" : [\n    3\n  ],\n  \"test/ut3_tester/core/test_output_buffer.pkb\" : [\n    80\n  ],\n  \"test/ut3_tester/core/test_suite_manager.pkb\" : [\n    459\n  ],\n  \"test/ut3_tester/core/test_ut_utils.pkb\" : [\n    5,\n    147,\n    219,\n    289,\n    438,\n    445,\n    452,\n    459,\n    466,\n    473,\n    480,\n    487\n  ],\n  \"test/ut3_tester_helper/coverage_helper.pkb\" : [\n    393,\n    449,\n    489\n  ],\n  \"test/ut3_user/api/test_ut_run.pkb\" : [\n    3\n  ],\n  \"test/ut3_user/expectations/test_expectations_cursor.pkb\" : [\n    3,\n    4,\n    6,\n    12\n  ],\n  \"test/ut3_user/reporters/test_coverage/test_coverage_standalone.pkb\" : [\n    42,\n    72\n  ],\n  \"test/ut3_user/reporters/test_realtime_reporter.pkb\" : [\n    511\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/expected/utPLSQL3/VariableInitializationWithNullCheck.json",
    "content": "{\n  \"source/core/coverage/ut_coverage.pks\" : [\n    41,\n    42,\n    43,\n    56,\n    57,\n    58,\n    59\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/README.md",
    "content": "This folder contains the PL/SQL code extracted from the Oracle Forms modulesavailable at https://github.com/Doag/Forms, under the MIT license.\n\nThe exact commit from the original repository can be verified in the its/sources/Doag-Forms folder.\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/ABOUT/ABOUT__ABOUT_BUTTON__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nbegin\n  show_webutil_information;\n\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/BROWSER/BROWSER__APPLET_PARAMS__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nbegin\n  get_applet_parameters;\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/BROWSER/BROWSER__BROWSER_MESSAGE__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nbegin\n  set_browser_message (:browser_mess_text);\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/BROWSER/BROWSER__SEPARATE_FRAME__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nbegin\n  separate_frame_options;\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/BUILTINS/BUILTINS__GET_FILE_NAME__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nbegin\n  get_client_filename;\n  If :builtins.file_name IS NOT NULL Then\n    Go_Item('builtins.read_image');\n  end if;\n  \nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/BUILTINS/BUILTINS__GET_TOOL_ENV__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nbegin\n  client_getenv;\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/BUILTINS/BUILTINS__READ_IMAGE__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nbegin\n  If :builtins.file_name IS NULL then\n    message ('Please enter image filename.');\n    GO_ITEM('builtins.filename');\n    SYNCHRONIZE;\n    RAISE FORM_TRIGGER_FAILURE;\n  End if;\n  client_readimage;\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/BUILTINS/BUILTINS__TEXT_IO_BUTTON__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nbegin\n  client_textio;\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/CLIENTINFO/CLIENTINFO__ACTION__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nbegin\n  get_clientinfo;\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/CLIENT_GETENV.pcd",
    "content": "PROCEDURE client_getenv IS\nBEGIN\n  client_tool_env.getvar('NLS_LANG',:builtins.tool_env);\n  SYNCHRONIZE;\n  \n  If :builtins.tool_env IS NULL Then\n    :builtins.tool_env := 'NLS_LANG is not set.';\n  End if;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/CLIENT_READIMAGE.pcd",
    "content": "PROCEDURE client_readimage IS\nBEGIN\n  client_image.read_image_file(:builtins.file_name, 'GIF', 'builtins.image');\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/CLIENT_TEXTIO.pcd",
    "content": "PROCEDURE client_textio IS\n  l_out_file  client_Text_IO.File_Type;\nBEGIN\n  l_out_file := client_Text_IO.Fopen(:global.user_home ||'\\helloworld.txt', 'w');\n  client_text_io.put_line(l_out_file, 'At '||TO_CHAR(SYSDATE,'HH24:MI')||' ' \n                                      ||webutil_clientinfo.get_user_name||' wrote:');\n  client_text_io.put_line(l_out_file, :builtins.text_io_item);\n  client_text_io.fclose (l_out_file);\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/CTL/CTL__ACKNOWLEDGE__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\n\n  show_window ('window1');\n  hide_window('w_hello');\n  go_block('clientinfo');\n  SYNCHRONIZE;\n  clear_message;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/CTL/CTL__EXIT10__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\ndo_key('exit');\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/CTL/CTL__EXIT1__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\ndo_key('exit');\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/CTL/CTL__EXIT2__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\ndo_key('exit');\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/CTL/CTL__EXIT3__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\ndo_key('exit');\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/CTL/CTL__EXIT4__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\ndo_key('exit');\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/CTL/CTL__EXIT5__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\ndo_key('exit');\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/CTL/CTL__EXIT6__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\ndo_key('exit');\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/CTL/CTL__EXIT7__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\ndo_key('exit');\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/CTL/CTL__EXIT8__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\ndo_key('exit');\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/CTL/CTL__EXIT9__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\ndo_key('exit');\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/C_API/C_API__CALL_C_API__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\n-- IMPORTANT\n-- Be sure to review the following My Oracle Support Note\n-- Doc ID: 285331.1 - \"Exception When Calling PASCAL style Function Via WebUTIL_C_API\"\n\ndeclare\n  \n  StringBuffer varchar2(255) := 'Text to overwrite';\n  StringLength pls_integer   := length(StringBuffer);\n  rc pls_integer;\n  \n  f_handle WEBUTIL_C_API.FUNCTIONHANDLE;\n  args Webutil_c_api.parameterlist;\n  param1 Webutil_c_api.ParameterHandle;\n  param2 Webutil_c_api.ParameterHandle;\n  \nbegin\n  f_handle := WEBUTIL_C_API.register_function('ffisamp.dll','PopulateString');\n  args := WEBUTIL_C_API.create_parameter_list;\n  param1 := WEBUTIL_C_API.add_parameter(args,WEBUTIL_C_API.C_CHAR_PTR\n                                            ,WEBUTIL_C_API.PARAM_INOUT\n                                            ,StringBuffer, 255);\n  param2 := WEBUTIL_C_API.add_parameter(args,WEBUTIL_C_API.C_INT_PTR\n                                            ,WEBUTIL_C_API.PARAM_INOUT\n                                            ,StringLength);    \n                                          \n  rc := WEBUTIL_C_API.Invoke_Int(  'ffisamp.dll','PopulateString',args);  \n  \n  \n  \n  message('The New value for String is: '||WEBUTIL_C_API.Get_Parameter_String(args,param1));\n  message('New Length '||to_char(WEBUTIL_C_API.Get_Parameter_Number(args,param2)));\n  message('RC was '||to_char(RC));  \n  \n  WEBUTIL_C_API.Destroy_Parameter_List(args);\n  WEBUTIL_C_API.Deregister_Function(f_handle);                                \nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/C_API/C_API__LOCKSTATION__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\n-- IMPORTANT\n-- Be sure to review the following My Oracle Support Note\n-- Doc ID: 285331.1 - \"Exception When Calling PASCAL style Function Via WebUTIL_C_API\"\n  \n  \ndeclare\n  \n  rc pls_integer;\n  f_handle WEBUTIL_C_API.FUNCTIONHANDLE;\n  args Webutil_c_api.parameterlist;\n\n  winSysDir varchar2(255) := Client_Win_API_ENVIRONMENT.Get_Windows_Directory || '\\system32\\';\n\n--- IMPORTANT ---\n-----------------\n--\n-- WEBUTIL_C_API CURRENTLY ONLY SUPPORTS CALLING C STYLE LIBRARIES, THEREFORE SOME WINDOWS LIBRARIES CANNOT BE CALLED.\n-- ADDITIONALLY, IT IS NOT RECOMMENDED THAT YOU ATTEMPT TO CALL WINDOWS FUNCTIONS WHICH REQUIRE ARGS.\n--\n-- USE EXTREME CAUTION WHEN CALLING WINDOWS APIS. \n-- BE SURE TO THOROUGHLY TEST BEFORE MOVING TO PRODUCTION\n-- LOOK CLOSELY AT BOTH STABILITY AND MEMORY USAGE AS SOME CALLS\n-- MAY RESULT IN THE APPEARANCE OF A MEMORY LEAK.\n\n------------------------------------------------------------------------------------------\n-- This call to USER32.DLL will reference the LOCKWORKSTATION function.\n-- If the current OS user does not have a password configured, the workstation may not lock.\n------------------------------------------------------------------------------------------\n\n-- The Windows LockWorkStation function requires no args to be passed in.\n-- WebUtil expects something to be passed in. So an empty paramlist will be created.\n\nbegin\n\nIf webutil_clientinfo.get_operating_system LIKE 'Win%' Then    \n    \n  f_handle := WEBUTIL_C_API.register_function(winSysDir||'user32.dll','LockWorkStation');\n  args := WEBUTIL_C_API.create_parameter_list;    \n  \n/*\nIf the function succeeds, the return value is nonzero. Because the function executes asynchronously, \na nonzero return value indicates that the operation has been initiated. It does not indicate whether \nthe workstation has been successfully locked.  If the function fails, the return value is zero. \n\n    http://msdn.microsoft.com/en-us/library/aa376875(v=VS.85).aspx\n*/              \n  rc := WEBUTIL_C_API.Invoke_Int(winSysDir||'user32.dll','LockWorkStation',args);  \n\nEnd if;\n\n  WEBUTIL_C_API.Destroy_Parameter_List(args);\n  WEBUTIL_C_API.Deregister_Function(f_handle);      \n  SYNCHRONIZE;\n                          \nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/DOWNLOAD/DOWNLOAD__DOWNLOAD_AS__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nbegin\n  download_as;\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/DOWNLOAD/DOWNLOAD__DOWNLOAD_DB__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nbegin\n  download_db;\n  \n  exception\n  when others\n    then\n      message('File download failed: '||sqlerrm);\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/DOWNLOAD/DOWNLOAD__GET_FILE_NAME__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\ndeclare\n  l_filename varchar2(200);\nbegin\n   l_filename := webutil_file.file_save_dialog\n    (directory_name => :global.user_home\n                                    ,file_name      => '1MByte.pdf'\n                                    ,file_filter    => null\n                                    ,title          => 'Select client side filename where App Server file will be saved'\n                                    );\n\n  :download.file_name := l_filename;\nend;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/DOWNLOAD_AS.pcd",
    "content": "PROCEDURE DOWNLOAD_AS IS\n  l_success       boolean;\n  l_bare_filename varchar2(50);\n  l_value_start   number;\n  l_value_stop    number;\n  l_result        number;\n  l_bandwidth     number;\nBEGIN\n\n-- THIS CODE ASSUMES THAT CLIENT IS WINDOWS BASED\n-- CHANGE THE serverFile PATH FROM C:\\TEMP TO THE LOCATION SET IN WEBUTIL.CFG\n\n--  l_bare_filename := substr(:upload.file_name,instr(:upload.file_name,'\\',-1)+1);\n\n  clear_message;\n\n  l_value_start := f_get_timer_value;\n\n  l_success := webutil_file_transfer.AS_to_Client_with_progress\n                                    (clientFile       => :download.file_name\n                                    ,serverFile       => 'C:\\temp\\1MB.pdf'\n                                    ,progressTitle    => 'Download 1 MB from Application Server in progress'\n                                    ,progressSubTitle => 'Please wait'\n                                    );\n                                    \n  l_value_stop := f_get_timer_value;\n  \n  l_result := (l_value_stop-l_value_start) /1000;\n  l_bandwidth := 8 / l_result;\n  \n  Message('Bandbreite = ' || to_char(round(l_bandwidth,2)) || 'Mbit/s Messung ' || to_char(round(l_result,2)) || ' Sekunden');\n                                    \n  if l_success\n  then\n    message('File downloaded successfully from the Application Server');\n  else\n    message('File download from Application Server failed');\n  end if;\n  \n  exception\n    when others\n    then\n      message('File download failed: '||sqlerrm);\n  \n\nEND;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/DOWNLOAD_DB.pcd",
    "content": "PROCEDURE DOWNLOAD_DB IS\n  l_success boolean;\nBEGIN\n  l_success := webutil_file_transfer.DB_To_Client_with_progress\n                                    (clientFile      => :download.file_name\n                                    ,tableName       => 'wu_fileupdown_demo'\n                                    ,columnName      => 'BLOB'\n                                    ,whereClause     => 'ID = 1'\n                                    ,progressTitle   => 'Download from Database in progress'\n                                    ,progressSubTitle=> 'Please wait'\n                                    );\n  if l_success\n  then\n    message('File downloaded successfully from the Database');\n  else\n    message('File download from Database failed');\n  end if;\n  \n  exception\n    when others\n    then\n      message('File download failed: '||sqlerrm);\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/FILES/FILES__COPY_FILE__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nbegin\n  files_wbp('COPY_FILE');\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/FILES/FILES__DELETE_FILE__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nbegin\n  files_wbp('DELETE_FILE');\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/FILES/FILES__FILE_INFO__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nbegin\n  files_wbp('FILE_INFO');\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/FILES/FILES__FILE_OPEN__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nbegin\n  files_wbp('FILE_OPEN');\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/FILES/FILES__FILE_SAVE__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nbegin\n  files_wbp('FILE_SAVE');\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/FILES/FILES__LIST_DIRS__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nbegin\n  files_wbp('LIST_DIRS');\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/FILES/FILES__LIST_FILES__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nbegin\n  files_wbp('LIST_FILES');\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/FILES_WBP.pcd",
    "content": "PROCEDURE FILES_WBP (P_ACTION IN VARCHAR2) IS\n  l_file_list  webutil_file.file_list;\n  l_temp_text  varchar2(8000);\n  l_filename   varchar2(80)   := :global.user_home ||'\\helloworld.txt';\n  l_copy_name  varchar2(80)   := :global.user_home ||'\\copy of helloworld.txt';\n  l_success    boolean;\nBEGIN\n  l_file_list.delete;\n  \n  if p_action = 'LIST_DIRS'\n  then\n    l_file_list := webutil_file.directory_root_list;\n\n  elsif p_action = 'LIST_FILES'\n  then\n    l_file_list := webutil_file.directory_list(:global.user_home,true);\n\n  elsif p_action = 'FILE_INFO'\n  then\n    l_file_list(1) := 'Exists:    '||webutil_util.booltostr(webutil_file.file_exists(l_filename));\n    l_file_list(2) := 'Readable:  '||webutil_util.booltostr(webutil_file.file_is_readable(l_filename));\n    l_file_list(3) := 'Writeable: '||webutil_util.booltostr(webutil_file.file_is_writable(l_filename));\n    l_file_list(4) := 'Hidden:    '||webutil_util.booltostr(webutil_file.file_is_hidden(l_filename));\n    l_file_list(5) := 'Directory: '||webutil_util.booltostr(webutil_file.file_is_directory(l_filename));\n    l_file_list(6) := 'Size:      '||to_char(webutil_file.file_size(l_filename))||' bytes';\n\n  elsif p_action = 'COPY_FILE'\n  then\n    l_success := webutil_file.copy_file(l_filename,l_copy_name);\n    if l_success \n    then\n       message('Copy of file successfull');\n    else\n       message('Copy failed');\n    end if;\n    l_file_list := webutil_file.directory_list(:global.user_home,true);\n\n  elsif p_action = 'DELETE_FILE'\n  then\n    l_success := webutil_file.delete_file(l_copy_name);\n    if l_success \n    then\n       message('Delete of file successfull');\n    else\n       message('Delete failed');\n    end if;\n    l_file_list := webutil_file.directory_list(:global.user_home,true);\n\n  elsif p_action = 'FILE_OPEN'\n  then\n    l_filename := webutil_file.file_open_dialog;\n    l_file_list(1) := 'Selected file: '||l_filename;\n\n  elsif p_action = 'FILE_SAVE'\n  then\n    l_copy_name := webutil_file.file_save_dialog;\n    --l_success   := webutil_file.copy_file(l_filename,l_copy_name);\n    l_file_list(1) := 'File Saved as: '||l_copy_name;\n\n  else\n    message('Invalid Event passed to FILES_WBP');\n  end if;\n  \n  -- write file list to text box\n  l_temp_text := '';\n  for i in 1 .. l_file_list.count\n  loop\n    l_temp_text := l_temp_text || l_file_list(i) || chr(10);\n  end loop;\n  :files.result_box := l_temp_text;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/F_GET_TIMER_VALUE.fun",
    "content": "-- Get the time in ms from 23.10.2015 until this moment\n\nFUNCTION f_get_timer_value RETURN number IS\n  out_result number;\nbegin\n        select extract(day from(systimestamp - to_timestamp('2015-10-23', 'YYYY-MM-DD'))) * 86400000 \n            + to_number(to_char(sys_extract_utc(systimestamp), 'SSSSSFF3'))\n        into out_result\n        from dual;\n        return out_result;\nend f_get_timer_value;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/GET_APPLET_PARAMETERS.pcd",
    "content": "PROCEDURE get_applet_parameters IS\nBEGIN\n  :applet_param_box := '<lookAndFeel> = '||webutil_browser.getappletparameter('lookAndFeel');\n  :applet_param_box := :applet_param_box || chr(10)|| '<colorScheme> = '||webutil_browser.getappletparameter('colorScheme');\n  :applet_param_box := :applet_param_box || chr(10)|| '<separateFrame> = '||webutil_browser.getappletparameter('separateFrame');\n  :applet_param_box := :applet_param_box || chr(10)|| 'Applet width and height = '||webutil_browser.getappletsize();\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/GET_CLIENTINFO.pcd",
    "content": "PROCEDURE GET_CLIENTINFO IS\nBEGIN\n  :CLIENTINFO.USER_NAME        := webutil_clientinfo.get_user_name;\n  :CLIENTINFO.IP_ADDRESS       := webutil_clientinfo.get_ip_address;\n  :CLIENTINFO.HOST_NAME        := webutil_clientinfo.get_host_name;\n  :CLIENTINFO.OPERATING_SYSTEM := webutil_clientinfo.get_operating_system;\n  :CLIENTINFO.JAVA_VERSION     := webutil_clientinfo.get_java_version;\n  :CLIENTINFO.PATH_SEPERATOR   := webutil_clientinfo.get_path_separator;\n  :CLIENTINFO.FILE_SEPERATOR   := webutil_clientinfo.get_file_separator;\n  :CLIENTINFO.LANGUAGE         := webutil_clientinfo.get_language;\n  :CLIENTINFO.TIME_ZONE        := webutil_clientinfo.get_time_zone;\n  :CLIENTINFO.DATE_TIME        := webutil_clientinfo.get_date_time;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/GET_CLIENT_FILENAME.pcd",
    "content": "PROCEDURE get_client_filename IS\n  l_filename varchar2(200);\nBEGIN\n  l_filename := client_get_file_name(directory_name => :global.user_home\n                                    ,file_name      => null\n                                    ,file_filter    => 'GIF Files (*.gif)|*.gif|All Files (*.*)|*.*'\n                                    ,message        => null\n                                    ,dialog_type    => null\n                                    ,select_file    => null\n                                    );\n  :builtins.file_name := l_filename;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/HOST/HOST__HOST_CALLBACK.tgg",
    "content": "BEGIN\nMESSAGE ('Host command called back into Forms');\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/HOST/HOST__RUN_HOST__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nDECLARE\n  fname VARCHAR2(255) := null;\n  pid WEBUTIL_HOST.PROCESS_ID;\nBEGIN\n  IF :HOST_ASK_FILENAME = 'true' THEN\n    fname := CLIENT_GET_FILE_NAME(null,null,null,null,OPEN_FILE,TRUE);\n  END IF;\n  IF :BLOCKING_RADIO = 'BLOCKING' THEN\n    CLIENT_HOST('CMD /C NOTEPAD '||fname);\n  ELSIF :BLOCKING_RADIO = 'NON_BLOCKING' THEN\n    WEBUTIL_HOST.NONBLOCKING('CMD /C NOTEPAD '||fname);\n  ELSIF :BLOCKING_RADIO = 'NON_BLOCKING_CALLBACK' THEN\n    pid := WEBUTIL_HOST.NONBLOCKING_WITH_CALLBACK('CMD /C NOTEPAD '||fname,'HOST_CALLBACK');\n  END IF;\nEND;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/SEPARATE_FRAME_OPTIONS.pcd",
    "content": "PROCEDURE separate_frame_options IS\nBEGIN\n  if WebUtil_SeparateFrame.IsSeparateFrame\n  then\n    WebUtil_SeparateFrame.SetTitle('WebUtil Demo Form');\n  end if;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/SET_BROWSER_MESSAGE.pcd",
    "content": "PROCEDURE set_browser_message (  my_message  varchar2) IS\n  \nBEGIN\n  \n  If my_message IS NULL then\n  \n  WebUtil_Browser.BrowserMessage('Welcome '                  ||webutil_clientinfo.get_user_name   \n                               ||', your computer is called '||webutil_clientinfo.get_host_name\n                               ||', with IP address '        ||webutil_clientinfo.get_ip_address\n                               ||', running '                ||webutil_clientinfo.get_operating_system\n                               );\n  Else\n    \n      WebUtil_Browser.BrowserMessage (my_message);    \n  \n  End if;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/UPLOAD/UPLOAD__CREATE_TABLE__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\n/*\nTHE FOLLOWING IS THE SQL FOUND IN \"wu_fileupload_db_demo.sql\".\nIF THE TRIGGER BELOW EXECUTES SUCCESSFULLY, THE SAME TABLE WILL BE CREATED AS SEEN IN THE SCRIPT\nTHERE IS NO NEED TO RUN THE SCRIPT IF THIS TRIGGER HAS BEEN EXECUTED SUCCESSFULLY\n\n    drop table wu_fileupdown_demo;\n    create table wu_fileupdown_demo (blob blob, id number(2));\n    insert into wu_fileupdown_demo values (NULL,1);\n    commit;\n\n*/\n\n\nBEGIN \n  Forms_DDL('drop table wu_fileupdown_demo');\n  Forms_DDL('create table wu_fileupdown_demo (blob blob, id number(2))');\n  \n  IF NOT Form_Success THEN \n    -- Failure will most likely occur if the current user does not have permission to create tables\n    Message ('Table Creation Failed');  \n  \n  ELSE \n  Forms_DDL('insert into wu_fileupdown_demo values (NULL,1)');\n  Message ('Table \"wu_fileupdown_demo\" created.');\n  Message ('Table \"wu_fileupdown_demo\" created.');  \n \n -- Since the table was created successfully, we can now enable the appropriate buttons\n -- Also, we will remove the Create button since it is no longer needed\n   SET_ITEM_PROPERTY ('upload.upload_db',enabled, property_true);\n  SET_ITEM_PROPERTY ('download.download_db',enabled, property_true);\n  GO_ITEM('upload.file_name');\n  SYNCHRONIZE;\n  SET_ITEM_PROPERTY ('upload.create_table',enabled, property_false);\n  SET_ITEM_PROPERTY ('upload.create_table',visible, property_false);  \n  END IF;\n  \n\nEND;\n\n\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/UPLOAD/UPLOAD__GET_FILE_NAME__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\ndeclare\n  l_filename varchar2(200);\nbegin\n  l_filename := client_get_file_name(directory_name => :global.user_home\n                                    ,file_name      => null\n                                    ,file_filter    => null\n                                    ,message        => null\n                                    ,dialog_type    => null\n                                    ,select_file    => null\n                                    );\n  :upload.file_name := l_filename;\n  SYNCHRONIZE;\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/UPLOAD/UPLOAD__UPLOAD_AS__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nbegin\n  upload_as;\n\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/UPLOAD/UPLOAD__UPLOAD_DB__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nbegin\n  upload_db;\n    exception\n    when others\n    then\n      message('File upload failed: '||sqlerrm);\n\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/UPLOAD_AS.pcd",
    "content": "PROCEDURE UPLOAD_AS IS\n  l_success       boolean;\n  l_bare_filename varchar2(50);\nBEGIN\n  \n-- THIS CODE ASSUMES THAT CLIENT IS WINDOWS BASED\n-- CHANGE THE serverFile PATH FROM C:\\TEMP TO THE LOCATION SET IN WEBUTIL.CFG  \n  l_bare_filename := substr(:upload.file_name,instr(:upload.file_name,'\\',-1)+1);  \n  l_success := webutil_file_transfer.Client_To_AS_with_progress\n                                    (clientFile       => :upload.file_name\n                                    ,serverFile       => 'c:\\kassandra\\temp\\'||l_bare_filename\n                                    ,progressTitle    => 'Upload to Application Server in progress'\n                                    ,progressSubTitle => 'Please wait'\n                                    ,asynchronous     => false\n                                    ,callbackTrigger  => null\n                                    );\n  if l_success\n  then\n    message('File uploaded successfully to the Application Server');\n-- Added to make demo more user friendly.\n-- If file is successfully uploaded, move to \"Download\" tab.        \n    go_item('download.file_name');\n        \n  else\n    message('File upload to Application Server failed');\n  end if;\n  \n  exception\n    when others\n    then\n      message('File upload failed: '||sqlerrm);\n  \n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/UPLOAD_DB.pcd",
    "content": "PROCEDURE UPLOAD_DB IS\n  l_success boolean;\nBEGIN\n  l_success := webutil_file_transfer.Client_To_DB_with_progress\n                                    (clientFile      => :upload.file_name\n                                    ,tableName       => 'wu_fileupdown_demo'\n                                    ,columnName      => 'BLOB'\n                                    ,whereClause     => 'ID = 1'\n                                    ,progressTitle   => 'Upload to Database in progress'\n                                    ,progressSubTitle=> 'Please wait'\n                                    ,asynchronous    => false\n                                    ,callbackTrigger => null\n                                    );\n  if l_success\n  then\n  --\n  -- Force commit to save file in db.                                    \n  -- This is not in the original Demo \n  -- which causes the Demo to fail if \n  -- you exit and return later to download.\n    :System.Message_Level := '15';                                   \n    commit;\n    :System.Message_Level := '0';  \n    \n    message('File uploaded successfully into the Database');\n    \n-- Added to make demo more user friendly.\n-- If file is successfully uploaded, move to \"Download\" tab.        \n    go_item('download.file_name');\n    \n  else\n    message('File upload to Database failed');\n  end if;\n  \n  exception\n    when others\n    then\n      message('File upload failed: '||sqlerrm);\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/WEBUTIL/WEBUTIL__DUMMY__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nif :system.cursor_block = 'WEBUTIL' then \n  next_block;\nend if;\nWebUtil_Core.ShowBeans(false);\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/WEBUTIL/WEBUTIL__WEBUTIL_BROWSER_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/WEBUTIL/WEBUTIL__WEBUTIL_CLIENTINFO_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/WEBUTIL/WEBUTIL__WEBUTIL_C_API_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/WEBUTIL/WEBUTIL__WEBUTIL_FILETRANSFER_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/WEBUTIL/WEBUTIL__WEBUTIL_FILE_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/WEBUTIL/WEBUTIL__WEBUTIL_HOST_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/WEBUTIL/WEBUTIL__WEBUTIL_SESSION_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/WEBUTIL_DEMO/PRE-FORM.tgg",
    "content": "BEGIN\nDECLARE\n/* DOK:================================================================================================================\n *  - Login mit oder ohne Parameterübergabe, Fehlerbehandlung durch Fehler aus POST-LOGON Trigger\n * Autor           : F.HOFFMANN\n * Erstellungsdatum: 12.2.2015\n * Änd-Nr.  Datum       Name         Beschreibung\n * ---------------------------------------------------------------------------------------------------------------------\n * 1      12.02.2015 HOFFMANNF  Anzeige des letzten Logins integriert\n * 2      05.03.2015 HOFFMANNF  Fehlerbehandlunga aus POST-LOGON Trigger\n * 3      25.03.2015 HOFFMANNF  OT-25148/profi Browserversion einlesen \n * 4      16.04.2015 HOFFMANNF  OT-25148/profi Browserschutz nur bei Profi-Anwendung, \"Default\" Wert ist \"nicht geschützt\"\n * 5      08.09.2015 HOFFMANNF  OT-64520/profi Browserschutz nur nach erfolgreicher Anmeldung \n*/\nBEGIN\n  \n  -- Anmeldung über vorgeschaltete Maske, Password wird als Parameter übergeben\n  if :parameter.p_password is not null\n  then  \n      LOGON (:parameter.p_username, :parameter.p_password||'@' || :parameter.p_db,FALSE);\n      IF Form_Failure\n      THEN\n        message('Internal Error - Connect did not work');\n        raise form_trigger_failure;\n \n      else\n     \n        -- #1 Anzeige letztes Login\n        --:id_letztes_login := :parameter.p_login_text;\n        :parameter.P_START := f_get_timer_value;\n        :parameter.p_password := null;\n\n        --webutil_startup_timer;\n\n        --:parameter.p_browser := WEB.JAVASCRIPT_EVAL_FUNCTION('document.getElementById(\"browserversion\").value');\n        -- #004\n        --web.javascript_eval_expr('document.getElementById(\"closeprofi\").value=\"profi_protect_browser\"'); \n\n      end if;\n   else\n    -- Anmeldung direkt - es wird nur ein Timer gestartet\n    --webutil_startup_timer;\n    null;\n   end if;\nEND;\n\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/WEBUTIL_DEMO/WHEN-NEW-FORM-INSTANCE.tgg",
    "content": "BEGIN\ndeclare\n  fake_timer   TIMER;\n  istable      varchar2(2);\nbegin\n  \n  --\n  -- Purpose of the fake timer is the we cannot call webutil in this trigger since the\n  -- beans have not yet been instantiated.  If we put the code in a when-timer-expired-trigger\n  -- it means that this timer will not start running until Forms has focus (and so the webutil\n  -- beans will be instantiated and so call canbe made.\n  --\n  fake_timer:= CREATE_TIMER('webutil',150,NO_REPEAT);\n\n  show_window ('w_hello');\n  hide_window ('window1');\n\n  -- Test to see if WebUtil Demo table exists (wu_test_table)\n  -- This is used on the File Upload tab\n    SELECT DECODE(count(*),0,'F','T') INTO istable FROM user_tables WHERE table_name = upper('wu_fileupdown_demo');\n    If istable = 'F' Then \n      SET_ITEM_PROPERTY ('upload.upload_db',enabled, property_false);\n      SET_ITEM_PROPERTY ('download.download_db',enabled, property_false);  \n      SET_ITEM_PROPERTY ('upload.create_table',visible, property_true);\n      SET_ITEM_PROPERTY ('upload.create_table',enabled, property_true);\n    end if;  \n    \n    --:parameter.p_stop := f_get_timer_value;\n    --message('latency := ' || to_char(round(26901/(:parameter.p_stop-:parameter.p_start),2)) || ' ms');  \nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/WEBUTIL_DEMO/WHEN-TAB-PAGE-CHANGED.tgg",
    "content": "BEGIN\nbegin  \n  if not WebUtil_SeparateFrame.IsSeparateFrame\n  then\n    set_item_property('browser.separate_frame',enabled,property_false);\n  end if;\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/WEBUTIL_DEMO/WHEN-TIMER-EXPIRED.tgg",
    "content": "BEGIN\n  :global.user_home := webutil_clientinfo.get_system_property('user.home');\n  --:OLE.FILENAME := :global.user_home||'\\temp.doc';\n  SET_ITEM_PROPERTY('builtins.text_io_item',PROMPT_TEXT,'Write to '||:global.user_home||'\\helloworld.txt');\n  SET_ITEM_PROPERTY('files.userdothome',PROMPT_TEXT,:global.user_home);\n  SET_APPLICATION_PROPERTY(CLIENT_IDLE_TIME,600);\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0001/WEBUTIL_DEMO/metadata.json",
    "content": "{\n  \"alerts\": [\n    \"EXIT_ALERT\",\n    \"WEBUTIL_ERROR\"\n  ],\n  \"blocks\": [\n    {\n      \"name\": \"CLIENTINFO\",\n      \"items\": [\n        \"ACTION\",\n        \"DATE_TIME\",\n        \"TIME_ZONE\",\n        \"LANGUAGE\",\n        \"FILE_SEPERATOR\",\n        \"PATH_SEPERATOR\",\n        \"JAVA_VERSION\",\n        \"OPERATING_SYSTEM\",\n        \"IP_ADDRESS\",\n        \"USER_NAME\",\n        \"HOST_NAME\"\n      ]\n    },\n    {\n      \"name\": \"BUILTINS\",\n      \"items\": [\n        \"IMAGE\",\n        \"FILE_NAME\",\n        \"GET_FILE_NAME\",\n        \"READ_IMAGE\",\n        \"GET_TOOL_ENV\",\n        \"TOOL_ENV\",\n        \"TEXT_IO_BUTTON\",\n        \"TEXT_IO_ITEM\"\n      ]\n    },\n    {\n      \"name\": \"FILES\",\n      \"items\": [\n        \"LIST_DIRS\",\n        \"LIST_FILES\",\n        \"FILE_INFO\",\n        \"COPY_FILE\",\n        \"DELETE_FILE\",\n        \"FILE_OPEN\",\n        \"FILE_SAVE\",\n        \"RESULT_BOX\",\n        \"USERDOTHOME\"\n      ]\n    },\n    {\n      \"name\": \"UPLOAD\",\n      \"items\": [\n        \"FILE_NAME\",\n        \"GET_FILE_NAME\",\n        \"UPLOAD_DB\",\n        \"UPLOAD_AS\",\n        \"CREATE_TABLE\"\n      ]\n    },\n    {\n      \"name\": \"DOWNLOAD\",\n      \"items\": [\n        \"FILE_NAME\",\n        \"GET_FILE_NAME\",\n        \"DOWNLOAD_DB\",\n        \"DOWNLOAD_AS\"\n      ]\n    },\n    {\n      \"name\": \"BROWSER\",\n      \"items\": [\n        \"BROWSER_MESS_TEXT\",\n        \"BROWSER_MESSAGE\",\n        \"SEPARATE_FRAME\",\n        \"APPLET_PARAMS\",\n        \"APPLET_PARAM_BOX\"\n      ]\n    },\n    {\n      \"name\": \"HOST\",\n      \"items\": [\n        \"RUN_HOST\",\n        \"HOST_ASK_FILENAME\",\n        \"BLOCKING_RADIO\"\n      ]\n    },\n    {\n      \"name\": \"C_API\",\n      \"items\": [\n        \"CALL_C_API\",\n        \"LOCKSTATION\"\n      ]\n    },\n    {\n      \"name\": \"ABOUT\",\n      \"items\": [\n        \"ABOUT_BUTTON\"\n      ]\n    },\n    {\n      \"name\": \"CTL\",\n      \"items\": [\n        \"ACKNOWLEDGE\",\n        \"TERMSOFUSE\",\n        \"EXIT1\",\n        \"EXIT2\",\n        \"EXIT3\",\n        \"EXIT4\",\n        \"EXIT5\",\n        \"EXIT6\",\n        \"EXIT7\",\n        \"EXIT8\",\n        \"EXIT9\",\n        \"EXIT10\"\n      ]\n    },\n    {\n      \"name\": \"WEBUTIL\",\n      \"items\": [\n        \"DUMMY\",\n        \"WEBUTIL_CLIENTINFO_FUNCTIONS\",\n        \"WEBUTIL_FILE_FUNCTIONS\",\n        \"WEBUTIL_HOST_FUNCTIONS\",\n        \"WEBUTIL_SESSION_FUNCTIONS\",\n        \"WEBUTIL_FILETRANSFER_FUNCTIONS\",\n        \"WEBUTIL_C_API_FUNCTIONS\",\n        \"WEBUTIL_BROWSER_FUNCTIONS\"\n      ]\n    }\n  ],\n  \"lovs\": []\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0002/DEMO0002/BL_EMPLOYEES.pkb",
    "content": "PACKAGE BODY BL_Employees IS\n\n  PROCEDURE PRQ IS\n  BEGIN\n    :Employees.Employee_ID := :Filter.TI_Employee_ID;\n    :Employees.First_Name  := '%' || :Filter.TI_First_Name || '%';\n    :Employees.Last_Name   := '%' || :Filter.TI_Last_Name  || '%';\n    :Employees.Email       := '%' || :Filter.TI_Email      || '%';\n  END;\n\n  PROCEDURE POQ IS\n  BEGIN\n    NULL;\n  END;\n\n  PROCEDURE PRI IS\n  BEGIN\n    NULL;\n  END;\n\n  PROCEDURE PRU IS\n  BEGIN\n    NULL;\n  END;\n\n  PROCEDURE PRD IS\n  BEGIN\n    NULL;\n  END;\n\n  PROCEDURE WVR IS\n  BEGIN\n    NULL;\n  END;\n\n  PROCEDURE Initialize IS\n  BEGIN\n    NULL;\n  END;\n\n  PROCEDURE Destroy IS\n  BEGIN\n    NULL;\n  END;\n\n  PROCEDURE Query IS\n  BEGIN\n    NULL;\n  END;\n\nEND;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0002/DEMO0002/BL_EMPLOYEES.pks",
    "content": "PACKAGE BL_Employees IS\n/*\n|| Name        : BL_<Blockname>\n|| Description : This Package is a template for all block-packages\n||\n|| Version   Updates     Author    Change-Description\n|| -------   ----------  -------   ------------------\n|| 1.0.001   07.04.2007, Volberg - Created\n*/\n  \n  PROCEDURE PRQ;\n  PROCEDURE POQ;\n  PROCEDURE PRI;\n  PROCEDURE PRU;\n  PROCEDURE PRD;\n  PROCEDURE WVR;\n\n  PROCEDURE Initialize;\n  PROCEDURE Destroy;\n  PROCEDURE Query;\n\nEND;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0002/DEMO0002/BL_MAINBLOCK.pkb",
    "content": "PACKAGE BODY BL_Mainblock IS\n\n  PROCEDURE PRQ IS\n  BEGIN\n    NULL;\n  END;\n\n  PROCEDURE POQ IS\n  BEGIN\n    NULL;\n  END;\n\n  PROCEDURE PRI IS\n  BEGIN\n    NULL;\n  END;\n\n  PROCEDURE PRU IS\n  BEGIN\n    NULL;\n  END;\n\n  PROCEDURE PRD IS\n  BEGIN\n    NULL;\n  END;\n\n  PROCEDURE WVR IS\n  BEGIN\n    NULL;\n  END;\n\n  PROCEDURE Initialize IS\n  BEGIN\n    NULL;\n  END;\n\n  PROCEDURE Destroy IS\n  BEGIN\n    NULL;\n  END;\n\n  PROCEDURE Query IS\n  BEGIN\n    NULL;\n  END;\n\nEND;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0002/DEMO0002/BL_MAINBLOCK.pks",
    "content": "PACKAGE BL_Mainblock IS\n/*\n|| Name        : BL_<Blockname>\n|| Description : This Package is a template for all block-packages\n||\n|| Version   Updates     Author    Change-Description\n|| -------   ----------  -------   ------------------\n|| 1.0.001   07.04.2007, Volberg - Created\n*/\n  \n  PROCEDURE PRQ;\n  PROCEDURE POQ;\n  PROCEDURE PRI;\n  PROCEDURE PRU;\n  PROCEDURE PRD;\n  PROCEDURE WVR;\n\n  PROCEDURE Initialize;\n  PROCEDURE Destroy;\n  PROCEDURE Query;\n\nEND;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0002/DEMO0002/CONST_LOCAL.pks",
    "content": "PACKAGE Const_local IS\n/*\n|| Name        : Const_local\n|| Description : This Package is the local Form-Constant-Package\n||\n|| Version   Updates     Author    Change-Description\n|| -------   ----------  -------   ------------------\n|| 1.0.001   20.07.2007, Volberg - Created\n*/\n\n-- Blocks\n  blk_Control                    CONSTANT VARCHAR2 (30) := upper ('Control');\n  blk_Filter                     CONSTANT VARCHAR2 (30) := upper ('Filter');\n  blk_Mainblock                  CONSTANT VARCHAR2 (30) := upper ('Employees');\n\n-- One Time Timer\n  ott_Query                      CONSTANT VARCHAR2 (40) := upper ('Query');\n\nEND;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0002/DEMO0002/CONTROL/CONTROL__BT_EXIT__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nexit_form (no_validate);\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0002/DEMO0002/CONTROL/CONTROL__BT_WIKI__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nweb.show_document ('https://github.com/GerdVolberg/forms-framework/wiki/Demo-0002');\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0002/DEMO0002/DEMO0002/WHEN-TIMER-EXPIRED.tgg",
    "content": "BEGIN\nWhen_Timer_Expired;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0002/DEMO0002/EMPLOYEES/EMPLOYEES__PRE-QUERY.tgg",
    "content": "BEGIN\nBL_Employees.PRQ;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0002/DEMO0002/FILTER/FILTER__BT_QUERY__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nGoto_Block_and_Query (Const_local.blk_Mainblock);\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0002/DEMO0002/FILTER/FILTER__WHEN-VALIDATE-ITEM.tgg",
    "content": "BEGIN\nOne_Time_Timer.Initialize (Const_local.ott_Query);\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0002/DEMO0002/VERSION_FRW_FORMS.fun",
    "content": "FUNCTION Version_frw_Forms RETURN VARCHAR2 IS\n/*\n|| Name        : Version_frw_Forms\n|| Description : Returns the Version of the current Form\n|| Returns     : VARCHAR2\n|| \n|| Version   Updates     Author    Change-Description\n|| -------   ----------  -------   ------------------\n|| 1.0.001   20.07.2007, Volberg - Created\n*/\nBEGIN\n  RETURN ('1.0.001');\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0002/DEMO0002/WHEN_TIMER_EXPIRED.pcd",
    "content": "PROCEDURE When_Timer_Expired IS\n  V_Item   VARCHAR2 (61);\nBEGIN\n  V_Item := Act.Item;\n\n  IF One_Time_Timer.Get_Value = Const_local.ott_Query THEN\n    Goto_Block_and_Query (Const_local.blk_Mainblock);\n    Go_Item (V_Item);\n  END IF;\nEND;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0002/DEMO0002/WNB.pcd",
    "content": "PROCEDURE WNB IS\n/*\n|| Name        : WNB\n|| Description : WHEN-NEW-BLOCK-INSTANCE\n|| \n|| Version   Updates     Author    Change-Description\n|| -------   ----------  -------   ------------------\n|| 1.0.001   03.04.2011, Volberg - Created\n*/\nBEGIN\n  Event.WNB;\nEND;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0002/DEMO0002/WNF.pcd",
    "content": "PROCEDURE WNF IS\n/*\n|| Name        : WNF\n|| Description : WHEN-NEW-FORM-INSTANCE\n|| \n|| Version   Updates     Author    Change-Description\n|| -------   ----------  -------   ------------------\n|| 1.0.001   03.04.2011, Volberg - Created\n*/\nBEGIN\n  Event.WNF;\n\n  Goto_Block_and_Query (Const_local.blk_Mainblock);\n  Goto_Block           (Const_local.blk_Filter);\nEND;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0002/DEMO0002/WNI.pcd",
    "content": "PROCEDURE WNI IS\n/*\n|| Name        : WNI\n|| Description : WHEN-NEW-ITEM-INSTANCE\n|| \n|| Version   Updates     Author    Change-Description\n|| -------   ----------  -------   ------------------\n|| 1.0.001   03.04.2011, Volberg - Created\n*/\nBEGIN\n  Event.WNI;\nEND;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0002/DEMO0002/WNR.pcd",
    "content": "PROCEDURE WNR IS\n/*\n|| Name        : WNR\n|| Description : WHEN-NEW-RECORD-INSTANCE\n|| \n|| Version   Updates     Author    Change-Description\n|| -------   ----------  -------   ------------------\n|| 1.0.001   03.04.2011, Volberg - Created\n*/\nBEGIN\n  Event.WNR;\nEND;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0002/DEMO0002/metadata.json",
    "content": "{\n  \"alerts\": [\n    \"AL_ERROR\",\n    \"AL_INFO\",\n    \"AL_WARNING\",\n    \"AL_YES_NO\",\n    \"AL_YES_NO_CANCEL\"\n  ],\n  \"blocks\": [\n    {\n      \"name\": \"FILTER\",\n      \"items\": [\n        \"TI_EMPLOYEE_ID\",\n        \"TI_FIRST_NAME\",\n        \"TI_LAST_NAME\",\n        \"TI_EMAIL\",\n        \"BT_QUERY\"\n      ]\n    },\n    {\n      \"name\": \"EMPLOYEES\",\n      \"items\": [\n        \"EMPLOYEE_ID\",\n        \"FIRST_NAME\",\n        \"LAST_NAME\",\n        \"EMAIL\",\n        \"PHONE_NUMBER\",\n        \"JOB_ID\",\n        \"SALARY\",\n        \"MANAGER_ID\",\n        \"DEPARTMENT_ID\",\n        \"COMMISSION_PCT\",\n        \"HIRE_DATE\"\n      ]\n    },\n    {\n      \"name\": \"CONTROL\",\n      \"items\": [\n        \"BT_WIKI\",\n        \"BT_EXIT\"\n      ]\n    }\n  ],\n  \"lovs\": []\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0002/FRW_REF/FRW_REF/ON-ERROR.tgg",
    "content": "BEGIN\nError_Handling;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0002/FRW_REF/FRW_REF/WHEN-NEW-BLOCK-INSTANCE.tgg",
    "content": "BEGIN\nWNB;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0002/FRW_REF/FRW_REF/WHEN-NEW-FORM-INSTANCE.tgg",
    "content": "BEGIN\nWNF;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0002/FRW_REF/FRW_REF/WHEN-NEW-ITEM-INSTANCE.tgg",
    "content": "BEGIN\nWNI;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0002/FRW_REF/FRW_REF/WHEN-NEW-RECORD-INSTANCE.tgg",
    "content": "BEGIN\nWNR;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0002/FRW_REF/WNB.pcd",
    "content": "PROCEDURE WNB IS\nBEGIN\n  NULL;\nEND;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0002/FRW_REF/WNF.pcd",
    "content": "PROCEDURE WNF IS\nBEGIN\n  NULL;\nEND;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0002/FRW_REF/WNI.pcd",
    "content": "PROCEDURE WNI IS\nBEGIN\n  NULL;\nEND;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0002/FRW_REF/WNR.pcd",
    "content": "PROCEDURE WNR IS\nBEGIN\n  NULL;\nEND;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0002/FRW_REF/metadata.json",
    "content": "{\n  \"alerts\": [\n    \"AL_ERROR\",\n    \"AL_INFO\",\n    \"AL_WARNING\",\n    \"AL_YES_NO\",\n    \"AL_YES_NO_CANCEL\"\n  ],\n  \"blocks\": [\n    {\n      \"name\": \"BL\",\n      \"items\": [\n        \"TI\"\n      ]\n    }\n  ],\n  \"lovs\": []\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0003/DEMO0003/BL_MAINBLOCK.pkb",
    "content": "PACKAGE BODY BL_Mainblock IS\n\n  PROCEDURE PRQ IS\n  BEGIN\n    NULL;\n  END;\n\n  PROCEDURE POQ IS\n  BEGIN\n    NULL;\n  END;\n\n  PROCEDURE PRI IS\n  BEGIN\n    NULL;\n  END;\n\n  PROCEDURE PRU IS\n  BEGIN\n    NULL;\n  END;\n\n  PROCEDURE PRD IS\n  BEGIN\n    NULL;\n  END;\n\n  PROCEDURE WVR IS\n  BEGIN\n    NULL;\n  END;\n\n  PROCEDURE Initialize IS\n  BEGIN\n    NULL;\n  END;\n\n  PROCEDURE Destroy IS\n  BEGIN\n    NULL;\n  END;\n\n  PROCEDURE Query IS\n  BEGIN\n    NULL;\n  END;\n\nEND;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0003/DEMO0003/BL_MAINBLOCK.pks",
    "content": "PACKAGE BL_Mainblock IS\n/*\n|| Name        : BL_<Blockname>\n|| Description : This Package is a template for all block-packages\n||\n|| Version   Updates     Author    Change-Description\n|| -------   ----------  -------   ------------------\n|| 1.0.001   07.04.2007, Volberg - Created\n*/\n  \n  PROCEDURE PRQ;\n  PROCEDURE POQ;\n  PROCEDURE PRI;\n  PROCEDURE PRU;\n  PROCEDURE PRD;\n  PROCEDURE WVR;\n\n  PROCEDURE Initialize;\n  PROCEDURE Destroy;\n  PROCEDURE Query;\n\nEND;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0003/DEMO0003/CONST_LOCAL.pks",
    "content": "PACKAGE Const_local IS\n/*\n|| Name        : Const_local\n|| Description : This Package is the local Form-Constant-Package\n||\n|| Version   Updates     Author    Change-Description\n|| -------   ----------  -------   ------------------\n|| 1.0.001   20.07.2007, Volberg - Created\n*/\n\n-- Blocks\n  blk_Control                    CONSTANT VARCHAR2 (30) := upper ('Control');\n  blk_Mainblock                  CONSTANT VARCHAR2 (30) := upper ('');\n  blk_Employees                  CONSTANT VARCHAR2 (30) := upper ('Employees');\n  blk_Employees_LI               CONSTANT VARCHAR2 (30) := upper ('Employees_LI');\n\n-- One Time Timer\n  ott_Query                      CONSTANT VARCHAR2 (40) := upper ('Query');\n\nEND;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0003/DEMO0003/CONTROL/CONTROL__BT_EXIT__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nexit_form (no_validate);\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0003/DEMO0003/CONTROL/CONTROL__BT_ONE_TIME_TIMER__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\ngoto_block_and_query (Const_local.blk_Employees_LI);\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0003/DEMO0003/CONTROL/CONTROL__BT_UNDO__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\ngoto_block_and_query (Const_local.blk_Employees);\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0003/DEMO0003/CONTROL/CONTROL__BT_WIKI__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nweb.show_document ('https://github.com/GerdVolberg/forms-framework/wiki/Demo-0003');\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0003/DEMO0003/CONTROL/CONTROL__BT__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\ncall_form ('demo0002');\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0003/DEMO0003/DEMO0003/WHEN-TIMER-EXPIRED.tgg",
    "content": "BEGIN\nWhen_Timer_Expired;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0003/DEMO0003/EMPLOYEES_CONTROL/EMPLOYEES_CONTROL__BT_UNDO__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nUndo;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0003/DEMO0003/EMPLOYEES_CONTROL/EMPLOYEES_CONTROL__ITEM47__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nexit_form (no_validate);\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0003/DEMO0003/EMPLOYEES_LI/EMPLOYEES_LI__PRE-QUERY.tgg",
    "content": "BEGIN\nIF :EMPLOYEES_LI_CONTROL.LI_JOB_ID != '0' THEN\n  :Employees.JOB_ID := :EMPLOYEES_LI_CONTROL.LI_JOB_ID;\nEND IF;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0003/DEMO0003/EMPLOYEES_LI_CONTROL/EMPLOYEES_LI_CONTROL__BT_EXIT__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nexit_form (no_validate);\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0003/DEMO0003/UNDO.pcd",
    "content": "PROCEDURE Undo IS\n  V_Block  VARCHAR2 (30) := :SYSTEM.CURSOR_BLOCK;\n  V_Field  VARCHAR2 (61);\n  V_Item   VARCHAR2 (61);\nBEGIN\n  Validate (Item_Scope);\n  IF :SYSTEM.RECORD_STATUS = 'CHANGED' THEN\n    V_Field := Get_Block_Property (V_Block, FIRST_ITEM);\n    V_Item  := V_Block || '.' || V_Field;\n\n    WHILE V_Field IS NOT NULL\n    LOOP\n      IF  Get_Item_Property (V_Item, ITEM_TYPE) IN ('DISPLAY ITEM', 'CHECKBOX', 'LIST', \n                                                    'RADIO GROUP',  'TEXT ITEM')\n      AND Get_Item_Property (V_Item, BASE_TABLE) = 'TRUE' THEN\n        COPY (Get_Item_Property (V_Item, DATABASE_VALUE), V_Item);\n      END IF;\n      V_Field := Get_Item_Property (V_Item, NextItem);\n      V_Item  := V_Block || '.' || V_Field;\n    END LOOP;\n  END IF;\n  \n  Set_Record_Property (:SYSTEM.CURSOR_RECORD, :SYSTEM.CURSOR_BLOCK, STATUS, QUERY_STATUS);\n\nEND;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0003/DEMO0003/VERSION_FRW_FORMS.fun",
    "content": "FUNCTION Version_frw_Forms RETURN VARCHAR2 IS\n/*\n|| Name        : Version_frw_Forms\n|| Description : Returns the Version of the current Form\n|| Returns     : VARCHAR2\n|| \n|| Version   Updates     Author    Change-Description\n|| -------   ----------  -------   ------------------\n|| 1.0.001   20.07.2007, Volberg - Created\n*/\nBEGIN\n  RETURN ('1.0.001');\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0003/DEMO0003/WHEN_TIMER_EXPIRED.pcd",
    "content": "PROCEDURE When_Timer_Expired IS\n  V_Item   VARCHAR2 (61);\nBEGIN\n  V_Item := Act.Item;\n\n  IF One_Time_Timer.Get_Value = Const_local.ott_Query THEN\n    Goto_Block_and_Query (Const_local.blk_Mainblock);\n    Go_Item (V_Item);\n  END IF;\nEND;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0003/DEMO0003/WNB.pcd",
    "content": "PROCEDURE WNB IS\n/*\n|| Name        : WNB\n|| Description : WHEN-NEW-BLOCK-INSTANCE\n|| \n|| Version   Updates     Author    Change-Description\n|| -------   ----------  -------   ------------------\n|| 1.0.001   03.04.2011, Volberg - Created\n*/\nBEGIN\n  Event.WNB;\nEND;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0003/DEMO0003/WNF.pcd",
    "content": "PROCEDURE WNF IS\n/*\n|| Name        : WNF\n|| Description : WHEN-NEW-FORM-INSTANCE\n|| \n|| Version   Updates     Author    Change-Description\n|| -------   ----------  -------   ------------------\n|| 1.0.001   03.04.2011, Volberg - Created\n*/\nBEGIN\n  Event.WNF;\n  \n  Init_List_Item (P_Item    => 'EMPLOYEES_LI_CONTROL.LI_JOB_ID',\n                  P_Query   => 'SELECT JOB_ID, JOB_ID FROM Employees UNION ' || Const.sel_All_from_Dual,\n                  P_Default => 0);\n\nEND;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0003/DEMO0003/WNI.pcd",
    "content": "PROCEDURE WNI IS\n/*\n|| Name        : WNI\n|| Description : WHEN-NEW-ITEM-INSTANCE\n|| \n|| Version   Updates     Author    Change-Description\n|| -------   ----------  -------   ------------------\n|| 1.0.001   03.04.2011, Volberg - Created\n*/\nBEGIN\n  Event.WNI;\nEND;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0003/DEMO0003/WNR.pcd",
    "content": "PROCEDURE WNR IS\n/*\n|| Name        : WNR\n|| Description : WHEN-NEW-RECORD-INSTANCE\n|| \n|| Version   Updates     Author    Change-Description\n|| -------   ----------  -------   ------------------\n|| 1.0.001   03.04.2011, Volberg - Created\n*/\nBEGIN\n  Event.WNR;\nEND;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0003/DEMO0003/metadata.json",
    "content": "{\n  \"alerts\": [\n    \"AL_ERROR\",\n    \"AL_INFO\",\n    \"AL_WARNING\",\n    \"AL_YES_NO\",\n    \"AL_YES_NO_CANCEL\"\n  ],\n  \"blocks\": [\n    {\n      \"name\": \"CONTROL\",\n      \"items\": [\n        \"BT_UNDO\",\n        \"BT_ONE_TIME_TIMER\",\n        \"BT\",\n        \"BT_WIKI\",\n        \"BT_EXIT\"\n      ]\n    },\n    {\n      \"name\": \"EMPLOYEES\",\n      \"items\": [\n        \"EMPLOYEE_ID\",\n        \"FIRST_NAME\",\n        \"LAST_NAME\",\n        \"EMAIL\",\n        \"PHONE_NUMBER\",\n        \"HIRE_DATE\",\n        \"JOB_ID\",\n        \"SALARY\",\n        \"COMMISSION_PCT\",\n        \"MANAGER_ID\",\n        \"DEPARTMENT_ID\"\n      ]\n    },\n    {\n      \"name\": \"EMPLOYEES_CONTROL\",\n      \"items\": [\n        \"BT_UNDO\",\n        \"ITEM47\"\n      ]\n    },\n    {\n      \"name\": \"EMPLOYEES_LI\",\n      \"items\": [\n        \"EMPLOYEE_ID\",\n        \"FIRST_NAME\",\n        \"LAST_NAME\",\n        \"EMAIL\",\n        \"PHONE_NUMBER\",\n        \"HIRE_DATE\",\n        \"JOB_ID\",\n        \"SALARY\",\n        \"COMMISSION_PCT\",\n        \"MANAGER_ID\",\n        \"DEPARTMENT_ID\"\n      ]\n    },\n    {\n      \"name\": \"EMPLOYEES_LI_CONTROL\",\n      \"items\": [\n        \"LI_JOB_ID\",\n        \"BT_EXIT\"\n      ]\n    }\n  ],\n  \"lovs\": []\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0004/RELEASE_LOCKS/ERRORMESSAGE.pcd",
    "content": "PROCEDURE ErrorMessage (v_text varchar2) IS\nBEGIN\n  Message(v_text);\n  if SQLCODE <> 0 then\n    Message ('Oracle-Error: ' || SQLERRM);\n    Message ('Oracle-Error: ' || SQLERRM);\n  end if;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0004/RELEASE_LOCKS/IS_DBA.fun",
    "content": "FUNCTION Is_DBA\n  RETURN boolean\nIS\n  v_Anzahl number(1);\nBEGIN\n  select count(*)\n    into v_Anzahl\n    from User_Role_Privs\n   where Granted_Role = 'DBA'\n  ;\n  if v_Anzahl = 0 then\n    return FALSE;\n  else\n    return TRUE;\n  end if;\nexception\n  when OTHERS then \n    ErrorMessage('Fehler bei \"select count(*) from User_Role_Privs\".');\n    return FALSE;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0004/RELEASE_LOCKS/KILL_SESSION.pcd",
    "content": "PROCEDURE Kill_Session\nIS\n  v_DDL_Text varchar2(500);\nBEGIN\n  v_DDL_Text := 'alter system disconnect session '''\n                || to_char(:v$session.SID) || ','  || to_char(:v$session.Serial#)\n                || ''' immediate';\n  Forms_DDL(v_DDL_Text);\n  Refresh;\nexception\n  when OTHERS then\n    ErrorMessage('Fehler bei \"' || v_DDL_Text || '\".');\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0004/RELEASE_LOCKS/LOG_SYSTEM_SCHLIESSEN.pcd",
    "content": "PROCEDURE Log_System_Schliessen IS\nBEGIN\n  Go_Item('v$session.PB_Kill_Session');\n  Hide_View('Logon_Leinwand');\n  Hide_Window('Logon_Fenster');\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0004/RELEASE_LOCKS/REFRESH.pcd",
    "content": "PROCEDURE Refresh IS\nBEGIN\n  Go_Block('V$Lock');\n  Execute_Query;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0004/RELEASE_LOCKS/RELEASE_LOCKS/POST-FORM.tgg",
    "content": "BEGIN\ndeclare\n  v_User varchar2(30) := get_application_property(USERNAME);\nbegin\n  if nvl(v_User, ' ') != :global.User then\n    logout;\n    logon(:global.User, :global.Pwd || '@' || :global.Con, FALSE);\n  end if;\n  erase('global.User'); \n  erase('global.PWD'); \n  erase('global.Con');\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0004/RELEASE_LOCKS/RELEASE_LOCKS/WHEN-NEW-FORM-INSTANCE.tgg",
    "content": "BEGIN\n:global.User := get_application_property(USERNAME); \n:global.Pwd  := get_application_property(PASSWORD); \n:global.Con  := get_application_property(CONNECT_STRING);\nRefresh;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0004/RELEASE_LOCKS/STEUERBLOCK/STEUERBLOCK__PB_CANCEL__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nLog_System_Schliessen;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0004/RELEASE_LOCKS/STEUERBLOCK/STEUERBLOCK__PB_CONNECT__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\ndeclare\n  v_User varchar2(30) := get_application_property(USERNAME);\n  v_Pwd  varchar2(30) := get_application_property(PASSWORD); \n  v_Con  varchar2(30) := get_application_property(CONNECT_STRING);\nbegin\n  if v_Con is null and :steuerblock.Database is not null then\n    v_Con := :steuerblock.Database;\n  end if;\n  logout;\n  logon('SYSTEM', :steuerblock.Password || '@' || v_Con, TRUE);\n  if not FORM_SUCCESS then\n    raise FORM_TRIGGER_FAILURE;\n  end if;\n  if Is_DBA then\n    Kill_session;\n    Log_System_Schliessen;\n  else\n    Message('You do not have the permission to kill this session!');\n    Log_System_Schliessen;\n  end if;\nexception\n  when OTHERS then\n    Message('Connection failed, try to reconnect ...');\n    logout;\n    logon(v_User, v_Pwd || '@' || v_Con, FALSE);\n    Log_System_Schliessen;\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0004/RELEASE_LOCKS/STEUERBLOCK/STEUERBLOCK__PB_EXIT__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nDo_Key('Exit_Form');\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0004/RELEASE_LOCKS/STEUERBLOCK/STEUERBLOCK__PB_REFRESH__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nRefresh;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0004/RELEASE_LOCKS/V$LOCK/V$LOCK__POST-QUERY.tgg",
    "content": "BEGIN\ndeclare\n  v_Mode_Case      int;\n  v_SQL_Address    v$session.SQL_Address%type;\n  v_SQL_Hash_Value v$session.SQL_Hash_Value%type;\nbegin\n  if :v$lock.Request = 0 then\n    if :v$lock.Block = 1 then\n      :v$lock.Holder_Waiter := 'Holder';\n    else\n      :v$lock.Holder_Waiter := 'Lock';\n    end if;\n    v_Mode_Case := :v$lock.LMode;\n  else\n    :v$lock.Holder_Waiter := 'Waiter';\n    v_Mode_Case := :v$lock.Request;\n  end if;\n  case v_Mode_Case\n    when 0 then :v$lock.Mode := 'none';\n    when 1 then :v$lock.Mode := 'null';\n    when 2 then :v$lock.Mode := 'row-S (SS)';\n    when 3 then :v$lock.Mode := 'row-X (SX)';\n    when 4 then :v$lock.Mode := 'share (S)';\n    when 5 then :v$lock.Mode := 'S/Row-X (SSX)';\n    when 6 then :v$lock.Mode := 'exclusive (X)';\n    else        :v$lock.Mode := '??';\n  end case;\n  if :v$lock.Type = 'TM' then\n    begin\n      select Owner || '.' || Object_Name\n        into :v$lock.Object\n        from dba_Objects\n       where Object_Id = :v$lock.Id1\n      ;\n    exception\n      when OTHERS then \n        ErrorMessage('Fehler bei \"select Owner.Object_Name from dba_Objects\".');\n    end;\n  end if;\n  begin\n    select Username, \n           decode(SQL_Hash_Value, 0, Prev_SQL_Addr,   SQL_Address)    SQL_Address, \n           decode(SQL_Hash_Value, 0, Prev_Hash_Value, SQL_Hash_Value) SQL_Hash_Value\n      into :v$lock.Username, v_SQL_Address, v_SQL_Hash_Value\n      from v$session\n     where SID = :v$lock.SID\n    ;\n  exception\n    when OTHERS then \n      ErrorMessage('Fehler bei \"select Username, ... from v$session\".');\n      raise NO_DATA_FOUND;\n  end;\n  begin\n    select SQL_Text into :v$lock.SQL_Text\n      from v$sqlarea\n     where Address = v_SQL_Address\n       and Hash_Value = v_SQL_Hash_Value\n    ;\n  exception\n    when OTHERS then \n      ErrorMessage('Fehler bei \"select SQL_Text from v$sqlarea\".');\n  end;\nexception\n  when NO_DATA_FOUND then null;\n  when FORM_TRIGGER_FAILURE then raise;\nend;\nEND;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0004/RELEASE_LOCKS/V$SESSION/V$SESSION__PB_KILL_SESSION__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\ndeclare\n  v_Anzahl   number(1);\n  v_User     varchar2(30);\nbegin\n  if :v$session.SID is null then\n    Message('No session to kill');\n    Message('No session to kill');\n  else\n    if Show_Alert('Daten_Verloren_Warnung') = ALERT_BUTTON1 then -- OK\n      if Is_DBA then\n        Kill_session;\n      else\n        Set_Item_Property('steuerblock.Database', VISIBLE, PROPERTY_FALSE);\n        Go_Item('steuerblock.Password');\n      end if;\n    end if;\n  end if;\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0004/RELEASE_LOCKS/metadata.json",
    "content": "{\n  \"alerts\": [\n    \"DATEN_VERLOREN_WARNUNG\"\n  ],\n  \"blocks\": [\n    {\n      \"name\": \"V$LOCK\",\n      \"items\": [\n        \"HOLDER_WAITER\",\n        \"USERNAME\",\n        \"SID\",\n        \"MODE\",\n        \"SQL_TEXT\",\n        \"OBJECT\",\n        \"ID1\",\n        \"ID2\",\n        \"LMODE\",\n        \"REQUEST\",\n        \"CTIME\",\n        \"BLOCK\",\n        \"TYPE\"\n      ]\n    },\n    {\n      \"name\": \"V$SESSION\",\n      \"items\": [\n        \"SID\",\n        \"SERIAL#\",\n        \"LOGON_TIME\",\n        \"USERNAME\",\n        \"STATUS\",\n        \"OSUSER\",\n        \"PROGRAM\",\n        \"MACHINE\",\n        \"PB_KILL_SESSION\"\n      ]\n    },\n    {\n      \"name\": \"STEUERBLOCK\",\n      \"items\": [\n        \"PB_REFRESH\",\n        \"PASSWORD\",\n        \"DATABASE\",\n        \"PB_CONNECT\",\n        \"PB_CANCEL\",\n        \"PB_EXIT\"\n      ]\n    }\n  ],\n  \"lovs\": []\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0005/TIMEOUTPJC_TEST/PL_RESET_FORMSTIMER_ITEMS.pcd",
    "content": "PROCEDURE pl_reset_formstimer_items IS\nBEGIN\n   :when_timer_expired_event := null;\n   :when_custom_item_event := null;\n   :custom_time := null;\n   :expired_time := null;\n   :starttime := :system.current_datetime;\n   :timername := 'FormsTimer';  \n   synchronize;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0005/TIMEOUTPJC_TEST/PL_START.pcd",
    "content": "PROCEDURE pl_start IS\nBEGIN\n\n:when_timer_expired_event := null;\n:when_custom_item_event := null;\n:custom_time := null;\n:expired_time := null;\n:starttime := :system.current_datetime;\nsynchronize;\n\nset_custom_property('WEBUTIL.WEBUTIL_TIMER_FUNCTIONS',1,'TIMER_NAME',:timername); \n\nif :standardtimer is not null\n  then\n    set_custom_property('WEBUTIL.WEBUTIL_TIMER_FUNCTIONS',1,'ENABLE_STANDARDTIMER',:standardtimer);\nend if;\n\nif :intervaltimer is not null\n  then\n    set_custom_property('WEBUTIL.WEBUTIL_TIMER_FUNCTIONS',1,'ENABLE_INTERVALTIMER',:intervaltimer);\nend if;\n\nif :events = 'true'\n  then\n    set_custom_property('WEBUTIL.WEBUTIL_TIMER_FUNCTIONS',1,'RECORDING_EVENTS','ALL');\n  else\n    set_custom_property('WEBUTIL.WEBUTIL_TIMER_FUNCTIONS',1,'RECORDING_EVENTS','');\nend if;\n\nset_custom_property('WEBUTIL.WEBUTIL_TIMER_FUNCTIONS',1,'ENABLE_DEBUGGING',:debug);\n\nset_custom_property('WEBUTIL.WEBUTIL_TIMER_FUNCTIONS',1,'TIMER_SLEEP_TIME',:sleeptime);  -- ms\n\nset_custom_property('WEBUTIL.WEBUTIL_TIMER_FUNCTIONS',1,'START_TIMER',:maxinactivity); \n\n\n\n\n   \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0005/TIMEOUTPJC_TEST/PL_WHEN_CUSTOM_ITEM_EVENT.pcd",
    "content": "PROCEDURE pl_when_custom_item_event IS\n\n  vch_eventName      varchar2(100); \n  timer_name         varchar2(100);\n  timer_id           timer;\n\nbegin  \n  vch_eventName      := name_in('system.custom_item_event');\n  :when_custom_item_event := vch_eventName;\n  :custom_time := :System.Current_Datetime;\n  \n  if instr(vch_eventName,':ST',1,1) > 0\n  then\n \n   timer_name := substr(vch_eventName,instr(vch_eventName,':',1,1)+1);\n   timer_id := find_timer(timer_name);\n   if id_null(timer_id) then \n    timer_id := create_timer(timer_name,1,no_repeat);\n   else \n    set_timer(timer_name,1, no_repeat);\n   end if;\n  end if;    \n  \n  \n \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0005/TIMEOUTPJC_TEST/TEST/TEST__DEBUG__WHEN-CHECKBOX-CHANGED.tgg",
    "content": "BEGIN\nset_custom_property('WEBUTIL.WEBUTIL_TIMER_FUNCTIONS',1,'ENABLE_DEBUGGING',:debug);\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0005/TIMEOUTPJC_TEST/TEST/TEST__FORMSTIMER500__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\ndeclare \n  timer_name varchar2(100);\n  timer_id   timer;\n\nbegin  \n\n   pl_reset_formstimer_items;\n\n   timer_name := 'FormsTimer';\n   timer_id := find_timer(timer_name);\n   if id_null(timer_id) then \n    timer_id := create_timer(timer_name,500,no_repeat);\n   else \n    set_timer(timer_name,500, no_repeat);\n   end if;\nend; \n   \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0005/TIMEOUTPJC_TEST/TEST/TEST__FORMSTIMER60000__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\ndeclare \n  timer_name varchar2(100);\n  timer_id   timer;\n\nbegin  \n   timer_name := 'FormsTimer';\n   pl_reset_formstimer_items;\n\n   timer_id := find_timer(timer_name);\n   if id_null(timer_id) then \n    timer_id := create_timer(timer_name,60000,no_repeat);\n   else \n    set_timer(timer_name,60000, no_repeat);\n   end if;\nend; \n   \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0005/TIMEOUTPJC_TEST/TEST/TEST__FORMS_TIMER1000__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\ndeclare \n  timer_name varchar2(100);\n  timer_id   timer;\n\nbegin  \n\n   pl_reset_formstimer_items;\n   timer_name := 'FormsTimer';\n\n   timer_id := find_timer(timer_name);\n   if id_null(timer_id) then \n    timer_id := create_timer(timer_name,1000,no_repeat);\n   else \n    set_timer(timer_name,1000, no_repeat);\n   end if;\nend; \n   \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0005/TIMEOUTPJC_TEST/TEST/TEST__FORMS_TIMER5000__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\ndeclare \n  timer_name varchar2(100);\n  timer_id   timer;\n\nbegin  \n\n   pl_reset_formstimer_items;\n   timer_name := 'FormsTimer';\n\n   timer_id := find_timer(timer_name);\n   if id_null(timer_id) then \n    timer_id := create_timer(timer_name,5000,no_repeat);\n   else \n    set_timer(timer_name,5000, no_repeat);\n   end if;\nend; \n   \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0005/TIMEOUTPJC_TEST/TEST/TEST__ITEM28__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\n   :when_timer_expired_event := null;\n   :when_custom_item_event := null;\n   :custom_time := null;\n   :expired_time := null;\n   :starttime := :system.current_datetime;\n   :timername := 'ST';  \n   synchronize;\nset_custom_property('WEBUTIL.WEBUTIL_TIMER_FUNCTIONS',1,'END_TIMER','');\n\n    -- Beispiel für das Aufrufen von OULOOK via JAVA Script \n    --web.javascript_eval_expr('document.getElementById(\"closeprofi\").value=\"unprotect\"');\n    --web.javascript_eval_expr('window.open(\"mailto:test@example.com?subject=subject&body=body\",\"_self\")');\n    --web.javascript_eval_expr('document.getElementById(\"closeprofi\").value=\"protect\"');\n   \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0005/TIMEOUTPJC_TEST/TEST/TEST__PRESET1__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\n:maxinactivity := 500;\n:sleeptime := 100;\n:debug := 'true';\n:events := 'true';\n:timername := 'ST500ms';\n:intervaltimer := '';\n:standardtimer := 'true';\npl_start;\n\n   \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0005/TIMEOUTPJC_TEST/TEST/TEST__PRESET2__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\n:maxinactivity := 2000;\n:sleeptime := 100;\n:debug := 'true';\n:events := 'true';\n:timername := 'ST2000ms';\n:intervaltimer := '';\n:standardtimer := 'true';\npl_start;\n \n   \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0005/TIMEOUTPJC_TEST/TEST/TEST__PRESET3__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\n:maxinactivity := 10000;\n:sleeptime := 1000;\n:debug := 'true';\n:events := 'true';\n:timername := 'IT_10s_1s';\n:intervaltimer := 'true';\n:standardtimer := '';\npl_start;\n   \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0005/TIMEOUTPJC_TEST/TEST/TEST__PRESET4__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\n:maxinactivity := 60000;\n:sleeptime := 10000;\n:debug := 'true';\n:events := 'true';\n:timername := 'IT_60s_10s';\n:intervaltimer := 'true';\n:standardtimer := '';\npl_start;\n   \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0005/TIMEOUTPJC_TEST/TEST/TEST__PRESET5__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\n:maxinactivity := 3600000;\n:sleeptime := 240000;\n:debug := 'true';\n:events := 'true';\n:timername := 'IT_60min_4min';\n:intervaltimer := 'true';\n:standardtimer := '';\npl_start;\n   \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0005/TIMEOUTPJC_TEST/TEST/TEST__PRESET6__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\n:maxinactivity := 36000000;\n:sleeptime := 10000;\n:debug := 'true';\n:events := 'true';\n:timername := 'RT_10h_10s';\n:intervaltimer := 'true';\n:standardtimer := '';\npl_start;   \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0005/TIMEOUTPJC_TEST/TEST/TEST__PRESET7__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\n:maxinactivity := 36000000;\n:sleeptime := 60000;\n:debug := 'true';\n:events := 'true';\n:timername := 'RT_10h_1min';\n:intervaltimer := 'true';\n:standardtimer := '';\npl_start;\n   \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0005/TIMEOUTPJC_TEST/TEST/TEST__STARTTIMER__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\npl_start;\n \n   \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0005/TIMEOUTPJC_TEST/TIMEOUTPJC_TEST/ON-LOGON.tgg",
    "content": "BEGIN\nnull;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0005/TIMEOUTPJC_TEST/TIMEOUTPJC_TEST/WHEN-NEW-FORM-INSTANCE.tgg",
    "content": "BEGIN\n--webutil_start_profi_radio_11g;\ngo_item('MAXINACTIVITY');\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0005/TIMEOUTPJC_TEST/TIMEOUTPJC_TEST/WHEN-NEW-ITEM-INSTANCE.tgg",
    "content": "BEGIN\nif :whennewiteminstancefires = 'true'\n  then\n    set_custom_property('WEBUTIL.WEBUTIL_TIMER_FUNCTIONS',1,'FORMS_WHEN_NEW_ITEM_INSTANCE','');\nend if;    \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0005/TIMEOUTPJC_TEST/TIMEOUTPJC_TEST/WHEN-TIMER-EXPIRED.tgg",
    "content": "BEGIN\ndeclare   \n  \n  vch_timer              varchar2(200);\n   \n  begin\n    \n    vch_timer := get_application_property(TIMER_NAME);\n    :WHEN_TIMER_EXPIRED_EVENT := vch_timer || ' has fired';\n    :expired_time :=  :System.Current_Datetime;\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0005/TIMEOUTPJC_TEST/WEBUTIL/WEBUTIL__DUMMY__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nif :system.cursor_block = 'WEBUTIL' then \n  next_block;\nend if;\nWebUtil_Core.ShowBeans(false);\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0005/TIMEOUTPJC_TEST/WEBUTIL/WEBUTIL__WEBUTIL_BROWSER_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0005/TIMEOUTPJC_TEST/WEBUTIL/WEBUTIL__WEBUTIL_CLIENTINFO_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0005/TIMEOUTPJC_TEST/WEBUTIL/WEBUTIL__WEBUTIL_C_API_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0005/TIMEOUTPJC_TEST/WEBUTIL/WEBUTIL__WEBUTIL_FILETRANSFER_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0005/TIMEOUTPJC_TEST/WEBUTIL/WEBUTIL__WEBUTIL_FILE_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0005/TIMEOUTPJC_TEST/WEBUTIL/WEBUTIL__WEBUTIL_HOST_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0005/TIMEOUTPJC_TEST/WEBUTIL/WEBUTIL__WEBUTIL_SESSION_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0005/TIMEOUTPJC_TEST/WEBUTIL/WEBUTIL__WEBUTIL_TIMER_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\npl_when_custom_item_event;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0005/TIMEOUTPJC_TEST/metadata.json",
    "content": "{\n  \"alerts\": [\n    \"WEBUTIL_ERROR\"\n  ],\n  \"blocks\": [\n    {\n      \"name\": \"TEST\",\n      \"items\": [\n        \"MAXINACTIVITY\",\n        \"SLEEPTIME\",\n        \"DEBUG\",\n        \"TIMERNAME\",\n        \"EVENTS\",\n        \"ITEM28\",\n        \"INTERVALTIMER\",\n        \"WHEN_CUSTOM_ITEM_EVENT\",\n        \"WHEN_TIMER_EXPIRED_EVENT\",\n        \"STANDARDTIMER\",\n        \"PRESET1\",\n        \"PRESET2\",\n        \"PRESET3\",\n        \"PRESET4\",\n        \"PRESET5\",\n        \"PRESET6\",\n        \"PRESET7\",\n        \"WHENNEWITEMINSTANCEFIRES\",\n        \"FORMSTIMER500\",\n        \"FORMS_TIMER1000\",\n        \"FORMS_TIMER5000\",\n        \"FORMSTIMER60000\",\n        \"STARTTIME\",\n        \"CUSTOM_TIME\",\n        \"EXPIRED_TIME\",\n        \"STARTTIMER\"\n      ]\n    },\n    {\n      \"name\": \"WEBUTIL\",\n      \"items\": [\n        \"DUMMY\",\n        \"WEBUTIL_CLIENTINFO_FUNCTIONS\",\n        \"WEBUTIL_FILE_FUNCTIONS\",\n        \"WEBUTIL_HOST_FUNCTIONS\",\n        \"WEBUTIL_SESSION_FUNCTIONS\",\n        \"WEBUTIL_FILETRANSFER_FUNCTIONS\",\n        \"WEBUTIL_C_API_FUNCTIONS\",\n        \"WEBUTIL_BROWSER_FUNCTIONS\",\n        \"WEBUTIL_TIMER_FUNCTIONS\"\n      ]\n    }\n  ],\n  \"lovs\": []\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0006/TIMEOUT_SYS_CLIENT_IDL/DEMOBLOCK/DEMOBLOCK__BUT_CLOSE_FORM__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nexit_form(no_validate);\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0006/TIMEOUT_SYS_CLIENT_IDL/DEMOBLOCK/DEMOBLOCK__DEMO_1__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\n-- idle heartbeat time (sec)\n:heartbeat := 10;\n\n-- idle max_time (sec)\n:max_time := 10;\n\n:parameter.p_timer_countdown := null;\n:countdown:=1;\n\np_clear_diagnostic_items;\n\n-- Set Client Idle Timer (sec)\nSET_APPLICATION_PROPERTY(CLIENT_IDLE_TIME,10);\n\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0006/TIMEOUT_SYS_CLIENT_IDL/DEMOBLOCK/DEMOBLOCK__DEMO_2__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\n-- idle heartbeat time (sec)\n:heartbeat := 10;\n\n-- idle max_time (sec)\n:max_time := 30;\n\n\n:parameter.p_timer_countdown := null;\n:countdown := 3;\n\np_clear_diagnostic_items;\n-- Set Client Idle Timer (sec)\nSET_APPLICATION_PROPERTY(CLIENT_IDLE_TIME,10);\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0006/TIMEOUT_SYS_CLIENT_IDL/DEMOBLOCK/DEMOBLOCK__DEMO_3__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\n-- idle heartbeat time (sec)\n:heartbeat := 60;\n\n-- idle max_time (sec)\n:max_time := 300;\n\n:parameter.p_timer_countdown := null;\n:countdown := 5;\n\np_clear_diagnostic_items;\n-- Set Client Idle Timer to 5 Seconds for an initial start\nSET_APPLICATION_PROPERTY(CLIENT_IDLE_TIME,60);\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0006/TIMEOUT_SYS_CLIENT_IDL/F_GET_TIMER_VALUE.fun",
    "content": "-- Get the time in ms from 23.10.2015 until this moment\n\nFUNCTION f_get_timer_value RETURN number IS\n  out_result number;\nbegin\n        select extract(day from(systimestamp - to_timestamp('2015-10-23', 'YYYY-MM-DD'))) * 86400000 \n            + to_number(to_char(sys_extract_utc(systimestamp), 'SSSSSFF3'))\n        into out_result\n        from dual;\n        return out_result;\nend f_get_timer_value;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0006/TIMEOUT_SYS_CLIENT_IDL/P_CLEAR_DIAGNOSTIC_ITEMS.pcd",
    "content": "PROCEDURE p_clear_diagnostic_items IS\nBEGIN\n  :stoptime       := '?';\n  :result         := '?';\n  :idle_heartbeat := '?';\n  :time_left      := '?';\n  :max_inactivity := '?';\n  \n  :parameter.p_timer_starttime := f_get_timer_value;\n  :starttime      := to_char(:parameter.p_timer_starttime) || ' ms since 23rd October 2015';\n  :last_action_event := 'Demo started ' || to_char(sysdate,'HH24:MI:SS');\n  :start_date := sysdate;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0006/TIMEOUT_SYS_CLIENT_IDL/TIMEOUT_SYS_CLIENT_IDL/PRE-FORM.tgg",
    "content": "BEGIN\nSET_APPLICATION_PROPERTY(CLIENT_IDLE_TIME,0);\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0006/TIMEOUT_SYS_CLIENT_IDL/metadata.json",
    "content": "{\n  \"alerts\": [],\n  \"blocks\": [\n    {\n      \"name\": \"DEMOBLOCK\",\n      \"items\": [\n        \"BUT_CLOSE_FORM\",\n        \"DEMO_1\",\n        \"DEMO_2\",\n        \"DEMO_3\",\n        \"STARTTIME\",\n        \"STOPTIME\",\n        \"RESULT\",\n        \"IDLE_HEARTBEAT\",\n        \"MAX_INACTIVITY\",\n        \"TIME_LEFT\",\n        \"LAST_ACTION_EVENT\",\n        \"HEARTBEAT\",\n        \"MAX_TIME\",\n        \"COUNTDOWN\",\n        \"START_DATE\"\n      ]\n    }\n  ],\n  \"lovs\": []\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0007/CD_DEMO_EXCEL/ALL_OBJECTS/ALL_OBJECTS__BT_ALL__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nset_block_property('ALL_OBJECTS',DEFAULT_WHERE,'where owner = ''SYS'' and rownum < 1001'); \nexecute_query;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0007/CD_DEMO_EXCEL/ALL_OBJECTS/ALL_OBJECTS__BT_PACKAGES__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nset_block_property('ALL_OBJECTS',DEFAULT_WHERE,'where owner = ''SYS'' and object_type = ''PACKAGE'''); \nexecute_query;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0007/CD_DEMO_EXCEL/ALL_OBJECTS/ALL_OBJECTS__BT_TABLES__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nset_block_property('ALL_OBJECTS',DEFAULT_WHERE,'where owner = ''SYS'' and object_type = ''TABLE'''); \nexecute_query;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0007/CD_DEMO_EXCEL/ALL_OBJECTS/ALL_OBJECTS__CALL_EXCEL__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\ndeclare vch_return_value varchar2(2000);\n\nbegin\n:last_query := get_block_property('ALL_OBJECTS',last_query);\nvch_return_value := pdw_temp_blob_export.f_make_blob(:last_query,'EXCEL');\nsynchronize;\np_get_blob('EXCEL');\n\nif vch_return_value != '0' \n  then\n    message(vch_return_value);\nend if;\n\npdw_temp_blob_export.p_drop_blob;\n\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0007/CD_DEMO_EXCEL/CD_DEMO_EXCEL/WHEN-NEW-FORM-INSTANCE.tgg",
    "content": "BEGIN\nexecute_query;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0007/CD_DEMO_EXCEL/CD_DEMO_EXCEL/WHEN-WINDOW-CLOSED.tgg",
    "content": "BEGIN\nexit_form;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0007/CD_DEMO_EXCEL/P_GET_BLOB.pcd",
    "content": "PROCEDURE p_get_blob(p_type in varchar2) IS\n  boolean_success boolean;\n  vch_file_bez  varchar2(500);\n  vch_dir_and_file varchar2(500);\n\nBEGIN\n  vch_file_bez :=  'Exceltest_' || to_char(sysdate,'YYYYDDMM_HH24MISS')||  '.' ||'csv';\n \n  vch_dir_and_file := webutil_clientinfo.get_system_property('user.home')|| '\\' || vch_file_bez;\n  --message('Dir=' || vch_dir_and_file || ' ID=' || p_id);\n\n  -- Anzeige des Dokumentes\n  if vch_dir_and_file is not null\n  then\n\n     -- #3 Webutil Donwload nur wenn das Dokument nicht bereits geladen ist, sonst nur Aufruf\n     if not webutil_file.FILE_EXISTS(vch_dir_and_file)\n       then\n        boolean_success := webutil_file_transfer.DB_To_Client_with_progress\n                                        (clientFile      =>  vch_dir_and_file\n                                        ,tableName       => 'TEMP_BLOB_EXPORT'\n                                        ,columnName      => 'TBE_COL'\n                                        ,whereClause     => 'TBE_TYPE=''' || p_type || '''' \n                                        ,progressTitle   => 'Dokument wird geladen'\n                                        ,progressSubTitle=> 'Bitte Warten'\n                                      );\n\n    end if;  \n    \n    -- Nach erfolgreichem \"Runterladen\" wird die Datei mit der verknüpften Anwendung auf dem PC gestartet\n    if webutil_file.FILE_EXISTS(vch_dir_and_file) or boolean_success\n     then\n        --WEBUTIL_CLIENT_FUNCTIONS.HOST('cmd /c rundll32.exe url.dll,FileProtocolHandler \"'||vch_dir_and_file||'\"',NO_SCREEN);\n        --Client_Host( 'cmd /c start \"\" \"' || vch_dir_and_file || '\"');\n        --  pdw_webutil_blobtab.p_update_status ( p_ind    => p_id,  p_status => 'Y');\n        -- #3 Aufruf wie in dokument.fmb\n        webutil_host.NonBlocking( 'rundll32 url.dll,FileProtocolHandler ' || vch_dir_and_file);\n      else\n        message('Not result for Excel File Generation.'); --Fehler in p_get_blob : Dokument ' || vch_dir_and_file || ' konnte nicht geladen werden!');\n    end if;\n  \n  end if;\n  \n  \n  exception\n    when others\n    then\n      message('The Excel File did not succeed : '||sqlerrm);\n\nEND;\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0007/CD_DEMO_EXCEL/WEBUTIL/WEBUTIL__DUMMY__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nif :system.cursor_block = 'WEBUTIL' then \n  next_block;\nend if;\nWebUtil_Core.ShowBeans(false);\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0007/CD_DEMO_EXCEL/WEBUTIL/WEBUTIL__WEBUTIL_BROWSER_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0007/CD_DEMO_EXCEL/WEBUTIL/WEBUTIL__WEBUTIL_CLIENTINFO_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0007/CD_DEMO_EXCEL/WEBUTIL/WEBUTIL__WEBUTIL_C_API_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0007/CD_DEMO_EXCEL/WEBUTIL/WEBUTIL__WEBUTIL_FILETRANSFER_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0007/CD_DEMO_EXCEL/WEBUTIL/WEBUTIL__WEBUTIL_FILE_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0007/CD_DEMO_EXCEL/WEBUTIL/WEBUTIL__WEBUTIL_HOST_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0007/CD_DEMO_EXCEL/WEBUTIL/WEBUTIL__WEBUTIL_SESSION_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0007/CD_DEMO_EXCEL/metadata.json",
    "content": "{\n  \"alerts\": [\n    \"WEBUTIL_ERROR\"\n  ],\n  \"blocks\": [\n    {\n      \"name\": \"ALL_OBJECTS\",\n      \"items\": [\n        \"OWNER\",\n        \"OBJECT_NAME\",\n        \"OBJECT_ID\",\n        \"STATUS\",\n        \"SUBOBJECT_NAME\",\n        \"OBJECT_TYPE\",\n        \"CREATED\",\n        \"CALL_EXCEL\",\n        \"LAST_QUERY\",\n        \"BT_TABLES\",\n        \"BT_PACKAGES\",\n        \"BT_ALL\"\n      ]\n    },\n    {\n      \"name\": \"WEBUTIL\",\n      \"items\": [\n        \"DUMMY\",\n        \"WEBUTIL_CLIENTINFO_FUNCTIONS\",\n        \"WEBUTIL_FILE_FUNCTIONS\",\n        \"WEBUTIL_HOST_FUNCTIONS\",\n        \"WEBUTIL_SESSION_FUNCTIONS\",\n        \"WEBUTIL_FILETRANSFER_FUNCTIONS\",\n        \"WEBUTIL_C_API_FUNCTIONS\",\n        \"WEBUTIL_BROWSER_FUNCTIONS\"\n      ]\n    }\n  ],\n  \"lovs\": []\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0008/LATENCY_TEST/F_GET_CURRENT_TIME_MS.fun",
    "content": "function f_get_current_time_ms return number\n\n/* DOK:=================================================================================================\n * Bezeichnung      :  Funktion f_current_time_ms\n * Inhalt            :  Ermittlung eines Zeitstempels in ms\n *\n * Returnwert        :  -/-\n * Autor            :  F.Hoffmann / Cologne Data\n * Erstellungsdatum  :  31.03.2017\n * Änd-Nr.  Datum         Name         Beschreibung\n * -----------------------------------------------------------------------------------------------------------------------------\n *     1    21.1.2018    Fhoffmann   Optimization by PGutiérrez \n*/\n\n    is\n        out_result number;\n    begin\n        out_result := JAVA_SYSTEM.CURRENTTIMEMILLIS;\n        --select extract(day from(systimestamp - to_timestamp('2017-01-01', 'YYYY-MM-DD'))) * 86400000 \n        --    + to_number(to_char(sys_extract_utc(systimestamp), 'SSSSSFF3'))\n        --into out_result\n        --from dual;\n        return out_result;\n    end f_get_current_time_ms;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0008/LATENCY_TEST/LATENCY_TEST/ON-LOGON.tgg",
    "content": "BEGIN\nbegin null; end;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0008/LATENCY_TEST/LATENCY_TEST/WHEN-NEW-FORM-INSTANCE.tgg",
    "content": "BEGIN\ndeclare webutil_timer timer;\nbegin\n:TEST.VERSION := 'Forms Version '||GET_APPLICATION_PROPERTY(VERSION);\nwebutil_timer:= CREATE_TIMER('WEBUTIL',3500,NO_REPEAT);\nend;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0008/LATENCY_TEST/LATENCY_TEST/WHEN-TIMER-EXPIRED.tgg",
    "content": "BEGIN\ndeclare   \n\n/* DOK:===============================================================================================================================================================\n * Bezeichnung      :  Trigger WHEN-TIMER-EXPIRED\n * Inhalt            :  \n *\n * Returnwert        :  -/-\n * Autor            :  F.Hoffmann / Cologne Data\n * Erstellungsdatum  :  11.09.2014\n * Änd-Nr.  Datum         Name         Beschreibung\n * -------------------------------------------------------------------------------------------------------------------------------------------------------------------\n *      1     9.9.2015    HOFFMANNF   OT-64520 Timer berücksichtigt Zeiten für Inaktivitäten nicht, Neu: Prüfung ob formswebutil.jar und profi jacob.jar geladen sind\n *       \n*/\n  \n  vch_timer              varchar2(200);\n  vch_log_check          varchar2(30);\n   \n  begin\n    \n    vch_timer := get_application_property(TIMER_NAME);\n\n    -- Webutil Einmaliger Aufruf zum Systemstart   \n    if vch_timer = 'WEBUTIL'\n      then\n        P_WHEN_NEW_FORM_INSTANCE;\n      else\n        -- form wird geschlossen\n        message('Exit!!');\n        exit_form(no_validate);\n     end if;\n      \n             \n   \n \nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0008/LATENCY_TEST/P_DOWNLOAD_DOKUMENT_AS.pcd",
    "content": "PROCEDURE p_download_dokument_as(p_dokument in varchar2) is\n\n  vch_dokument varchar2(100) := :parameter.p_dokument_name;\n  boolean_success boolean;\n  vch_client_dir_and_file varchar2(500); \n  vch_server_dir_and_file varchar2(500);\n  vch_server_dir varchar2(200) := :parameter.p_working_directory;\n  vch_user_home varchar2(200) :=  :parameter.p_userhome;\n  vch_slash varchar2(1);\n\nbegin\n\n    -- Defaultbelegung von Verzeichnissen und INI Dateien\n    vch_server_dir_and_file := webutil_get_as_tmp_dir || p_dokument;\n\n\n   vch_client_dir_and_file := vch_user_home|| '\\' || p_dokument;\n\n  :status := 'Copy: '|| vch_client_dir_and_file;\n  \n  boolean_success := \n    webutil_file_transfer.as_To_Client(\n            serverfile    => vch_server_dir_and_file,\n            clientfile    => vch_client_dir_and_file);\n  if not boolean_success then\n    :status := 'Error : ' || vch_server_dir_and_file || ' nach ' || vch_client_dir_and_file;\n    raise form_trigger_failure;  \n  end if;          \n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0008/LATENCY_TEST/P_WAIT_AND_EXIT.pcd",
    "content": "PROCEDURE P_WAIT_AND_EXIT IS\nBEGIN\n          -- Kurze Zeit um die Meldung sichtbar zu machen\n          for i in 1..100000000\n          loop\n            null;\n          end loop;  \n          exit_form(no_validate);\nEND;          "
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0008/LATENCY_TEST/P_WHEN_NEW_FORM_INSTANCE.pcd",
    "content": "PROCEDURE P_WHEN_NEW_FORM_INSTANCE IS\n  webutil_timer timer;\nBEGIN\n  :parameter.p_working_directory := webutil_browser.getappletparameter('WorkingDirectory');\n  :parameter.p_userhome := webutil_clientinfo.get_system_property('user.home');\n  --:parameter.p_use_testfile;\n \n  :status := 'Keyboardclick';\n  synchronize;\n  for i in 1..3\n  loop\n    :parameter.p_start := f_get_current_time_ms;\n    go_item('TASTATUR_1');\n    go_item('TASTATUR_2');\n    go_item('TASTATUR_3');\n    synchronize;\n    :parameter.p_stop := f_get_current_time_ms;\n    if i = 1 \n      then\n        :Tastatur_1 := webutil_get_latency(p_roundtrips_number=>3, p_estimated_time_ms=>1);\n     elsif i = 2 then\n        :Tastatur_2 := webutil_get_latency(p_roundtrips_number=>3, p_estimated_time_ms=>1);\n     else\n        :Tastatur_3 := webutil_get_latency(p_roundtrips_number=>3, p_estimated_time_ms=>1);\n     end if;\n     synchronize;\n  end loop; \n  :Tastatur_AVG := (:Tastatur_1+:Tastatur_2+:Tastatur_3) / 3;\n  synchronize;\n  go_item('TASTATUR_AVG');\n  \n    :status := 'Webutil Download: 1 KB';\n  p_download_dokument_as('test_01k.txt');\n  for i in 1..3\n  loop\n    synchronize;\n    :parameter.p_start := f_get_current_time_ms;\n    p_download_dokument_as('test_01k.txt');\n    :parameter.p_stop := f_get_current_time_ms;\n    if i = 1 \n      then\n        :DATEI_01KB_1 := webutil_get_latency(p_roundtrips_number=>4, p_estimated_time_ms=>1);\n     elsif i = 2 then\n        :DATEI_01KB_2 := webutil_get_latency(p_roundtrips_number=>4, p_estimated_time_ms=>1);\n     else\n        :DATEI_01KB_3 := webutil_get_latency(p_roundtrips_number=>4, p_estimated_time_ms=>1);\n     end if;\n  end loop; \n  :DATEI_01KB_AVG := (:DATEI_01KB_1+:DATEI_01KB_2+:DATEI_01KB_3) / 3;\n  go_item('DATEI_01KB_AVG');\n  \n  :status := 'Webutil Download: 16 KB';\n  p_download_dokument_as('test_16k.txt');\n  for i in 1..3\n  loop\n    synchronize;\n    :parameter.p_start := f_get_current_time_ms;\n    p_download_dokument_as('test_16k.txt');\n    :parameter.p_stop := f_get_current_time_ms;\n    if i = 1 \n      then\n        :DATEI_16KB_1 := webutil_get_latency(p_roundtrips_number=>4, p_estimated_time_ms=>5);\n     elsif i = 2 then\n        :DATEI_16KB_2 := webutil_get_latency(p_roundtrips_number=>4, p_estimated_time_ms=>5);\n     else\n        :DATEI_16KB_3 := webutil_get_latency(p_roundtrips_number=>4, p_estimated_time_ms=>5);\n     end if;\n  end loop; \n  :DATEI_16KB_AVG := (:DATEI_16KB_1+:DATEI_16KB_2+:DATEI_16KB_3) / 3;\n  go_item('DATEI_16KB_AVG');\n\n  :status := 'Webutil Download: 64 KB';\n  p_download_dokument_as('test_64k.txt');\n  for i in 1..3\n  loop\n    synchronize;\n    :parameter.p_start := f_get_current_time_ms;\n    p_download_dokument_as('test_64k.txt');\n    :parameter.p_stop := f_get_current_time_ms;\n    if i = 1 \n      then\n        :DATEI_64KB_1 := webutil_get_latency(p_roundtrips_number=>4, p_estimated_time_ms=>5);\n     elsif i = 2 then\n        :DATEI_64KB_2 := webutil_get_latency(p_roundtrips_number=>4, p_estimated_time_ms=>5);\n     else\n        :DATEI_64KB_3 := webutil_get_latency(p_roundtrips_number=>4, p_estimated_time_ms=>5);\n     end if;\n  end loop; \n  :DATEI_64KB_AVG := (:DATEI_64KB_1+:DATEI_64KB_2+:DATEI_64KB_3) / 3;\n  go_item('DATEI_64KB_AVG');\n  \n  :status := 'Latencycheck finished';\n  :ergebnis := 'The average latency is ' || to_char(round((:tastatur_avg+:DATEI_01KB_AVG+:DATEI_16KB_AVG+:DATEI_64KB_AVG)/4,2)) || ' ms';\n  webutil_timer:= CREATE_TIMER('EXIT',25000,NO_REPEAT);\n \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0008/LATENCY_TEST/WEBUTIL/WEBUTIL__DUMMY__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nif :system.cursor_block = 'WEBUTIL' then \n  next_block;\nend if;\nWebUtil_Core.ShowBeans(false);\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0008/LATENCY_TEST/WEBUTIL/WEBUTIL__WEBUTIL_BROWSER_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0008/LATENCY_TEST/WEBUTIL/WEBUTIL__WEBUTIL_CLIENTINFO_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0008/LATENCY_TEST/WEBUTIL/WEBUTIL__WEBUTIL_C_API_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0008/LATENCY_TEST/WEBUTIL/WEBUTIL__WEBUTIL_FILETRANSFER_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0008/LATENCY_TEST/WEBUTIL/WEBUTIL__WEBUTIL_FILE_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0008/LATENCY_TEST/WEBUTIL/WEBUTIL__WEBUTIL_HOST_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0008/LATENCY_TEST/WEBUTIL/WEBUTIL__WEBUTIL_SESSION_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0008/LATENCY_TEST/WEBUTIL_GET_AS_TMP_DIR.fun",
    "content": "FUNCTION webutil_get_as_tmp_dir RETURN VARCHAR2 IS\nBEGIN\n    return('C:\\temp\\');\nend;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0008/LATENCY_TEST/WEBUTIL_GET_LATENCY.fun",
    "content": "FUNCTION webutil_get_latency (p_roundtrips_number in number, p_estimated_time_ms in number) RETURN NUMBER IS\n\n/* DOK:=====================================================================================================================\n * Bezeichnung       :  webutil_get_latency\n * Inhalt            :  Berechnung der Latenzzeit für die jeweilige Messung\n *\n * Paramter              p_roundtrips_number, Anzahl der Roundtrips für die Messung\n *                      p_estimated_time_ms, Prozessdauer ohne Latenzen \n * \n * Autor             :  F.Hoffmann / Cologne Data\n * Erstellungsdatum  :  31.03.2017\n *\n * Änd-Nr.  Datum        Name        Beschreibung\n * --------------------------------------------------------------------------------------------------------------------------\n *  1       \n*/\n\nBEGIN\n  \n  return (to_number(name_in(':parameter.p_stop') - to_number(name_in('parameter.p_start') - p_estimated_time_ms)) / p_roundtrips_number);  -- Differenz in Millisekunden abzüglich Verzögerung in Millisekunden und datenbankzugriffe für 20 Roundtrips\n  \nEND;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0008/LATENCY_TEST/WEBUTIL_PREPARE_TESTFILE.pcd",
    "content": "PROCEDURE webutil_prepare_testfile IS\n/* DOK:================================================================================================\n * Bezeichnung       :  webutil_prepare_profi_testfile\n * Inhalt            :  Diese Prozedur dient der Testdateienerstellung für den Latenztest\n * Autor             :  F.Hoffmann / Cologne Data\n * Erstellungsdatum  :  07.04.2015\n *\n * Änd-Nr.  Datum        Name        Beschreibung\n * ----------------------------------------------------------------------------------------------------\n*/\n\n  -- webutil add_on\n  vch_temp_verzeichnis    varchar2(200);\n\n  vch_dateiname_1k         varchar2(50) := 'test_01k.txt';\n  vch_dateiname_16k        varchar2(50) := 'test_16k.txt';\n  vch_dateiname_64k        varchar2(50) := 'test_64k.txt';\n  \n  vch_slash                varchar2(1);\n\n  bol_success              boolean;\n  bol_falsche_konfig       boolean := false;\n  \n  ftype text_io.file_type;\n\n\n\nbegin\n    -- Unterscheidung MAC-OS, Linux etc. \"\\\" oder Windows File-System \"/\"\n    vch_slash := webutil_clientinfo.get_file_separator;\n   \n    -- Defaultbelegung von Verzeichnissen und INI Dateien\n    vch_temp_verzeichnis := webutil_get_as_tmp_dir;\n\n    :status := vch_temp_verzeichnis || vch_dateiname_1k;\n\n    if not webutil_file.file_exists(vch_temp_verzeichnis  || vch_dateiname_1k)\n    then\n      ftype := text_io.fopen(vch_temp_verzeichnis  || vch_dateiname_1k,'W');\n      text_io.put_line(ftype,'Testdatei 1 KB');\n      for i in 1..5\n      loop\n        text_io.put_line(ftype,'12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890');\n      end loop;\n     synchronize;\n     text_io.fclose(ftype); \n     synchronize;\n    end if;\n    \n    :status := vch_temp_verzeichnis || vch_dateiname_16k;\n\n    if not webutil_file.file_exists(vch_temp_verzeichnis || vch_dateiname_16k)\n    then\n      ftype := text_io.fopen(vch_temp_verzeichnis || vch_dateiname_16k,'W');\n      text_io.put_line(ftype,'Testdatei 16 KB');\n      for i in 1..80\n      loop\n        text_io.put_line(ftype,'12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890');\n      end loop;\n     synchronize;\n     text_io.fclose(ftype); \n     synchronize;\n    end if;\n\n    :status := vch_temp_verzeichnis || vch_slash  || vch_dateiname_64k;\n    \n    if not webutil_file.file_exists(vch_temp_verzeichnis || vch_dateiname_64k)\n    then \n     ftype := text_io.fopen(vch_temp_verzeichnis || vch_dateiname_64k,'W');\n     text_io.put_line(ftype,'Testdatei 64 KB');\n     for i in 1..320\n     loop\n       text_io.put_line(ftype,'12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890');\n     end loop;\n     synchronize;\n     text_io.fclose(ftype); \n     synchronize;\n   end if;        \nend;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0008/LATENCY_TEST/metadata.json",
    "content": "{\n  \"alerts\": [\n    \"WEBUTIL_ERROR\"\n  ],\n  \"blocks\": [\n    {\n      \"name\": \"TEST\",\n      \"items\": [\n        \"TASTATUR_1\",\n        \"TASTATUR_2\",\n        \"TASTATUR_3\",\n        \"TASTATUR_AVG\",\n        \"DATEI_01KB_1\",\n        \"DATEI_01KB_2\",\n        \"DATEI_01KB_3\",\n        \"DATEI_01KB_AVG\",\n        \"DATEI_16KB_1\",\n        \"DATEI_16KB_2\",\n        \"DATEI_16KB_3\",\n        \"DATEI_16KB_AVG\",\n        \"DATEI_64KB_1\",\n        \"DATEI_64KB_2\",\n        \"DATEI_64KB_3\",\n        \"DATEI_64KB_AVG\",\n        \"STATUS\",\n        \"ERGEBNIS\",\n        \"VERSION\"\n      ]\n    },\n    {\n      \"name\": \"WEBUTIL\",\n      \"items\": [\n        \"DUMMY\",\n        \"WEBUTIL_CLIENTINFO_FUNCTIONS\",\n        \"WEBUTIL_FILE_FUNCTIONS\",\n        \"WEBUTIL_HOST_FUNCTIONS\",\n        \"WEBUTIL_SESSION_FUNCTIONS\",\n        \"WEBUTIL_FILETRANSFER_FUNCTIONS\",\n        \"WEBUTIL_C_API_FUNCTIONS\",\n        \"WEBUTIL_BROWSER_FUNCTIONS\"\n      ]\n    }\n  ],\n  \"lovs\": []\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/BLK_HANDLG/BLK_HANDLG__BT_CHECK_SINGLE__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nBEGIN\n   \n   g.msg_push('W-B-P:BT_CHECK_SINGLE');\n\n   prc_set_statistik_SINGLE;\n   \n   g.msg_free;\n   \nEXCEPTION WHEN OTHERS THEN\n   prc_EXCEPTION;     \nEND;\n\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/BLK_HANDLG/BLK_HANDLG__BT_COMPILE_SINGLE__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nDECLARE\n  \n    l_fname_blank  VARCHAR2(128);\n    l_in_file      Text_IO.File_Type;\n    l_cnt            NUMBER(3);\n   \n-- 11.02.2017 - F.Matz\n\nBEGIN\n   \n   g.msg_push('W-B-P:BT_COMPILE_SINGLE');\n     \n    IF :BLK_HANDLG.FNAME IS NOT NULL         AND :BLK_HANDLG.CB='Y' AND \n        :BLK_HANDLG.FEXTENT IN ( 'FMB', 'PLL', 'MMB') AND \n       :BLK_HANDLG.STATUS_CHECK   <> 'ERROR' AND\n       :BLK_HANDLG.STATUS_MIGRATE <> 'ERROR' THEN\n        \n       l_fname_blank:= substr(:BLK_HANDLG.FNAME, 1, length(:BLK_HANDLG.FNAME)-4);\n\n      IF webutil_file.file_exists(:PARAMETER.P_COMP_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.fmx') THEN\n         IF webutil_file.delete_file(:PARAMETER.P_COMP_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.fmx') THEN\n             NULL;\n         END IF;\n      END IF;\n      \n      IF webutil_file.file_exists(:PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.fmb-compile.txt')   THEN\n         IF webutil_file.delete_file(:PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.fmb-compile.txt') THEN\n             NULL;\n         END IF;\n      END IF;\n\n      IF webutil_file.file_exists(:PARAMETER.P_COMP_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.plx') THEN\n         IF webutil_file.delete_file(:PARAMETER.P_COMP_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.plx') THEN\n             NULL;\n         END IF;\n      END IF;\n      \n      IF webutil_file.file_exists(:PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.plx-compile.txt')   THEN\n         IF webutil_file.delete_file(:PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.plx-compile.txt') THEN\n             NULL;\n         END IF;\n      END IF;\n\n      IF webutil_file.file_exists(:PARAMETER.P_COMP_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.mmx') THEN\n         IF webutil_file.delete_file(:PARAMETER.P_COMP_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.mmx') THEN\n             NULL;\n         END IF;\n      END IF;\n      \n      IF webutil_file.file_exists(:PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.mmx-compile.txt')   THEN\n         IF webutil_file.delete_file(:PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.mmx-compile.txt') THEN\n             NULL;\n         END IF;\n      END IF;\n      \n      IF webutil_file.file_exists(:PARAMETER.P_COMP_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.err')   THEN\n         IF webutil_file.delete_file(:PARAMETER.P_COMP_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.err') THEN\n             NULL;\n         END IF;\n      END IF;\n  \n      -- 23.02.2017 - F.Matz : FormsAPI Master Compile active --\n      pkg_FAM_RUN_Script.prc_run_batch_compile_cmd(:BLK_HANDLG.FNAME);\n  \n      prc_Set_Compile_result(:BLK_HANDLG.FNAME);\n\n      SYNCHRONIZE;\n                                                                                                                  \n      prc_Set_Compile_result(:BLK_HANDLG.FNAME);\n                           \n     -- 02.03.2017 : nicht gepr?ft --\n    ELSIF :BLK_HANDLG.FNAME IS NOT NULL AND :BLK_HANDLG.CB='Y' AND \n           :BLK_HANDLG.FEXTENT IN ('RDF') AND\n           :BLK_HANDLG.STATUS_CHECK   <> 'ERROR' AND\n            :BLK_HANDLG.STATUS_MIGRATE <> 'ERROR' THEN\n        \n        IF :PARAMETER.P_REPORTS_RUN='YES' THEN     \n           pkg_FAM_RUN_Script.prc_run_batch_comp_reports_cmd(:BLK_HANDLG.FNAME,replace(lower(:BLK_HANDLG.FNAME),'.rdf','.rep'));\n           prc_Set_Compile_result(:BLK_HANDLG.FNAME);\n        END IF;\n        \n    END IF;\n   \nEXCEPTION WHEN OTHERS THEN\n   prc_EXCEPTION;     \nEND;\n\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/BLK_HANDLG/BLK_HANDLG__BT_MIGRATE_SINGLE__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\n\n-- 11.02.2017, 14.05.2017 - F.Matz\n   \nBEGIN\n  \n   prc_MIGRATION;\n      \nEXCEPTION WHEN OTHERS THEN\n   prc_EXCEPTION;     \nEND;\n\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/BLK_HANDLG/BLK_HANDLG__BT_SELECT__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\n\n-- F.Matz: 02.02.2017\nDECLARE\n  l_set VARCHAR2(10);\nBEGIN\n    \n  go_block('BLK_HANDLG');\n  first_record;\n \n  IF :BLK_HANDLG.CB='Y' THEN\n     l_set := 'N';\n  ELSE\n     l_set:= 'Y';\n  END IF;  \n \n  LOOP    \n     :BLK_HANDLG.CB:= l_set;\n\n     go_block('BLK_HANDLG');\n\n     -- ${open}\n     -- pkg_BLK_DATA.prc_update_DATA(NAME_IN(:SYSTEM.CURRENT_BLOCK||'.'||'RNO'), 'BLK_HANDLG');\n\n     go_block('BLK_HANDLG');\n    \n     IF :SYSTEM.LAST_RECORD='TRUE' THEN\n        EXIT;\n      END IF;    \n      \n     next_record; \n     \n     SYNCHRONIZE;\n            \n  END LOOP;\n\n  go_block('BLK_HANDLG');\n  first_record;\n\nEXCEPTION WHEN OTHERS THEN\n   prc_EXCEPTION;\nEND;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/BLK_HANDLG/BLK_HANDLG__BT_VIEW_CHECK__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\n\n-- 11.02.2017 - F.Matz\n   \nBEGIN\n   \n   prc_view_file(:PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-check-all.log');\n   \nEXCEPTION WHEN OTHERS THEN\n  prc_EXCEPTION;          \nEND;\n\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/BLK_HANDLG/BLK_HANDLG__BT_VIEW_COMPILE__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\n\n    -- 11.02.2017 - F.Matz, 22.02.2017 - .err; 23.02.2017 - deactivated\n\nDECLARE\n  \n    l_fname_blank  VARCHAR2(128);\n    \nBEGIN\n      \n   prc_view_file(:PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-compile.txt');\n      \nEXCEPTION WHEN OTHERS THEN\n   prc_EXCEPTION;     \nEND;\n\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/BLK_HANDLG/BLK_HANDLG__BT_VIEW_MIGRATE__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\n\n-- 11.02.2017 - F.Matz\n   \nBEGIN\n  \n   prc_view_file(:PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||lower(:BLK_HANDLG.FNAME)||'-mig_main_one-all.log');\n   \nEXCEPTION WHEN OTHERS THEN\n   prc_EXCEPTION;     \nEND;\n\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/BLK_HANDLG/BLK_HANDLG__CBOX_FAM_ACTION__WHEN-LIST-CHANGED.tgg",
    "content": "BEGIN\n\n-- 16.01.2017 - F.Matz\nDECLARE  \n  l_action VARCHAR2(128);  \n  l_p1     VARCHAR2(1024); \n  l_p2     VARCHAR2(1024); \n  l_p3     VARCHAR2(1024); \n  l_p4     VARCHAR2(1024); \n  l_p5     VARCHAR2(1024); \n  l_p6     VARCHAR2(1024); \n  l_p7     VARCHAR2(1024); \n  \nBEGIN\n  \n  /* {obsolete}\n  \n   :CTL_UPGR.IT_PARAMETER:= NULL;\n   \n   IF :BLK_UPGR.CBOX_FAM_ACTION IS NOT NULL AND :BLK_UPGR.CB='Y' THEN \n            \n      l_action:= get_list_element_label('BLK_UPGR.CBOX_FAM_ACTION', :BLK_UPGR.CBOX_FAM_ACTION);\n        \n      pkg_FAM_LIBS.prc_get_Parameters4Script(l_action, l_p1, l_p2, l_p3, l_p4, l_p5, l_p6, l_p7);\n\n      IF l_p1 IS NOT NULL THEN\n         :CTL_UPGR.IT_PARAMETER:= l_p1;\n         prc_Visible_Item('CTL_UPGR.IT_PARAMETER');\n      ELSE\n         :CTL_UPGR.IT_PARAMETER:= NULL;\n         prc_Visible_Item('CTL_UPGR.IT_PARAMETER', FALSE);\n      END IF;\n      \n   END IF;\n  \n  */\n  NULL;\n  \nEND;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/BLK_HANDLG/BLK_HANDLG__CB__WHEN-CHECKBOX-CHANGED.tgg",
    "content": "BEGIN\n\nBEGIN\n  \n  /* {obsolete}\n  \n  g.p:= 'W-CB-C: BLK_UPGR.CB';\n \n  prc_flog('--- ACTION: '||g.p||' ---', p_type=>'DEBUG');\n   \n  pkg_BLK_DATA.prc_update_DATA(NAME_IN(:SYSTEM.CURRENT_BLOCK||'.'||defs.DBI_RNO), defs.C_BLK_UPGR);\n  \n  prc_flog('--- <<< UPDATE UPGR >>> ---');\n  \n  pkg_TABLE_DUMP.prc_UPGR_dmp;\n  */\n  \n  NULL;\n  \nEND;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/BLK_HANDLG/BLK_HANDLG__POST-QUERY.tgg",
    "content": "BEGIN\n  \nBEGIN\n  \n  :BLK_HANDLG.DFILE:= replace(:BLK_HANDLG.DFILE, '-', '.');\n\nEND;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/CTL_BASIC/CTL_BASIC__BT_ALL__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\n\n----------------------------------------------------------------------------------\n-- F.Matz: 25.01.2017, 20.02.2017 - BO UNIX, 22.02.2017, 26.04.2017, 19.05.2017 \n----------------------------------------------------------------------------------\n\nDECLARE \n  \n   l_fname_blank VARCHAR2(128);\n   \nBEGIN\n   -----------------------------------------------\n   -- 1.) Configuration  -- passive: 19.05.2017 --\n   -----------------------------------------------  \n   BEGIN   -- ablk_Konfiguration\n      \n       clear_message;\n      :PARAMETER.P_START_TIME := fnc_get_timer_value;\n\n       g.msg_push('W-B-P:BT_ALL: KONFIGURATION');  \n      \n      -- 19.05.2017 --\n      -- prc_CONFIGURATION;\n      -- SYNCHRONIZE;\n      \n       g.msg_free;\n     \n   EXCEPTION WHEN OTHERS THEN\n       prc_EXCEPTION;\n   END ablk_Konfiguration;\n   \n   ------------------------------------------\n   -- 2.) Running Checks.                  --\n   ------------------------------------------\n   BEGIN -- ablk_Migration\n     \n      g.msg_push('W-B-P:BT_ALL: CHECKS');\n   \n       prc_set_Statistik;\n       \n       SYNCHRONIZE;\n\n      g.msg_free;\n      \n   EXCEPTION WHEN OTHERS THEN\n       prc_EXCEPTION;\n   END ablk_Konfiguration;\n\n   ------------------------------------------\n   -- 3.) Running Migration.               --\n   ------------------------------------------\n   BEGIN -- ablk_Migration\n     \n      g.msg_push('W-B-P:BT_ALL: MIGRATION');\n  \n       go_block('BLK_HANDLG');\n       first_record;\n       \n       LOOP   \n                   \n          prc_MIGRATION;\n    \n          IF :SYSTEM.LAST_RECORD='TRUE' THEN\n             EXIT;\n          END IF;\n        \n          SYNCHRONIZE;\n        \n          next_record;\n    \n       END LOOP;\n  \n       first_record;\n       -- re-query --\n   \n       g.msg_free;\n     \n   EXCEPTION WHEN OTHERS THEN\n      prc_EXCEPTION;\n   END ablk_Migration;\n  \n   ------------------------------------------\n   -- 4.) Running Compiling.               --\n   ------------------------------------------\n    DECLARE -- ablk_Kompilierung  \n       l_fname_blank  VARCHAR2(128);    \n    BEGIN\n      \n       g.msg_push('W-B-P:BT_ALL: KOMPILIERUNG');\n  \n       go_block('BLK_HANDLG');\n       first_record;\n       \n       LOOP\n  \n          prc_COMPILATION;\n        \n          IF :SYSTEM.LAST_RECORD='TRUE' THEN\n             EXIT;\n          END IF;\n        \n          SYNCHRONIZE;\n        \n          next_record;\n    \n       END LOOP;\n  \n      first_record;\n      -- re-query --\n\n      prc_show_duration;  \n      \n      g.msg_free;\n    \n   EXCEPTION WHEN OTHERS THEN\n      prc_EXCEPTION;\n   END ablk_Kompilierung;  \n  \nEND BT_ALL;\n\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/CTL_BASIC/CTL_BASIC__BT_CHECK__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\n\n-- F.Matz: 25.01.2017\n\nBEGIN\n  \n  clear_message;\n  \n  :PARAMETER.P_START_TIME := fnc_get_timer_value;\n  \n  prc_set_statistik;\n  \n  prc_show_duration; \n    \nEND;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/CTL_BASIC/CTL_BASIC__BT_COMPILE__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\n\n-- F.Matz: 09.02.2017\n\nDECLARE\n  \n   l_fname_blank  VARCHAR2(128);\n    \nBEGIN\n\n   clear_message;\n   :PARAMETER.P_START_TIME := fnc_get_timer_value;\n   \n   g.msg_push('W-B-P:BT_MIGRATE');\n  \n   go_block('BLK_HANDLG');\n   first_record;\n   \n   LOOP\n  \n      prc_COMPILATION;\n    \n      IF :SYSTEM.LAST_RECORD='TRUE' THEN\n         EXIT;\n      END IF;\n    \n      SYNCHRONIZE;\n      \n      next_record;\n         \n   END LOOP;\n  \n   prc_show_duration;   \n  \n   first_record;\n   -- re-query --\n   \n   g.msg_free;\n     \nEXCEPTION WHEN OTHERS THEN\n   prc_EXCEPTION;\nEND;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/CTL_BASIC/CTL_BASIC__BT_CONFIGURE__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\n\n--------------------------------------------------------------------------\n-- F.Matz: 25.01.2017, 20.02.2017 - BO UNIX; 23.02.2107 ADDON => UNIX_dir\n--       : 20.04.2017, 26.04.2017\n--------------------------------------------------------------------------\n\nBEGIN\n  \n   prc_CONFIGURATION;\n   \nEND;\n\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/CTL_BASIC/CTL_BASIC__BT_MIGRATE__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\n\n-- F.Matz: 09.02.2017\n\nBEGIN\n  \n   clear_message;\n   :PARAMETER.P_START_TIME := fnc_get_timer_value;\n   \n   g.msg_push('W-B-P:BT_MIGRATE');\n  \n   go_block('BLK_HANDLG');\n   first_record;\n   \n   LOOP\n       \n      prc_MIGRATION;\n\n      IF :SYSTEM.LAST_RECORD='TRUE' THEN\n       EXIT;\n      END IF;\n    \n      SYNCHRONIZE;\n      \n      next_record;\n        \n   END LOOP;\n  \n   prc_show_duration;\n  \n   first_record;\n   -- re-query --\n   \n   g.msg_free;\n     \nEXCEPTION WHEN OTHERS THEN\n   prc_EXCEPTION;\nEND;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/CTL_INIT/CTL_INIT__BT_CLOSE__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\n\n-- F.Matz: 19.05.2017 --\n\nBEGIN\n  \n   prc_show_init('CLOSE');\n   \n   :PARAMETER.P_SHOW_INIT:= 'NO';\n\nEND;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/FNC_FILE_EXISTS_HOST.fun",
    "content": "FUNCTION fnc_File_Exists_HOST(p_fname VARCHAR2) RETURN BOOLEAN IS\n  l_file Text_IO.File_Type;\n  \nBEGIN\n  \n  l_file  := Text_IO.Fopen(p_fname, 'r');\n  Text_IO.Fclose(l_file);\n  \n  RETURN(TRUE);\n  \nEXCEPTION WHEN OTHERS THEN\n  RETURN(FALSE);\nEND fnc_File_Exists_HOST;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/FNC_GET_FILE_SEPARATOR.fun",
    "content": "FUNCTION fnc_get_file_separator RETURN VARCHAR2 IS\nBEGIN\n  IF :PARAMETER.P_WIN_UNIX='WINDOWS' THEN\n     RETURN('\\');\n  ELSE\n     RETURN('/');\n  END IF;\nEND fnc_get_file_separator;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/FNC_GET_TIMER_VALUE.fun",
    "content": "FUNCTION fnc_get_timer_value RETURN VARCHAR2 IS\n  -- 07.03.2017 - F.Matz : DateTime from Middle Tier.\nBEGIN\n  \n  RETURN (to_char(webutil_clientinfo.get_date_time, 'DD.MM.YYYY HH24:MI:SS'));\n   \nEND fnc_get_timer_value;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/FORMSAPI_WIZARD_2905/MODULE_FEATURES.tgg",
    "content": "BEGIN\n/*-----------------------------------------------------------------------------\n\n  This forms module was developed from Friedhold Matz fmatz.com@gmail.com\n  and contributed from the Cologne Data GmbH, many thanks to Frank Hoffmann.\n  \n  -----------------------------------------------------------------------------\n*/ NULL;\n\n/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  \n  The module includes following special programming features,\n  final version from 29.Juny 2017 :\n  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n  \n  # This module works normally without any DB connection.\n  \n  # Triggers and the mostly routines includes a prc_EXCEPTION.\n  \n  # There is a 'message-stack' for reading the EXCEPTION place:\n    thats why following structure exists:\n    \n    BEGIN\n      g.msg_push('block-name-(trigger-name/proc.-name..)'); ->(*)\n      ...\n      g.msg_free; -- it's ok.\n    EXCEPTION\n      prc_EXCEPTION; -- includes the g.msg_pop <-(*)\n    END;\n  \n  # As I described in my blog \n    http://friedhold-matz.blogspot.de/2013/02/forms-11g-alert-prozedur.html \n    the using of message parameter substituing is realized in:\n    - prc_msg\n    - prc_flog .\n    \n  # prc_flog is important for writing a log file in the %userhome% directory\n  \n  # I am using here 'indexed record tables' (associative arrays) \n    directly binded at the quasi DB table block: BLK_HANDLING\n    for reading the directory files, coordinating the button actions and\n    viewing the action states.\n    \n  # For handling the dynamic DOS command lines I am using also the parameter substitution: \n  \n    init_cmd CONSTANT VARCHAR2(1024):= 'CMD /C notepad.exe \"${p_file}\"  '; \n    ..\n    final_cmd:= replace( init_cmd, '${p_file}',  p_file );  -- p_file as dynamic parameter\n    ..\n    \n  # The initializing is realized with the config-basis.ini:\n  \n    - intern defined in P_CONFIG_INI_BLANK if P_CONFIG_INI=NULL: placed in the \\forms directory\n    - if P_CONFIG_INI IS NOT NULL then is using the config.ini there defined;\n      so you can define your own config.ini with the '&otherparams=p_config_ini=c:\\works\\myconfing.ini'\n      \n  # short definition of a config.ini:\n  \n    # --- BEGIN of INI File ---\n    \n    [DATABASE]\n    db.connect = scott/tiger@orcl\n\n    [PATH]\n    formsapi.execute= \"C:\\FormsAPI_Master_V3.0\\FapiMaster.exe\"\n\n    formsapi.scripts = C:\\Works\\Migr\\scripts\n    user.sources_dir = C:\\Works\\Migr\\Sources\n    user.addons_dir  = C:\\Works\\Migr\\Addons\n    user.olb         = webutil_no_ole.olb\n\n    workspace.home   = C:\\migration\n\n    # workspace.home\\workspace.place\n    workspace.place = mydestination\\works\n\n    # --- END of INI File ---\n\n  # Open tasks:\n  ~~~~~~~~~~~~~\n  # The module works in the moment as a HOST running module, see P_HOST_CLIENT.\n    The CLIENT running mode is implemented, but the checks are not completed.\n  -----------------------------------------------------------------------------\n\n  Hope you enjoy it, Friedhold.\n  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n  \n*/\n  \n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/FORMSAPI_WIZARD_2905/ON-LOGON.tgg",
    "content": "BEGIN\n\nDECLARE\n  \n  -- 07.03.2017 : DateTime from middle tier. --\n \nBEGIN  \n  \n  NULL;\n  \nEND ON_LOGON;\n\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/FORMSAPI_WIZARD_2905/WHEN-NEW-FORM-INSTANCE.tgg",
    "content": "BEGIN\n\n-- F.Matz: 25.01.2017, 18.05.2017, .., 29.06.2017 (final) \n\nDECLARE\n  \n   un  VARCHAR2(80); \n   pw  VARCHAR2(80); \n   cn  VARCHAR2(80); \n  \n   start_timer   TIMER;\n \nBEGIN\n  \n    g.msg_push('W-N-F-I');\n  \n    prc_Get_Connect_Info(un,pw,cn); \n \n   set_window_property('WIN_MAIN', TITLE, \n                       :PARAMETER.P_TITLE              ||' - '         ||\n                       :PARAMETER.P_MODULE            ||' - Version '  ||\n                       :PARAMETER.P_MODULE_VERSION    ||' - '         ||    \n                       ' ['||un||'@'||nvl(cn,'NULL')  ||']' );\n\n   -- 08.05.2017 --\n   start_timer:= CREATE_TIMER('webutil_userhome', 150, NO_REPEAT);\n   \n   --18.05.2017 --\n   hide_view('CNV_INIT');\n   \n    g.msg_free;\n  \nEXCEPTION WHEN OTHERS THEN\n  prc_EXCEPTION;\nEND W_N_F_I;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/FORMSAPI_WIZARD_2905/WHEN-TIMER-EXPIRED.tgg",
    "content": "BEGIN\n\n-- F.Matz : .., 19.05.2017 \n\nDECLARE\n  tm VARCHAR2(30);\nBEGIN \n  \n  g.msg_push('W-TIMER-EXPIRED');\n    \n  tm := GET_APPLICATION_PROPERTY(TIMER_NAME);\n  \n  IF tm='WEBUTIL_USERHOME'  THEN   \n     \n     BEGIN                       \n        -- 19.05.2017 --\n        :PARAMETER.P_SHOW_INIT:= 'YES';\n        prc_CONFIGURATION;\n                \n     EXCEPTION WHEN OTHERS THEN        \n         prc_info('$$$ Fehler in der Konfigurierung WEBUTIL - ABBRUCH ! $$$');        \n         EXIT_Form;  --- <<< SENSE <<<        \n     END ablk_chkwebutil;\n     \n  END IF; -- END 'WEBUTIL_USERHOME' --\n  \n  g.msg_free;\n    \nEXCEPTION WHEN OTHERS THEN\n  prc_EXCEPTION;      \nEND W_T_E;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/FORMSAPI_WIZARD_2905/WHEN-WINDOW-CLOSED.tgg",
    "content": "BEGIN\nBEGIN\n  \n  g.msg_push('W-W-CLOSED');\n  \n  IF :SYSTEM.EVENT_WINDOW='WIN_INFO' THEN\n     go_item('CTL_MAIN.CMD_DUMMY');\n     hide_window('WIN_INFO');\n     g.msg_free;\n     RETURN;\n  END IF;\n  \n  do_key('exit');\n\n  g.msg_free;\n  \nEXCEPTION WHEN OTHERS THEN\n   prc_EXCEPTION;  \nEND W_W_CLOSED;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/G.pkb",
    "content": "PACKAGE BODY g IS\n   -- F.Matz: 02.02.107 \n    \n   TYPE t_var_msg IS VARRAY(100) OF VARCHAR2(256); \n   \n   var_msg t_var_msg := t_var_msg('none','none','none','none','none','none','none','none','none','none',\n                                   'none','none','none','none','none','none','none','none','none','none',\n                                   'none','none','none','none','none','none','none','none','none','none',\n                                   'none','none','none','none','none','none','none','none','none','none',\n                                   'none','none','none','none','none','none','none','none','none','none',\n                                   'none','none','none','none','none','none','none','none','none','none',\n                                   'none','none','none','none','none','none','none','none','none','none',\n                                   'none','none','none','none','none','none','none','none','none','none',\n                                   'none','none','none','none','none','none','none','none','none','none',\n                                   'none','none','none','none','none','none','none','none','none','none');\n                                   \n     C_MAX_VAR CONSTANT NUMBER(4):=100;\n     m_ix   PLS_INTEGER:=1; \n     m_cntw PLS_INTEGER:=0;\n     m_cntr PLS_INTEGER:=0;    \n     \n   PROCEDURE msg_push(p_msg VARCHAR2) IS\n   BEGIN\n       var_msg(m_ix):= p_msg;  \n       IF m_ix=C_MAX_VAR THEN\n          m_ix:=0;             -- loop\n       END IF;\n       m_ix:= m_ix+1;           -- ix at next free !\n       var_msg(m_ix):= 'none';\n       m_cntw:= m_cntw+1;\n   END msg_push;\n   \n   FUNCTION  msg_pop_chk RETURN BOOLEAN IS\n      l_ix NUMBER(4);\n      l_msg VARCHAR2(256);\n   BEGIN\n       l_ix:= m_ix;\n      IF l_ix=1 THEN\n          l_msg:= var_msg(C_MAX_VAR);\n       ELSE\n          l_msg:= var_msg(l_ix-1);\n       END IF;\n       RETURN(l_msg<>'none');\n   END msg_pop_chk;\n       \n   FUNCTION  msg_pop RETURN VARCHAR2 IS\n      l_msg VARCHAR(256);\n   BEGIN \n       IF m_ix=1 THEN\n          l_msg:= var_msg(C_MAX_VAR);\n          var_msg(C_MAX_VAR):= 'none';\n          m_ix:= C_MAX_VAR;\n       ELSE\n          m_ix:= m_ix-1;\n          l_msg:= var_msg(m_ix);\n          var_msg(m_ix):= 'none';\n       END IF;\n       RETURN(l_msg);\n   END msg_pop;\n   \n   PROCEDURE msg_free IS\n      l_msg VARCHAR(256);\n   BEGIN \n       IF m_ix=1 THEN\n          l_msg:= var_msg(C_MAX_VAR);\n          var_msg(C_MAX_VAR):= 'none';\n          m_ix:= C_MAX_VAR;\n       ELSE\n          m_ix:= m_ix-1;\n          l_msg:= var_msg(m_ix);\n          var_msg(m_ix):= 'none';\n       END IF;\n       RETURN;            -- dummy pop --\n   END msg_free;\n      \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/G.pks",
    "content": "PACKAGE g IS\n\n  -- F.Matz: 02.02.2017, 18.05.2017   --\n  -- Package forr globals.             --\n  \n  rstate           VARCHAR2(32):= 'INIT';\n  result          VARCHAR2(64):= '';\n  rcnt            NUMBER(2);\n  \n  show_state      VARCHAR2(32);\n  \n  p               VARCHAR2(256)    := 'Init in Package g';\n  \n  state           VARCHAR2(20)    := 'OK'; -- Global FormsAPI State -- \n  state_last_msg   VARCHAR2(1024)  := '';   -- not used -            --\n  \n  error_no         VARCHAR2(5);\n  error_code       VARCHAR2(10);\n  \n  C_VLIGHTPOC      CONSTANT VARCHAR2(20):= 'Light-PoC';\n  C_VLIGHT        CONSTANT VARCHAR2(20):= 'Light';\n  C_VENTERPRISE    CONSTANT VARCHAR2(20):= 'Enterprise';\n  \n  PROCEDURE msg_push (p_msg VARCHAR2); \n  \n  FUNCTION  msg_pop_chk RETURN BOOLEAN; \n  \n  FUNCTION  msg_pop  RETURN VARCHAR2;\n  \n  PROCEDURE msg_free;\n  \n  \nEND;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/PKG_BLK_DATA.pkb",
    "content": "PACKAGE BODY pkg_blk_data IS\n  \n  -- F.Matz: 02.02.2017, 20.04.2017, 27.04.2017\n  \n   C_cmd_read_dir_HOST        CONSTANT VARCHAR2(256):= 'dir ${p_directory} /O:N /A:-D > ${p_script_dir}\\dir-list.txt';\n   m_run_cmd_read_dir_HOST   VARCHAR2(4098);\n   m_log           CONSTANT BOOLEAN := FALSE;\n  \n-------------------------------------------------------------------------------------------------------  \nPROCEDURE prc_iflog (p_log     VARCHAR2,    \n                     p_1      VARCHAR2 DEFAULT NULL, \n                      p_2      VARCHAR2 DEFAULT NULL, \n                     p_3      VARCHAR2 DEFAULT NULL, \n                     p_4      VARCHAR2 DEFAULT NULL, \n                      p_5      VARCHAR2 DEFAULT NULL, \n                     p_msg2    VARCHAR2 DEFAULT '.',\n                     p_TYPE   VARCHAR2 DEFAULT 'INFO') IS\nBEGIN\n   IF m_log THEN\n      prc_flog(p_log, p_1, p_2, p_3, p_4, p_5, p_msg2, p_TYPE);\n   END IF;\nEND prc_iflog;\n\n-------------------------------------------------------------------------------------------------------\n  -- 27.04.2017 --\n  PROCEDURE prc_wrt_CMD(p_cmd_name VARCHAR2, p_script VARCHAR2) IS\n     l_io_file    Text_IO.File_Type;\n     l_io_file_C  client_Text_IO.File_Type;\n  BEGIN\n     g.msg_push('pkg_blk_data.prc_wrt_CMD');\n     \n     IF :PARAMETER.P_HOST_CLIENT='HOST' THEN \n        SYNCHRONIZE;\n        l_io_file := Text_IO.Fopen(:PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||p_cmd_name, 'w');\n        Text_IO.put_line(l_io_file, p_script);                                                                         \n        Text_IO.fclose  (l_io_file);\n        SYNCHRONIZE;\n     \n     ELSIF :PARAMETER.P_HOST_CLIENT='CLIENT' THEN \n        SYNCHRONIZE;\n        l_io_file_C:= client_Text_IO.Fopen(:PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||p_cmd_name, 'w');\n        client_Text_IO.put_line(l_io_file_C, p_script);                                                                         \n        client_Text_IO.fclose(l_io_file_C);\n        SYNCHRONIZE;\n\n     END IF;       \n     \n      g.msg_free;\n     \n  EXCEPTION WHEN OTHERS THEN\n     prc_EXCEPTION;\n  END prc_wrt_CMD;\n\n--------------------------------------------------------------------------------------------------------\n\n  PROCEDURE prc_get_from_directory IS\n  BEGIN    \n    NULL;   \n  END prc_get_from_directory;\n\n--------------------------------------------------------------------------------------------------------\n  \n  PROCEDURE prc_HANDLG_tableid2name (p_id NUMBER) IS\n     l_name VARCHAR2(128);\n  BEGIN\n      g.msg_push('pkg_BLOCK_TABLE.prc_HANDLG_tableid2name');\n\n     l_name:= pkg_BLK_DATA.HANDLG_byid(p_id).FNAME;\n     pkg_BLK_DATA.HANDLG_byname(l_name).PNO            := pkg_BLK_DATA.HANDLG_byid(p_id).PNO;\n     pkg_BLK_DATA.HANDLG_byname(l_name).RNO            := pkg_BLK_DATA.HANDLG_byid(p_id).RNO;\n     pkg_BLK_DATA.HANDLG_byname(l_name).FNAME          := pkg_BLK_DATA.HANDLG_byid(p_id).FNAME;\n     pkg_BLK_DATA.HANDLG_byname(l_name).FEXTENT        := pkg_BLK_DATA.HANDLG_byid(p_id).FEXTENT;\n     pkg_BLK_DATA.HANDLG_byname(l_name).FSIZE          := pkg_BLK_DATA.HANDLG_byid(p_id).FSIZE;\n     pkg_BLK_DATA.HANDLG_byname(l_name).DFILE          := pkg_BLK_DATA.HANDLG_byid(p_id).DFILE;\n     pkg_BLK_DATA.HANDLG_byname(l_name).FORMS_OBJ_VNO  := pkg_BLK_DATA.HANDLG_byid(p_id).FORMS_OBJ_VNO;\n     pkg_BLK_DATA.HANDLG_byname(l_name).FAM_VERSION    := pkg_BLK_DATA.HANDLG_byid(p_id).FAM_VERSION;\n     pkg_BLK_DATA.HANDLG_byname(l_name).FSTATUS        := pkg_BLK_DATA.HANDLG_byid(p_id).FSTATUS;\n     pkg_BLK_DATA.HANDLG_byname(l_name).FMESSAGE      := pkg_BLK_DATA.HANDLG_byid(p_id).FMESSAGE;   \n           \n     pkg_BLK_DATA.HANDLG_byname(l_name).CB            := pkg_BLK_DATA.HANDLG_byid(p_id).CB;\n     pkg_BLK_DATA.HANDLG_byname(l_name).STATUS        := pkg_BLK_DATA.HANDLG_byid(p_id).STATUS;\n      pkg_BLK_DATA.HANDLG_byname(l_name).TYPE          := pkg_BLK_DATA.HANDLG_byid(p_id).TYPE;\n     pkg_BLK_DATA.HANDLG_byname(l_name).OPERAT        := pkg_BLK_DATA.HANDLG_byid(p_id).OPERAT;\n     pkg_BLK_DATA.HANDLG_byname(l_name).MSG            := pkg_BLK_DATA.HANDLG_byid(p_id).MSG;\n      pkg_BLK_DATA.HANDLG_byname(l_name).RESULT        := pkg_BLK_DATA.HANDLG_byid(p_id).RESULT;\n      pkg_BLK_DATA.HANDLG_byname(l_name).SPECIAL        := pkg_BLK_DATA.HANDLG_byid(p_id).SPECIAL;\n     pkg_BLK_DATA.HANDLG_byname(l_name).HISTORY        := pkg_BLK_DATA.HANDLG_byid(p_id).HISTORY;\n     \n     g.msg_free;\n     \n  EXCEPTION WHEN OTHERS THEN\n     prc_EXCEPTION;\n  END prc_HANDLG_tableid2name;\n\n--------------------------------------------------------------------------------------------------------\n \n  PROCEDURE prc_param2table(p_block VARCHAR2, p_pno  VARCHAR2, p_id NUMBER, p_fname VARCHAR2, p_fextend VARCHAR2, p_fsize NUMBER, p_status VARCHAR2,\n                            p_user VARCHAR2 ) IS\n                              \n     l_date          VARCHAR2(32);                      \n  BEGIN\n     g.msg_push('pkg_BLK_DATA.prc_param2table');\n      \n     prc_iflog('--- pkg_BLK_DATA.prc_param2table: HANDLG : '||p_fname||' ---', p_type=>'DEBUG');                        \n     l_date := webutil_clientinfo.get_date_time;\n     pkg_BLK_DATA.HANDLG_byid(p_id).PNO               := :PARAMETER.P_PNO;\n     pkg_BLK_DATA.HANDLG_byid(p_id).RNO               := p_id;\n     pkg_BLK_DATA.HANDLG_byid(p_id).FNAME             := p_fname;\n     pkg_BLK_DATA.HANDLG_byid(p_id).FEXTENT            := p_fextend;\n     pkg_BLK_DATA.HANDLG_byid(p_id).FSIZE             := p_fsize;\n      pkg_BLK_DATA.HANDLG_byid(p_id).REC_STATUS         := 'I';\n     pkg_BLK_DATA.HANDLG_byid(p_id).REC_USER           := :PARAMETER.P_USER;    \n      pkg_BLK_DATA.HANDLG_byid(p_id).REC_DREAD          := NULL;     -- marking: INSERT          \n     pkg_BLK_DATA.HANDLG_byid(p_id).REC_DUPDATE       := l_date;          \n     pkg_BLK_DATA.HANDLG_byid(p_id).REC_DCREATED      := l_date;  \n     pkg_BLK_DATA.HANDLG_byid(p_id).CB                := 'Y';  \n          \n     prc_HANDLG_tableid2name(p_id);\n  \n     g.msg_free;\n      \n    EXCEPTION WHEN OTHERS THEN\n       prc_EXCEPTION;\n    END  prc_param2table;\n\n-------------------------------------------------------------------------------------------------------- \n\n  PROCEDURE prc_table2block(p_id NUMBER, p_block VARCHAR2) IS\n     l_ix NUMBER(4);\n  BEGIN\n     g.msg_push('pkg_BLOCK_TABLE.prc_table2block');\n     \n           prc_iflog('--- pkg_BLOCK_TABLE.prc_table2block: HANDLG : '||p_id||' / '||p_block||' ---', p_type=>'DEBUG');  \n             COPY(pkg_BLK_DATA.HANDLG_byid(p_id).PNO,             p_block||'.'||'PNO');\n           COPY(pkg_BLK_DATA.HANDLG_byid(p_id).RNO,             p_block||'.'||'RNO');\n           COPY(pkg_BLK_DATA.HANDLG_byid(p_id).FNAME,            p_block||'.'||'FNAME');\n           COPY(pkg_BLK_DATA.HANDLG_byid(p_id).FEXTENT,          p_block||'.'||'FEXTENT');\n           COPY(pkg_BLK_DATA.HANDLG_byid(p_id).FSIZE,            p_block||'.'||'FSIZE');\n            COPY(pkg_BLK_DATA.HANDLG_byid(p_id).DFILE,            p_block||'.'||'DFILE');\n           COPY(pkg_BLK_DATA.HANDLG_byid(p_id).FORMS_OBJ_VNO,   p_block||'.'||'FORMS_OBJ_VNO');\n           COPY(pkg_BLK_DATA.HANDLG_byid(p_id).FAM_VERSION,     p_block||'.'||'FAM_VERSION');\n            COPY(pkg_BLK_DATA.HANDLG_byid(p_id).FSTATUS,         p_block||'.'||'FSTATUS');\n           COPY(pkg_BLK_DATA.HANDLG_byid(p_id).FMESSAGE,        p_block||'.'||'FMESSAGE');   \n           \n           COPY(pkg_BLK_DATA.HANDLG_byid(p_id).CB,              p_block||'.'||'CB');\n           COPY(pkg_BLK_DATA.HANDLG_byid(p_id).STATUS,          p_block||'.'||'STATUS');\n           COPY(pkg_BLK_DATA.HANDLG_byid(p_id).TYPE,            p_block||'.'||'TYPE');\n           COPY(pkg_BLK_DATA.HANDLG_byid(p_id).OPERAT,          p_block||'.'||'OPERAT');\n           COPY(pkg_BLK_DATA.HANDLG_byid(p_id).MSG,              p_block||'.'||'MSG');\n           COPY(pkg_BLK_DATA.HANDLG_byid(p_id).RESULT,          p_block||'.'||'RESULT');\n           COPY(pkg_BLK_DATA.HANDLG_byid(p_id).SPECIAL,          p_block||'.'||'SPECIAL');\n           COPY(pkg_BLK_DATA.HANDLG_byid(p_id).HISTORY,          p_block||'.'||'HISTORY');\n  \n  END prc_table2block;\n\n--------------------------------------------------------------------------------------------------------\n \n  PROCEDURE prc_exec_from_directory(p_data_type VARCHAR2, p_path VARCHAR2, p_fextend VARCHAR2 DEFAULT '*.fmb') IS\n     \n     l_file_list     webutil_file.file_list;\n     l_date          VARCHAR2(32);\n     l_temp_text     VARCHAR2(1000);\n     l_fname         VARCHAR2(256);\n     l_fsize        NUMBER(12);\n     l_fextent      VARCHAR2(3);\n     l_fselect      BOOLEAN;\n     l_rno           NUMBER(4);\n     l_cbselcnt      NUMBER(4);\n     l_source_dir   VARCHAR2(2048);\n     l_data_blk     VARCHAR2(32):= 'BLK_HANDLG';\n     --l_data_ix      NUMBER(2);\n     \n  BEGIN\n     g.msg_push('pkg_BLK_DATA.prc_exec_from_directory');\n     \n     l_source_dir := p_path;\n      \n     l_file_list := webutil_file.directory_filtered_list(l_source_dir, '*.*', TRUE);\n    \n     go_block( l_data_blk );\n     clear_block;\n    \n     first_record;\n     \n      -- INSERT - loop : New data's ! --\n       \n     l_rno:=1;\n    \n     prc_iflog('--- pkg_BLK_DATA.prc_exec_from_directory ---');\n     \n     FOR i IN 1 .. l_file_list.count\n     LOOP\n       \n        l_fname  :=   l_file_list(i);\n        \n        -- FH 4.3.2017\n        if   instr(lower(l_fname),'.rdf',1,1) > 0\n          or instr(lower(l_fname),'.fmb',1,1) > 0 \n          or instr(lower(l_fname),'.pll',1,1) > 0\n          or instr(lower(l_fname),'.mmb',1,1) > 0 \n         then  \n          \n           l_fextent  :=  lower(substr(l_fname, instr(l_fname,'.')+1, 3));\n           l_fsize    :=  replace(webutil_file.file_size(l_source_dir||:PARAMETER.P_FILE_SEPARATOR||l_fname), ',', '.');\n                \n            prc_param2table(  l_data_blk,\n                           :PARAMETER.P_PNO,\n                          l_rno,\n                          l_fname,\n                          UPPER(l_fextent),\n                           l_fsize,\n                          'I',\n                          :PARAMETER.P_USER );\n           \n           prc_table2block(l_rno, l_data_blk);\n        end if;  \n              \n        l_rno:= l_rno+1;      \n      \n        IF i<l_file_list.count THEN\n          IF NAME_IN(l_data_blk||'.'||'RNO') IS NOT NULL THEN\n              next_record;   \n           END IF;\n        END IF;  \n        \n    END LOOP;\n                \n    go_block(l_data_blk);\n    first_record;\n    \n    g.msg_free;\n      \n  EXCEPTION WHEN OTHERS THEN\n     prc_EXCEPTION;\n  END prc_exec_from_directory;\n    \n--------------------------------------------------------------------------------------------------------\n\n  PROCEDURE prc_exec_from_directory_HOST(p_directory VARCHAR2) IS\n   \n    in_file       Text_IO.File_Type;\n    linebuf       VARCHAR2(2048);\n    l_fsize       VARCHAR2(32);\n    l_fname       VARCHAR2(256);\n    l_fextent      VARCHAR2(3);\n    l_rno         NUMBER(4);\n    l_data_blk     VARCHAR2(32):= 'BLK_HANDLG';\n  BEGIN\n    \n    g.msg_push('pkg_BLK_DATA.prc_exec_from_directory_HOST');\n    \n    -- get dir list --\n    m_run_cmd_read_dir_HOST:= C_cmd_read_dir_HOST;\n    m_run_cmd_read_dir_HOST:= replace(m_run_cmd_read_dir_HOST, '${p_directory}',   p_directory);\n    m_run_cmd_read_dir_HOST:= replace(m_run_cmd_read_dir_HOST, '${p_script_dir}', :PARAMETER.P_SCRIPT_DIR);\n    \n    prc_wrt_CMD('do_read_dir.cmd', m_run_cmd_read_dir_HOST);\n     \n    HOST(:PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'do_read_dir.cmd', NO_SCREEN);\n       \n    go_block( l_data_blk );\n    clear_block;\n    \n    first_record;\n    \n    l_rno:=1;\n    \n    BEGIN\n      in_file := Text_IO.Fopen(:PARAMETER.P_SCRIPT_DIR||'\\'||'dir-list.txt', 'r');  \n     \n      LOOP\n         Text_IO.Get_Line(in_file, linebuf);\n         --Text_IO.New_Line;\n         \n         IF substr(linebuf,1,1) IN ('0','1','2','3','4','5','6','7','8','9') THEN\n            \n             -- get size / fname / fextent --\n             l_fsize  := replace(ltrim(substr(linebuf, 18, 18)),'.');        \n             l_fname  := substr(linebuf, 37, length(linebuf)-37+1);\n             l_fextent:= UPPER(substr(l_fname, instr(l_fname,'.')+1, 3));\n             \n             IF l_fextent IN ('FMB', 'PLL', 'MMB', 'RDF') THEN     \n                prc_param2table( l_data_blk,\n                                 :PARAMETER.P_PNO,\n                                 l_rno,\n                                l_fname,\n                                l_fextent,\n                                 l_fsize,\n                                'I',\n                                :PARAMETER.P_USER );  \n               prc_table2block(l_rno, l_data_blk);                        \n               l_rno:= l_rno+1;      \n                next_record; \n             END IF;            \n         END IF;        \n      END LOOP;\n    \n    EXCEPTION\n    WHEN no_data_found THEN\n         Text_IO.Fclose(in_file);\n    END;\n\n    go_block(l_data_blk);\n    first_record;\n      \n    g.msg_free;\n      \n  EXCEPTION WHEN OTHERS THEN \n     prc_EXCEPTION;\n  END prc_exec_from_directory_HOST;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/PKG_BLK_DATA.pks",
    "content": "PACKAGE pkg_blk_data IS\n  \n  -- F.Matz: 02.02.107, 21.04.2017\n   \n  C_MAX_RECORDS CONSTANT NUMBER(5):= 1000;  -- max. files per table/block.\n  \n  TYPE rec_t IS RECORD (\n      PNO            VARCHAR2(32)\n    ,CB              VARCHAR2(4)\n     ,RNO            NUMBER(4)\n    ,FNAME          VARCHAR2(512)\n    ,FSIZE          NUMBER(12)\n    ,FEXTENT        VARCHAR2(5)\n    ,DFILE          VARCHAr2(32)\n    ,FORMS_OBJ_VNO  VARCHAR2(32)\n    ,FAM_VERSION    VARCHAR2(128)\n    ,FSTATUS        VARCHAR2(16)\n    ,FMESSAGE        VARCHAR2(256)\n    ,STATUS          VARCHAR2(16)\n    ,STATUS_CHECK    VARCHAR2(16)\n    ,STATUS_MIGRATE  VARCHAR2(16)\n    ,STATUS_COMPILE  VARCHAR2(16)\n    ,TYPE            VARCHAR2(32)\n    ,OPERAT          VARCHAR2(64)\n    ,MSG            VARCHAR2(256)\n    ,RESULT          VARCHAR2(256)\n    ,SPECIAL        VARCHAR2(256)\n    ,HISTORY        VARCHAR2(2048)\n    ,BLOCK_NAME      VARCHAR2(32)\n    ,REC_HASH        VARCHAR2(64)\n    ,REC_STATUS      VARCHAR2(16)\n    ,REC_USER        VARCHAR2(64)\n    ,REC_DREAD      VARCHAR2(32)\n    ,REC_DUPDATE    VARCHAR2(32)\n    ,REC_DCREATED    VARCHAR2(32)\n  );\n     \n  TYPE rec_tabname_t IS TABLE OF rec_t INDEX BY VARCHAR2(128);    -- order by name  \n  TYPE rec_tabid_t   IS TABLE OF rec_t INDEX BY PLS_INTEGER;      -- order by id  \n  \n  -- EO declaration record types for blocks --\n \n  -- BO real block tables       --\n  HANDLG_byname         rec_tabname_t;\n  HANDLG_byid           rec_tabid_t;  \n  -- EO real block tables       --\n   \n  PROCEDURE prc_exec_from_directory(p_data_type VARCHAR2, p_path VARCHAR2, p_fextend VARCHAR2 DEFAULT '*.fmb');\n  \n  PROCEDURE prc_exec_from_directory_HOST(p_directory VARCHAR2);\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/PKG_CONFIG.pkb",
    "content": "PACKAGE BODY pkg_CONFIG IS\n\n  /* Konfigurierungen - Extern - INI  & Intern.\n   * Erstellt: 24.01.2017 , 28.04.2017 - F.Matz\n   *\n   */\n   \n  m_CONFIG_DEF CONSTANT VARCHAR2(4096):= '\n  [main]\n\n/** Datenbankverbindung wurde direkt ueber USERID im Script zugeordnet\n/** db_bvi=statistik_fr/STATISTIK_FR@cds\n/** db_connect=test/test@cds\ndb_connect=${p_db_connect}\none_fmb=${p_source_file}\n\n/** Fuer die verschiedenen Komponenten z.B. colorcoordmig\n/** color => Farbpaletten\n/** coord => Koordinatensystemanpassung\n/** mig => Standard Migration\n/** resize => Die Groesse der Forms kann geaendert werden\n/** win2unix => Die Windows Forms werden zu Unix konvertiert\n\nmig_steps=mig\n\n/** Welche Module werden bearbeitet z.B. pllmmbfmb\n/** mmb => Menues\n/** pll => Bibliotheken\n/** fmb => Forms\n\nmig_modules=pllmmbfmb\n\n/** skriptdir=C:\\oracle\\migration\\karibu\\batch\\skripte\nskriptdir=${p_script_dir}\n/** source_dir=C:\\oracle\\migration\\karibu\\batch\\01source\nsource_dir=${p_source_dir}\n/** color_dir=C:\\oracle\\migration\\karibu\\batch\\02color\ncolor_dir=${p_color_dir}\n/** coord_dir=C:\\oracle\\migration\\karibu\\batch\\03coord\ncoord_dir=${p_coord_dir}\n/** mig_dir=C:\\oracle\\migration\\karibu\\batch\\04migrated\nmig_dir=${p_migr_dir}\n/** unix_dir=C:\\oracle\\migration\\karibu\\batch\\05unix\nunix_dir=${p_unix_dir}\n\n/** Umschalten zwischen lower und upper case\n/** lower => alles klein geschrieben\n/** upper => alles gross geschrieben\nmig_unixcase=lower\n\n[webutil]\npll=webutil.pll\n/** olb=C:\\oracle\\migration\\karibu\\batch\\00addon\\olb_webutil.olb\nolb=${p_addon_dir}\\${p_olb_file}\n\n[runproduct]\npll=mig_print_lib.pll\n\n[Client_util]\npll=CLIENT_UTIL.pll\n\n[error]\nerrorlog=error.log\n\n[reportdummy]\n/** Bei verwendung der mig_print_lib.pll muss diese auf das Reportobject angepasst werden\nreportObject=dummy\n\n[coordsystem]\ntargetcoord=real\nrealcoordunit=pixel\ndefaultvalues=true\ncellwidth=9\ncellhight=21\n\n[Comment]\nshowMigPLSQLComment=TRUE\n';\n  \n  m_CONFIG_INI_RDY VARCHAR2(4096);\n  m_CONFIG_INI_RUN VARCHAR2(4096);\n  m_log            CONSTANT BOOLEAN := FALSE;\n  \n-------------------------------------------------------------------------------------------------------  \nPROCEDURE prc_iflog (p_log     VARCHAR2,    \n                     p_1      VARCHAR2 DEFAULT NULL, \n                      p_2      VARCHAR2 DEFAULT NULL, \n                     p_3      VARCHAR2 DEFAULT NULL, \n                     p_4      VARCHAR2 DEFAULT NULL, \n                      p_5      VARCHAR2 DEFAULT NULL, \n                     p_msg2    VARCHAR2 DEFAULT '.',\n                     p_TYPE   VARCHAR2 DEFAULT 'INFO') IS\nBEGIN\n   IF m_log THEN\n      prc_flog(p_log, p_1, p_2, p_3, p_4, p_5, p_msg2, p_TYPE);\n   END IF;\nEND prc_iflog;\n\n-------------------------------------------------------------------------------------------------------  \n  PROCEDURE prc_wrt_Config_INI IS\n     l_io_file    Text_IO.File_Type;\n     l_io_file_C  client_Text_IO.File_Type;\n  BEGIN\n     g.msg_push('pkg_CONFIG.prc_wrt_Config_INI');\n     \n     IF :PARAMETER.P_HOST_CLIENT='HOST' THEN \n         SYNCHRONIZE;\n        l_io_file := Text_IO.Fopen(:PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'config.ini', 'w');\n        text_io.put_line(l_io_file, m_CONFIG_INI_RUN);                                                                         \n        text_io.fclose  (l_io_file);\n        SYNCHRONIZE;\n        \n     ELSIF :PARAMETER.P_HOST_CLIENT='CLIENT' THEN \n        SYNCHRONIZE;\n        l_io_file_C := client_Text_IO.Fopen(:PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'config.ini', 'w');\n        client_Text_IO.put_line(l_io_file_C, m_CONFIG_INI_RUN);                                                                         \n        client_Text_IO.fclose  (l_io_file_C);\n        SYNCHRONIZE;\n        \n     END IF;\n     \n      g.msg_free;\n     \n  EXCEPTION WHEN OTHERS THEN\n     prc_EXCEPTION;\n  END prc_wrt_Config_INI;\n  \n-------------------------------------------------------------------------------------------------------\n  -- 28.04.2017 --\n  PROCEDURE prc_wrt_CMD(p_cmd_name VARCHAR2, p_script VARCHAR2) IS\n     l_io_file    Text_IO.File_Type;\n     l_io_file_C  client_Text_IO.File_Type;\n  BEGIN\n     g.msg_push('pkg_CONFIG.prc_wrt_CMD');\n     \n     IF :PARAMETER.P_HOST_CLIENT='HOST' THEN \n        SYNCHRONIZE;\n        l_io_file := Text_IO.Fopen(:PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||p_cmd_name, 'w');\n        Text_IO.put_line(l_io_file, p_script);                                                                         \n        Text_IO.fclose  (l_io_file);\n        SYNCHRONIZE;\n     \n     ELSIF :PARAMETER.P_HOST_CLIENT='CLIENT' THEN \n        SYNCHRONIZE;\n        l_io_file_C := client_Text_IO.Fopen(:PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||p_cmd_name, 'w');\n        client_Text_IO.put_line(l_io_file_C, p_script);                                                                         \n        client_Text_IO.fclose  (l_io_file_C);\n        SYNCHRONIZE;\n            \n     END IF;\n     \n      g.msg_free;\n     \n  EXCEPTION WHEN OTHERS THEN\n     prc_EXCEPTION;\n  END prc_wrt_CMD;\n\n------------------------------------------------------------------------------------------------------- \n  PROCEDURE prc_set_Config_INI IS  \n  BEGIN\n     g.msg_push('pkg_CONFIG.prc_Config_INI');\n     \n     m_CONFIG_INI_RDY:= m_CONFIG_DEF;\n     m_CONFIG_INI_RDY:= replace(m_CONFIG_INI_RDY, '${p_db_connect}',   :PARAMETER.P_DB_CONNECT);\n     m_CONFIG_INI_RDY:= replace(m_CONFIG_INI_RDY, '${p_script_dir}',   :PARAMETER.P_SCRIPT_DIR);\n     m_CONFIG_INI_RDY:= replace(m_CONFIG_INI_RDY, '${p_source_dir}',   :PARAMETER.P_SOURCE_DIR);\n      m_CONFIG_INI_RDY:= replace(m_CONFIG_INI_RDY, '${p_addon_dir}',   :PARAMETER.P_ADDON_DIR);\n     m_CONFIG_INI_RDY:= replace(m_CONFIG_INI_RDY, '${p_color_dir}',   :PARAMETER.P_COLOR_DIR);\n     m_CONFIG_INI_RDY:= replace(m_CONFIG_INI_RDY, '${p_coord_dir}',   :PARAMETER.P_COORD_DIR);\n     m_CONFIG_INI_RDY:= replace(m_CONFIG_INI_RDY, '${p_migr_dir}',     :PARAMETER.P_MIGR_DIR);\n     m_CONFIG_INI_RDY:= replace(m_CONFIG_INI_RDY, '${p_unix_dir}',     :PARAMETER.P_UNIX_DIR);\n     m_CONFIG_INI_RDY:= replace(m_CONFIG_INI_RDY, '${p_olb_file}',     :PARAMETER.P_OLB_FILE);\n     \n     -- for tests --\n     -- prc_wrt_Config_INI;\n     g.msg_free;\n     \n  EXCEPTION WHEN OTHERS THEN\n     prc_EXCEPTION;\n  END prc_set_Config_INI;\n  \n-------------------------------------------------------------------------------------------------------   \n  PROCEDURE prc_set_Config_INI_Source(p_srcfile VARCHAR2) IS\n  BEGIN\n     g.msg_push('pkg_CONFIG.prc_Config_INI_Source');\n     \n     prc_set_Config_INI;\n     m_CONFIG_INI_RUN:= m_CONFIG_INI_RDY;\n     \n     :PARAMETER.P_SOURCE_FILE:= p_srcfile;\n     \n     m_CONFIG_INI_RUN:= replace(m_CONFIG_INI_RUN, '${p_source_file}', :PARAMETER.P_SOURCE_FILE);\n     \n     prc_wrt_Config_INI;\n     \n     g.msg_free;\n     \n  EXCEPTION WHEN OTHERS THEN\n     prc_EXCEPTION;\n  END prc_set_Config_INI_Source;\n  \n-------------------------------------------------------------------------------------------------------   \n  PROCEDURE prc_create_DIRS IS\n  BEGIN\n     g.msg_push('pkg_Config.prc_create_DIRS');\n     \n     :PARAMETER.P_DB_CONNECT := :PARAMETER.P_DB_CONNECT;\n     \n      -- set PARAMETERS final --\n      :PARAMETER.P_WORKSPACE  := :PARAMETER.P_CONFIG_HOME||:PARAMETER.P_FILE_SEPARATOR||:PARAMETER.P_CONFIG_PLACE;\n      :PARAMETER.P_SCRIPT_DIR := :PARAMETER.P_WORKSPACE  ||:PARAMETER.P_FILE_SEPARATOR||:PARAMETER.P_CONFIG_SCRIPT;\n      :PARAMETER.P_LOG_DIR    := :PARAMETER.P_WORKSPACE  ||:PARAMETER.P_FILE_SEPARATOR||:PARAMETER.P_CONFIG_LOG;\n      :PARAMETER.P_SOURCE_DIR := :PARAMETER.P_WORKSPACE  ||:PARAMETER.P_FILE_SEPARATOR||:PARAMETER.P_CONFIG_SOURCE;\n      :PARAMETER.P_ADDON_DIR  := :PARAMETER.P_WORKSPACE  ||:PARAMETER.P_FILE_SEPARATOR||:PARAMETER.P_CONFIG_ADDON;\n      :PARAMETER.P_COLOR_DIR  := :PARAMETER.P_WORKSPACE  ||:PARAMETER.P_FILE_SEPARATOR||:PARAMETER.P_CONFIG_COLOR;\n      :PARAMETER.P_COORD_DIR  := :PARAMETER.P_WORKSPACE  ||:PARAMETER.P_FILE_SEPARATOR||:PARAMETER.P_CONFIG_COORD;\n      :PARAMETER.P_MIGR_DIR   := :PARAMETER.P_WORKSPACE  ||:PARAMETER.P_FILE_SEPARATOR||:PARAMETER.P_CONFIG_MIGR;\n      :PARAMETER.P_UNIX_DIR   := :PARAMETER.P_WORKSPACE  ||:PARAMETER.P_FILE_SEPARATOR||:PARAMETER.P_CONFIG_UNIX;   \n      :PARAMETER.P_COMP_DIR   := :PARAMETER.P_WORKSPACE  ||:PARAMETER.P_FILE_SEPARATOR||:PARAMETER.P_CONFIG_COMP;      \n      :PARAMETER.P_OLB_FILE   := :PARAMETER.P_CONFIG_OLB_FILE;\n                    \n     WEBUTIL_HOST.HOST( 'CMD /C IF NOT EXIST '||:PARAMETER.P_SCRIPT_DIR ||' MKDIR '||:PARAMETER.P_SCRIPT_DIR);  \n     WEBUTIL_HOST.HOST( 'CMD /C IF NOT EXIST '||:PARAMETER.P_LOG_DIR     ||' MKDIR '||:PARAMETER.P_LOG_DIR);          \n     WEBUTIL_HOST.HOST( 'CMD /C IF NOT EXIST '||:PARAMETER.P_SOURCE_DIR ||' MKDIR '||:PARAMETER.P_SOURCE_DIR);  \n     WEBUTIL_HOST.HOST( 'CMD /C IF NOT EXIST '||:PARAMETER.P_ADDON_DIR  ||' MKDIR '||:PARAMETER.P_ADDON_DIR);            \n     WEBUTIL_HOST.HOST( 'CMD /C IF NOT EXIST '||:PARAMETER.P_COLOR_DIR  ||' MKDIR '||:PARAMETER.P_COLOR_DIR);            \n     WEBUTIL_HOST.HOST( 'CMD /C IF NOT EXIST '||:PARAMETER.P_COORD_DIR  ||' MKDIR '||:PARAMETER.P_COORD_DIR);            \n     WEBUTIL_HOST.HOST( 'CMD /C IF NOT EXIST '||:PARAMETER.P_MIGR_DIR   ||' MKDIR '||:PARAMETER.P_MIGR_DIR);            \n     WEBUTIL_HOST.HOST( 'CMD /C IF NOT EXIST '||:PARAMETER.P_UNIX_DIR   ||' MKDIR '||:PARAMETER.P_UNIX_DIR);            \n     WEBUTIL_HOST.HOST( 'CMD /C IF NOT EXIST '||:PARAMETER.P_COMP_DIR   ||' MKDIR '||:PARAMETER.P_COMP_DIR);     \n\n     WEBUTIL_HOST.HOST( 'CMD /C DEL  '||:PARAMETER.P_LOG_DIR     ||'\\*.* /Q');      \n     WEBUTIL_HOST.HOST( 'CMD /C DEL  '||:PARAMETER.P_SOURCE_DIR ||'\\*.* /Q');  \n     WEBUTIL_HOST.HOST( 'CMD /C DEL  '||:PARAMETER.P_ADDON_DIR  ||'\\*.* /Q');          \n     WEBUTIL_HOST.HOST( 'CMD /C DEL  '||:PARAMETER.P_COLOR_DIR  ||'\\*.* /Q');          \n     WEBUTIL_HOST.HOST( 'CMD /C DEL  '||:PARAMETER.P_COORD_DIR  ||'\\*.* /Q');          \n     WEBUTIL_HOST.HOST( 'CMD /C DEL  '||:PARAMETER.P_MIGR_DIR   ||'\\*.* /Q');            \n     WEBUTIL_HOST.HOST( 'CMD /C DEL  '||:PARAMETER.P_UNIX_DIR   ||'\\*.* /Q');            \n     WEBUTIL_HOST.HOST( 'CMD /C DEL  '||:PARAMETER.P_COMP_DIR   ||'\\*.* /Q');\n     \n     g.msg_free;\n     \n  EXCEPTION WHEN OTHERS THEN\n     prc_EXCEPTION;  \n  END prc_create_DIRS;\n  \n-------------------------------------------------------------------------------------------------------   \n  PROCEDURE prc_create_DIRS_HOST IS\n  BEGIN\n     g.msg_push('pkg_Config.prc_create_DIRS_HOST');\n     \n     :PARAMETER.P_DB_CONNECT := :PARAMETER.P_DB_CONNECT;\n     \n      -- set PARAMETERS final --\n      :PARAMETER.P_WORKSPACE  := :PARAMETER.P_CONFIG_HOME||:PARAMETER.P_FILE_SEPARATOR||:PARAMETER.P_CONFIG_PLACE;\n      :PARAMETER.P_SCRIPT_DIR := :PARAMETER.P_WORKSPACE  ||:PARAMETER.P_FILE_SEPARATOR||:PARAMETER.P_CONFIG_SCRIPT;\n      :PARAMETER.P_LOG_DIR    := :PARAMETER.P_WORKSPACE  ||:PARAMETER.P_FILE_SEPARATOR||:PARAMETER.P_CONFIG_LOG;\n      :PARAMETER.P_SOURCE_DIR := :PARAMETER.P_WORKSPACE  ||:PARAMETER.P_FILE_SEPARATOR||:PARAMETER.P_CONFIG_SOURCE;\n      :PARAMETER.P_ADDON_DIR  := :PARAMETER.P_WORKSPACE  ||:PARAMETER.P_FILE_SEPARATOR||:PARAMETER.P_CONFIG_ADDON;\n      :PARAMETER.P_COLOR_DIR  := :PARAMETER.P_WORKSPACE  ||:PARAMETER.P_FILE_SEPARATOR||:PARAMETER.P_CONFIG_COLOR;\n      :PARAMETER.P_COORD_DIR  := :PARAMETER.P_WORKSPACE  ||:PARAMETER.P_FILE_SEPARATOR||:PARAMETER.P_CONFIG_COORD;\n      :PARAMETER.P_MIGR_DIR   := :PARAMETER.P_WORKSPACE  ||:PARAMETER.P_FILE_SEPARATOR||:PARAMETER.P_CONFIG_MIGR;\n      :PARAMETER.P_UNIX_DIR   := :PARAMETER.P_WORKSPACE  ||:PARAMETER.P_FILE_SEPARATOR||:PARAMETER.P_CONFIG_UNIX;   \n      :PARAMETER.P_COMP_DIR   := :PARAMETER.P_WORKSPACE  ||:PARAMETER.P_FILE_SEPARATOR||:PARAMETER.P_CONFIG_COMP;      \n      :PARAMETER.P_OLB_FILE   := :PARAMETER.P_CONFIG_OLB_FILE;\n                    \n     -- HOST( 'start CMD /C IF NOT EXIST '||:PARAMETER.P_SCRIPT_DIR ||' MKDIR '||:PARAMETER.P_SCRIPT_DIR,  NO_SCREEN);  \n     HOST( 'IF NOT EXIST '||:PARAMETER.P_SCRIPT_DIR ||' MKDIR '||:PARAMETER.P_SCRIPT_DIR,  NO_SCREEN);  \n     HOST( 'IF NOT EXIST '||:PARAMETER.P_LOG_DIR     ||' MKDIR '||:PARAMETER.P_LOG_DIR,    NO_SCREEN);          \n     HOST( 'IF NOT EXIST '||:PARAMETER.P_SOURCE_DIR ||' MKDIR '||:PARAMETER.P_SOURCE_DIR,  NO_SCREEN);  \n     HOST( 'IF NOT EXIST '||:PARAMETER.P_ADDON_DIR  ||' MKDIR '||:PARAMETER.P_ADDON_DIR,  NO_SCREEN);            \n     HOST( 'IF NOT EXIST '||:PARAMETER.P_COLOR_DIR  ||' MKDIR '||:PARAMETER.P_COLOR_DIR,  NO_SCREEN);            \n     HOST( 'IF NOT EXIST '||:PARAMETER.P_COORD_DIR  ||' MKDIR '||:PARAMETER.P_COORD_DIR,  NO_SCREEN);            \n     HOST( 'IF NOT EXIST '||:PARAMETER.P_MIGR_DIR   ||' MKDIR '||:PARAMETER.P_MIGR_DIR,    NO_SCREEN);            \n     HOST( 'IF NOT EXIST '||:PARAMETER.P_UNIX_DIR   ||' MKDIR '||:PARAMETER.P_UNIX_DIR,    NO_SCREEN);            \n     HOST( 'IF NOT EXIST '||:PARAMETER.P_COMP_DIR   ||' MKDIR '||:PARAMETER.P_COMP_DIR,    NO_SCREEN);     \n\n     HOST( 'DEL  '||:PARAMETER.P_LOG_DIR     ||'\\*.* /Q',  NO_SCREEN);      \n     HOST( 'DEL  '||:PARAMETER.P_SOURCE_DIR ||'\\*.* /Q',    NO_SCREEN);  \n     HOST( 'DEL  '||:PARAMETER.P_ADDON_DIR  ||'\\*.* /Q',    NO_SCREEN);          \n     HOST( 'DEL  '||:PARAMETER.P_COLOR_DIR  ||'\\*.* /Q',    NO_SCREEN);          \n     HOST( 'DEL  '||:PARAMETER.P_COORD_DIR  ||'\\*.* /Q',    NO_SCREEN);          \n     HOST( 'DEL  '||:PARAMETER.P_MIGR_DIR   ||'\\*.* /Q',    NO_SCREEN);            \n     HOST( 'DEL  '||:PARAMETER.P_UNIX_DIR   ||'\\*.* /Q',    NO_SCREEN);            \n     HOST( 'DEL  '||:PARAMETER.P_COMP_DIR   ||'\\*.* /Q',    NO_SCREEN);\n     \n     g.msg_free;\n     \n  EXCEPTION WHEN OTHERS THEN\n     prc_EXCEPTION;  \n  END prc_create_DIRS_HOST;\n  \n------------------------------------------------------------------------------------------------------- \n  PROCEDURE prc_Copy_Dir(p_srcdir VARCHAR2, p_destdir VARCHAR2) IS\n  BEGIN\n     g.msg_push('pkg_Config.prc_Copy_Dir');\n     \n     prc_iflog('--- COPY :: '||'CMD /C XCOPY '|| p_srcdir ||' '|| p_destdir ||' /S /D /V /Y'||' .');\n     \n     WEBUTIL_HOST.BLOCKING('CMD /C XCOPY '|| p_srcdir ||' '|| p_destdir ||' /S /D /V /Y');\n\n     g.msg_free;\n  \n  EXCEPTION WHEN OTHERS THEN\n     prc_EXCEPTION;\n  END prc_Copy_Dir;\n\n------------------------------------------------------------------------------------------------------- \n  PROCEDURE prc_Copy_Dir_HOST(p_srcdir VARCHAR2, p_destdir VARCHAR2) IS\n  BEGIN    \n     g.msg_push('pkg_Config.prc_Copy_Dir_HOST');\n     \n     prc_iflog('--- COPY :: '||'XCOPY '|| p_srcdir ||' '|| p_destdir ||' /S /D /V /Y'||' .');\n     \n      prc_wrt_CMD('do_XCOPY.cmd', :PARAMETER.P_WIN_SYSTEM32_HOME||'\\'||'XCOPY '|| p_srcdir ||' '|| p_destdir ||' /S /D /V /Y');\n      \n      HOST('call ' || :PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'do_XCOPY.cmd', NO_SCREEN);\n  \n     g.msg_free;\n  \n  EXCEPTION WHEN OTHERS THEN\n     prc_EXCEPTION;\n  END prc_Copy_Dir_HOST;\n\n------------------------------------------------------------------------------------------------------- \n  PROCEDURE prc_Copy_Dir_RDF(p_srcdir VARCHAR2, p_destdir VARCHAR2) IS\n  BEGIN\n     g.msg_push('pkg_Config.prc_Copy_Dir');\n     \n     prc_iflog('--- COPY :: '||'CMD /C XCOPY '|| p_srcdir ||' '|| p_destdir ||' *.RDF /S /D /V /Y'||' .');\n     \n     WEBUTIL_HOST.BLOCKING('CMD /C XCOPY '|| p_srcdir ||' '|| p_destdir ||' *.RDF /S /D /V /Y');\n\n     g.msg_free;\n  \n  EXCEPTION WHEN OTHERS THEN\n     prc_EXCEPTION;\n  END prc_Copy_Dir_RDF;\n\n------------------------------------------------------------------------------------------------------- \n  PROCEDURE prc_Copy_Dir_RDF_HOST(p_srcdir VARCHAR2, p_destdir VARCHAR2) IS\n  BEGIN\n     g.msg_push('pkg_Config.prc_Copy_Dir_HOST');\n     \n     prc_iflog('--- COPY :: '||'XCOPY '|| p_srcdir ||' '|| p_destdir ||' *.RDF /S /D /V /Y'||' .');\n     \n      prc_wrt_CMD('do_XCOPY_rdf.cmd', :PARAMETER.P_WIN_SYSTEM32_HOME||'\\'||'XCOPY '|| p_srcdir ||' '|| p_destdir ||' *.RDF /S /D /V /Y');\n      \n      HOST('call ' || :PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'do_XCOPY_rdf.cmd', NO_SCREEN);\n      \n     -- HOST('XCOPY '|| p_srcdir ||' '|| p_destdir ||' *.RDF /S /D /V /Y', NO_SCREEN);\n\n     g.msg_free;\n  \n  EXCEPTION WHEN OTHERS THEN\n     prc_EXCEPTION;\n  END prc_Copy_Dir_RDF_HOST;\n  \n-------------------------------------------------------------------------------------------------------   \n  PROCEDURE prc_get_config(p_fname VARCHAR2) IS\n       /* \n        * Erstellt: 04.01.2017 - F.Matz\n        */\n        \n       l_fn VARCHAR2(512):= p_fname;\n       \n       TYPE t_var IS VARRAY(4096) OF VARCHAR2(1); \n       ar  t_var:= t_var();\n       ar2 t_var:= t_var();\n       \n       C_MAX_LEN   CONSTANT NUMBER(4):= 4096;\n       l_buff     VARCHAR2(4096);\n       \n       l_in_file  Text_IO.File_Type;\n       l_cnt       NUMBER(3);\n       l_pos       NUMBER(3);\n       l_i         NUMBER(3);\n       l_res       VARCHAR2(128);\n       l_section   VARCHAR2(128);\n       l_key       VARCHAR2(128);\n       l_value     VARCHAR2(2048);\n       \n   PROCEDURE swap IS\n   BEGIN\n       ar:= t_var();  -- init --\n       FOR i IN 1..length(l_buff) LOOP\n            ar.extend(); -- Extend it\n            ar(i):=substr(l_buff, i, 1);\n       END LOOP;       \n   END swap;\n    \n   FUNCTION wsp RETURN VARCHAR2 IS\n   BEGIN  \n       FOR i IN 1..ar.COUNT LOOP   \n            IF ar(i)='#' THEN\n                RETURN('#');\n            ELSIF ar(i) IN (' ', ',', ';', CHR(9), CHR(10), CHR(13)) THEN\n                NULL;\n            ELSIF ar(i) IN ('[') THEN\n                RETURN('SECTION');\n            ELSE\n                RETURN('TOKE');\n            END IF;\n            l_pos:= l_pos+1;\n       END LOOP;\n       RETURN(' ');\n   END;\n    \n   FUNCTION   section RETURN VARCHAR2 IS\n       l_section VARCHAR2(128);\n   BEGIN\n       l_pos:= l_pos+1;\n       FOR i IN l_pos..ar.COUNT LOOP\n            IF ar(i)=']' THEN\n                RETURN(l_section);\n            END IF;\n            l_section:= l_section||ar(i);\n            l_pos:= l_pos+1;\n       END LOOP;     \n   END section;\n    \n   PROCEDURE keyvalue(p_out_key OUT VARCHAR2, p_out_value OUT VARCHAR2) IS\n   BEGIN\n       -- pos at FIRST --\n       FOR i IN l_pos..ar.COUNT LOOP\n            IF ar(i) IN (' ', CHR(9), '=') THEN \n                EXIT;  -- key --\n            ELSE\n                p_out_key:= p_out_key||ar(i);\n            END IF;\n            l_pos:= l_pos+1;\n       END LOOP;\n       \n       -- go over --\n       FOR i IN l_pos..ar.COUNT LOOP\n            IF ar(i) IN (' ', CHR(9), '=') THEN\n                NULL;\n            ELSE\n                EXIT; -- first --\n            END IF;\n           l_pos:= l_pos+1;\n       END LOOP;\n          \n       -- pos at FIRST --\n       FOR i IN l_pos..ar.COUNT LOOP\n            IF ar(i) IN (' ', ',', ';', CHR(9), CHR(10), CHR(13)) THEN \n                EXIT;  -- value --\n            ELSE\n                p_out_value:= p_out_value||ar(i);\n            END IF;\n            l_pos:= l_pos+1;\n       END LOOP;\n       \n   END keyvalue;\n    \n   BEGIN\n         l_buff:='';\n        l_in_file := Text_IO.Fopen(l_fn, 'r');\n        l_cnt:=1;\n        LOOP\n           BEGIN\n              Text_IO.get_line(l_in_File, l_buff);\n               l_pos:=1;\n               IF length(l_buff)>0 THEN \n                  swap; \n                  l_res:= wsp;\n                  IF l_res='SECTION' THEN\n                      l_section:= section;\n                      --prc_info(l_section);\n                  ELSIF l_res='TOKE' THEN\n                      keyvalue(l_key, l_value);\n                      --prc_info(l_key||' : '||l_value);\n                      IF l_section='DATABASE' THEN\n                         CASE l_key\n                             WHEN 'db.connect'        THEN :PARAMETER.P_DB_CONNECT               := l_value;\n                         END CASE;\n                      END IF;\n                      IF l_section='PATH' THEN\n                         CASE l_key\n                             WHEN 'formsapi.execute'  THEN :PARAMETER.P_CONFIG_FORMSAPI_EXECUTE  := l_value;\n                             WHEN 'formsapi.scripts'  THEN :PARAMETER.P_CONFIG_FORMSAPI_SCRIPTS  := l_value;\n                             WHEN 'user.sources_dir'  THEN :PARAMETER.P_CONFIG_USER_SOURCES      := l_value;\n                             WHEN 'user.addons_dir'   THEN :PARAMETER.P_CONFIG_USER_ADDONS       := l_value;\n                             WHEN 'user.olb'          THEN :PARAMETER.P_CONFIG_OLB_FILE          := l_value;\n                             WHEN 'workspace.home'    THEN :PARAMETER.P_CONFIG_HOME               := l_value;\n                             WHEN 'workspace.place'   THEN :PARAMETER.P_CONFIG_PLACE              := l_value;\n                         END CASE;\n                      END IF;\n                  END IF;\n               END IF;\n               l_cnt:= l_cnt+1;           \n           EXCEPTION \n               WHEN NO_DATA_FOUND THEN\n                Text_IO.Fclose(l_in_File);\n                 EXIT;\n               WHEN OTHERS THEN\n                   Text_IO.Fclose(l_in_File);\n                   prc_info(sqlerrm);\n                 EXIT;\n               EXIT;\n           END ;\n       END LOOP;\n       \n       --prc_iflog('--- db.connect:       '|| :PARAMETER.P_DB_CONNECT);\n       --prc_iflog('--- formsapi.execute: '|| :PARAMETER.P_CONFIG_FORMSAPI_EXECUTE);\n       --prc_iflog('--- formsapi.scripts: '|| :PARAMETER.P_CONFIG_FORMSAPI_SCRIPTS);\n       --prc_iflog('--- user.sources_dir: '|| :PARAMETER.P_CONFIG_USER_SOURCES);\n       --prc_iflog('--- user.addons_dir:  '|| :PARAMETER.P_CONFIG_USER_ADDONS);\n       --prc_iflog('--- user.olb:         '|| :PARAMETER.P_CONFIG_OLB_FILE);\n       --prc_iflog('--- workspace.home:   '|| :PARAMETER.P_CONFIG_HOME);\n       --prc_iflog('--- workspace.place:  '|| :PARAMETER.P_CONFIG_PLACE);\n\nEXCEPTION WHEN OTHERS THEN\n      NULL; -- ignore --\n  END prc_get_config;\n------------------------------------------------------------------------------------------------------- \n\nEND pkg_CONFIG;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/PKG_CONFIG.pks",
    "content": "PACKAGE pkg_CONFIG IS\n  \n  -- F.Matz: 15.01.2017, 26.04.2017 --\n  \n  PROCEDURE prc_create_DIRS;\n  \n  PROCEDURE prc_create_DIRS_HOST;\n\n  PROCEDURE prc_set_Config_INI;\n  \n  PROCEDURE prc_get_config(p_fname VARCHAR2);\n  \n  PROCEDURE prc_set_Config_INI_Source(p_srcfile VARCHAR2);\n  \n  PROCEDURE prc_Copy_Dir(p_srcdir VARCHAr2, p_destdir VARCHAR2);\n  \n  PROCEDURE prc_Copy_Dir_HOST(p_srcdir VARCHAR2, p_destdir VARCHAR2);\n  \n  PROCEDURE prc_Copy_Dir_RDF(p_srcdir VARCHAR2, p_destdir VARCHAR2);\n  \n  PROCEDURE prc_Copy_Dir_RDF_HOST(p_srcdir VARCHAR2, p_destdir VARCHAR2);\n  \nEND pkg_CONFIG;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/PKG_FAM_RUN_SCRIPT.pkb",
    "content": "PACKAGE BODY pkg_FAM_run_Script IS\n  \n  -- F.Matz: 15.01.2017 / 10.02.2017 / FH 4.3.2017 / FM 22.03.2017\n  \n  -- C_SCRIPT_ONE_UPGR)  := 'CMD /C call ${p_formsapi_home} /SCRIPT /API=11g /RUN=\"${p_wsp_prj_scripts_upgr}\\${p_script_name}\" '; --/INFILES=\"${p_wsp_prj_souces}\\${p_srcfile}\" /DEBUGLOG=\"${p_wsp_logs_upgr}\\${p_srcfile}.log\" ';\n  \n  C_BATCH_VERSION_def CONSTANT VARCHAR2(2048) := '${p_config_formsapi_execute} /BATCH /MODE=CHECKVERSION /FILES=\"${p_source_dir}\\${p_srcfile}\" /TARGETDIR=\"${p_script_dir}\" /OUT=\"${p_script_dir}\\check.txt\" ';\n\n  C_FAM_SCRIPT_chkref CONSTANT VARCHAR2(2048):=\n  'DECLARE\n  frm : number;\n  // --- Main\nBEGIN\n  logadd(\\''--- BO Start Check - Subclass References ---\\'');\n  API_IgnoreMissingReferences(false);\n  try\n     frm := API_LoadModule(\\''${p_source_dir}\\${p_srcfile}\\'');\n  except\n     logadd(\\''$$$ EXCEPTION: Fehler beim Modul Laden - Subclassing ?  $$$\\'');\n     RETURN;\n  end;\n  logadd(\\''--- EO Start Check - Subclass References ---\\'');\n  API_DestroyModule(frm);\nEND; // --- Main ';\n\n  -- check 'references' script --\n  C_CMD_RUN_SCRIPT_chkref CONSTANT VARCHAR2(2048):= \n    'SET FORMS_PATH=${p_source_dir}'||chr(10)||\n    'CD ${p_addon_dir}'||chr(10)||\n    '\"${p_config_formsapi_execute}\" /SCRIPT /API=12c /RUN=\"${p_script_dir}\\${p_script_name}\" ';\n    \n  -- migration scripts         --\n  C_CMD_RUN_SCRIPT_def_mig CONSTANT VARCHAR2(2048):= \n    '${p_source_network}'||chr(10)||\n    'CD ${p_addon_dir}'||chr(10)||\n    '\"${p_config_formsapi_execute}\" /SCRIPT /API=12c /RUN=\"${p_script_dir}\\${p_script_name}\" ';\n  \n    -- migration scripts         --\n  C_CMD_RUN_SCRIPT_def_win2unix CONSTANT VARCHAR2(2048):= \n    'SET FORMS_PATH=${p_addon_dir}'||chr(10)||\n    '\"${p_config_formsapi_execute}\" /SCRIPT /API=12c /RUN=\"${p_script_dir}\\${p_script_name}\" ';\n \n   \n  -- Migration\n  -- cmd /c call %cddir_installfam% /script /API=11g /HOMES=\"c:\\oracle\\weblogic1036\\Oracle_FRHome1\\BIN\" /RUN=%cddir_skripte%\\mig_main_one.p2s /LOG=%cddir_skripte%\\log_migration_one_fmb.txt\n  -- echo Win2Unix Verarbeitung\n  -- c:\n  -- cd %cddir%\n  -- cmd /c call %cddir_installfam% /script /API=11g /HOMES=\"c:\\oracle\\weblogic1036\\Oracle_FRHome1\\BIN\" /RUN=%cddir_skripte%\\mig_Win2Unix_one.p2s /LOG=%cddir_skripte%\\log_win2unix_one.txt\n  \n  C_BATCH_COMPILE_def CONSTANT VARCHAR2(2048):= \n    '${p_source_network}'||chr(10)||\n    'CD ${p_addon_dir}'||chr(10)||\n    '${p_config_formsapi_execute} /BATCH /MODE=COMPILE /COMPILEALL=Y /USERID=\"${p_db_connect}\" /FILES=\"${p_unix_dir}\\${p_srcfile}\" /TARGETDIR=\"${p_comp_dir}\" /OUT=\"${p_log_dir}\\${p_log_file}\" ';\n\n  C_BATCH_FORMS_COMPILE_def CONSTANT VARCHAR2(2048):= \n    '${p_source_network}'||chr(10)||\n    'CD ${p_addon_dir}'||chr(10)||\n    'frmcmp \"${p_unix_dir}\\${p_srcfile}\" userid=${p_db_connect} module_type=${p_type} batch=yes window_state=minimize output_file=\"${p_comp_dir}\\${p_compfile}\" compile_all=yes';\n\n  C_BATCH_REPORTS_COMPILE_def CONSTANT VARCHAR2(2048):= \n    '${p_source_network}'||chr(10)||\n    'CD ${p_addon_dir}'||chr(10)||\n    'rwconverter userid=${p_db_connect} stype=RDFFILE source=\"${p_unix_dir}\\${p_srcfile}\" dest=\"${p_comp_dir}\\${p_compfile}\" dtype=REPFILE overwrite=YES compile_all=yes batch=YES';\n\n  m_CMD_RUN_chkref     VARCHAR2(2048);\n  m_CMD_RUN_SCRIPT      VARCHAR2(2048); \n  m_FAM_SCRIPT_chkref  VARCHAR2(4096);\n  \n  m_BATCH_VERSION_run  VARCHAR2(2048);\n  m_BATCH_COMPILE_run  VARCHAR2(4096);\n  \n  m_log       CONSTANT BOOLEAN := FALSE;\n  \n-------------------------------------------------------------------------------------------------------  \n  PROCEDURE prc_iflog (p_log     VARCHAR2,    \n                       p_1      VARCHAR2 DEFAULT NULL, \n                        p_2      VARCHAR2 DEFAULT NULL, \n                       p_3      VARCHAR2 DEFAULT NULL, \n                       p_4      VARCHAR2 DEFAULT NULL, \n                        p_5      VARCHAR2 DEFAULT NULL, \n                       p_msg2    VARCHAR2 DEFAULT '.',\n                       p_TYPE   VARCHAR2 DEFAULT 'INFO') IS\n  BEGIN\n     IF m_log THEN\n        prc_flog(p_log, p_1, p_2, p_3, p_4, p_5, p_msg2, p_TYPE);\n     END IF;\n  END prc_iflog;\n\n-------------------------------------------------------------------------------------------------------    \n  PROCEDURE prc_wrt_CMD(p_cmd_name VARCHAR2, p_script VARCHAR2) IS\n     l_io_file    Text_IO.File_Type;\n     l_io_file_C  client_Text_IO.File_Type;\n  BEGIN\n     g.msg_push('pkg_run_FAM_script.prc_wrt_CMD');\n     \n     IF :PARAMETER.P_HOST_CLIENT='HOST' THEN \n        SYNCHRONIZE;\n        l_io_file := Text_IO.Fopen(:PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||p_cmd_name, 'w');\n        Text_IO.put_line(l_io_file, p_script);                                                                         \n        Text_IO.fclose  (l_io_file);\n        SYNCHRONIZE;\n     \n     ELSIF :PARAMETER.P_HOST_CLIENT='CLIENT' THEN \n        SYNCHRONIZE;\n        l_io_file_C := client_Text_IO.Fopen(:PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||p_cmd_name, 'w');\n        client_Text_IO.put_line(l_io_file_C, p_script);                                                                         \n        client_Text_IO.fclose  (l_io_file_C);\n        SYNCHRONIZE;\n     \n     END IF;\n     \n      g.msg_free;\n     \n  EXCEPTION WHEN OTHERS THEN\n     prc_EXCEPTION;\n  END prc_wrt_CMD;\n\n-------------------------------------------------------------------------------------------------------    \n  PROCEDURE prc_run_batch_version_cmd (p_srcfile VARCHAR2) IS\n    -- p_batch : dummy .\n  BEGIN\n    g.msg_push('pkg_FAM_run_Script.prc_run_batch_version_cmd');  \n      \n    -- save actual source file --\n    :PARAMETER.P_SOURCE_FILE:= p_srcfile;\n    \n    m_BATCH_VERSION_run:= C_BATCH_VERSION_def;\n\n    m_BATCH_COMPILE_run:= replace(m_BATCH_COMPILE_run, '${p_source_network}',             substr(:PARAMETER.P_ADDON_DIR,1,2));   \n    m_BATCH_VERSION_run:= replace(m_BATCH_VERSION_run, '${p_config_formsapi_execute}',   :PARAMETER.P_CONFIG_FORMSAPI_EXECUTE);\n    m_BATCH_VERSION_run:= replace(m_BATCH_VERSION_run, '${p_srcfile}',                   p_srcfile);\n    m_BATCH_VERSION_run:= replace(m_BATCH_VERSION_run, '${p_source_dir}',               :PARAMETER.P_SOURCE_DIR);\n     m_BATCH_VERSION_run:= replace(m_BATCH_VERSION_run, '${p_script_dir}',                :PARAMETER.P_SCRIPT_DIR);\n    \n     prc_iflog('--- BO SCRIP-CHECK : '||  m_BATCH_VERSION_run);\n     \n     -- 22.03.2017 / 26.04.2017 -- \n     IF :PARAMETER.P_HOST_CLIENT='CLIENT' THEN \n       WEBUTIL_HOST.BLOCKING(  m_BATCH_VERSION_run );    \n     ELSIF :PARAMETER.P_HOST_CLIENT='HOST' THEN      \n       HOST( m_BATCH_VERSION_run, NO_SCREEN );  \n     END IF;\n     \n    g.msg_free;\n    \n  EXCEPTION WHEN OTHERS THEN\n     prc_EXCEPTION;\n  END prc_run_batch_version_cmd;\n  \n  ----------------------------------------------------------------------------------------------------------------------------\n  --- ACHTUNG: SOURCE-DIR := UNIX-DIR !!! <<<<<<<<<<<<<<<<<<<\n  -----------------------------------------------------------\n  PROCEDURE prc_run_batch_comp_forms_cmd (p_srcfile VARCHAR2, p_compfile VARCHAR2, p_type VARCHAR2 DEFAULT 'FORM') IS\n    -- p_batch : dummy .\n  BEGIN\n    g.msg_push('pkg_FAM_run_Script.prc_run_batch_compile_forms_cmd');  \n      \n    -- save actual source file --\n    :PARAMETER.P_SOURCE_FILE:= p_srcfile;\n    \n    ------------------- BO - write BATCH ---------------------\n    m_BATCH_COMPILE_run:= C_BATCH_FORMS_COMPILE_def;\n      \n     -- m_BATCH_COMPILE_run:= replace(m_BATCH_COMPILE_run, '${p_config_formsapi_execute}',   :PARAMETER.P_CONFIG_FORMSAPI_EXECUTE);\n     m_BATCH_COMPILE_run:= replace(m_BATCH_COMPILE_run, '${p_source_network}',             substr(:PARAMETER.P_ADDON_DIR,1,2));\n     m_BATCH_COMPILE_run:= replace(m_BATCH_COMPILE_run, '${p_source_dir}',                :PARAMETER.P_UNIX_DIR);\n     m_BATCH_COMPILE_run:= replace(m_BATCH_COMPILE_run, '${p_addon_dir}',                :PARAMETER.P_ADDON_DIR);\n    m_BATCH_COMPILE_run:= replace(m_BATCH_COMPILE_run, '${p_srcfile}',                   p_srcfile);\n    m_BATCH_COMPILE_run:= replace(m_BATCH_COMPILE_run, '${p_unix_dir}',                 :PARAMETER.P_UNIX_DIR);\n     -- m_BATCH_COMPILE_run:= replace(m_BATCH_COMPILE_run, '${p_script_dir}',                :PARAMETER.P_SCRIPT_DIR);\n     m_BATCH_COMPILE_run:= replace(m_BATCH_COMPILE_run, '${p_db_connect}',                :PARAMETER.P_DB_CONNECT);\n     m_BATCH_COMPILE_run:= replace(m_BATCH_COMPILE_run, '${p_comp_dir}',                  :PARAMETER.P_COMP_DIR);\n     m_BATCH_COMPILE_run:= replace(m_BATCH_COMPILE_run, '${p_compfile}',                   p_compfile);\n     m_BATCH_COMPILE_run:= replace(m_BATCH_COMPILE_run, '${p_type}',                       p_type);\n     m_BATCH_COMPILE_run:= replace(m_BATCH_COMPILE_run, '${p_log_dir}',                  :PARAMETER.P_LOG_DIR);\n     m_BATCH_COMPILE_run:= replace(m_BATCH_COMPILE_run, '${p_log_file}',                   p_srcfile||'-compile.txt');\n\n     prc_wrt_CMD('do_forms_compile.cmd', m_BATCH_COMPILE_run);\n     \n     SYNCHRONIZE; -- ??? --\n      \n     ------------------- EO - write BATCH ---------------------\n      \n     prc_iflog('--- BO BATCH-COMPILE : '||  m_BATCH_COMPILE_run);\n     \n    -- 22.03.2017 -- \n    IF :PARAMETER.P_HOST_CLIENT='CLIENT' THEN   \n       WEBUTIL_HOST.BLOCKING( 'CMD /C call ' || :PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'do_forms_compile.cmd' ); \n     ELSIF  :PARAMETER.P_HOST_CLIENT='HOST' THEN     \n       HOST('CMD /C call ' || :PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'do_forms_compile.cmd' , NO_SCREEN );\n     END IF;\n     \n    g.msg_free;\n    \n  EXCEPTION WHEN OTHERS THEN\n     prc_EXCEPTION;\n  END prc_run_batch_comp_forms_cmd;\n\n-------------------------------------------------------------------------------------------------------    \n  PROCEDURE prc_run_batch_comp_reports_cmd (p_srcfile VARCHAR2, p_compfile VARCHAR2, p_type VARCHAR2 DEFAULT 'REPORTS') IS\n    -- p_batch : dummy .\n  BEGIN\n    g.msg_push('pkg_FAM_run_Script.prc_run_batch_compile_reports_cmd');  \n      \n    -- save actual source file --\n    :PARAMETER.P_SOURCE_FILE:= p_srcfile;\n    \n    ------------------- BO - write BATCH ---------------------\n    m_BATCH_COMPILE_run:= C_BATCH_REPORTS_COMPILE_def;\n      \n     -- m_BATCH_COMPILE_run:= replace(m_BATCH_COMPILE_run, '${p_config_formsapi_execute}',   :PARAMETER.P_CONFIG_FORMSAPI_EXECUTE);\n     m_BATCH_COMPILE_run:= replace(m_BATCH_COMPILE_run, '${p_source_network}',             substr(:PARAMETER.P_ADDON_DIR,1,2));\n     m_BATCH_COMPILE_run:= replace(m_BATCH_COMPILE_run, '${p_source_dir}',                :PARAMETER.P_UNIX_DIR);\n     m_BATCH_COMPILE_run:= replace(m_BATCH_COMPILE_run, '${p_addon_dir}',                :PARAMETER.P_ADDON_DIR);\n    m_BATCH_COMPILE_run:= replace(m_BATCH_COMPILE_run, '${p_srcfile}',                   p_srcfile);\n    m_BATCH_COMPILE_run:= replace(m_BATCH_COMPILE_run, '${p_unix_dir}',                 :PARAMETER.P_UNIX_DIR);\n     -- m_BATCH_COMPILE_run:= replace(m_BATCH_COMPILE_run, '${p_script_dir}',                :PARAMETER.P_SCRIPT_DIR);\n     m_BATCH_COMPILE_run:= replace(m_BATCH_COMPILE_run, '${p_db_connect}',                :PARAMETER.P_DB_CONNECT);\n     m_BATCH_COMPILE_run:= replace(m_BATCH_COMPILE_run, '${p_comp_dir}',                  :PARAMETER.P_COMP_DIR);\n     m_BATCH_COMPILE_run:= replace(m_BATCH_COMPILE_run, '${p_compfile}',                   p_compfile);\n     m_BATCH_COMPILE_run:= replace(m_BATCH_COMPILE_run, '${p_type}',                       p_type);\n     m_BATCH_COMPILE_run:= replace(m_BATCH_COMPILE_run, '${p_log_dir}',                  :PARAMETER.P_LOG_DIR);\n     m_BATCH_COMPILE_run:= replace(m_BATCH_COMPILE_run, '${p_log_file}',                   p_srcfile||'-compile.txt');\n\n     prc_wrt_CMD('do_reports_compile.cmd', m_BATCH_COMPILE_run);\n     \n     SYNCHRONIZE; -- ??? --\n      \n     ------------------- EO - write BATCH ---------------------\n      \n     prc_iflog('--- BO BATCH-COMPILE : '||  m_BATCH_COMPILE_run);\n     \n    -- 22.03.2017 -- \n    IF :PARAMETER.P_HOST_CLIENT='CLIENT' THEN      \n        WEBUTIL_HOST.BLOCKING( 'CMD /C call ' || :PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'do_reports_compile.cmd' ); \n     ELSIF  :PARAMETER.P_HOST_CLIENT='HOST' THEN     \n       HOST('CMD /C call ' || :PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'do_reports_compile.cmd' , NO_SCREEN );\n     END IF;\n     \n    g.msg_free;\n    \n  EXCEPTION WHEN OTHERS THEN\n     prc_EXCEPTION;\n  END prc_run_batch_comp_reports_cmd;\n  \n  ----------------------------------------------------------------------------------------------------------------------------\n  --- ACHTUNG: SOURCE-DIR := UNIX-DIR !!! <<<<<<<<<<<<<<<<<<<\n  -----------------------------------------------------------\n  PROCEDURE prc_run_batch_compile_cmd (p_srcfile VARCHAR2) IS\n    -- p_batch : dummy .\n  BEGIN\n    g.msg_push('pkg_FAM_run_Script.prc_run_batch_compile_cmd');  \n      \n    -- save actual source file --\n    :PARAMETER.P_SOURCE_FILE:= p_srcfile;\n    \n    ------------------- BO - write BATCH ---------------------\n    m_BATCH_COMPILE_run:= C_BATCH_COMPILE_def;\n\n    m_BATCH_COMPILE_run:= replace(m_BATCH_COMPILE_run, '${p_source_network}',             substr(:PARAMETER.P_ADDON_DIR,1,2));      \n     m_BATCH_COMPILE_run:= replace(m_BATCH_COMPILE_run, '${p_config_formsapi_execute}',   :PARAMETER.P_CONFIG_FORMSAPI_EXECUTE);\n     m_BATCH_COMPILE_run:= replace(m_BATCH_COMPILE_run, '${p_source_dir}',                :PARAMETER.P_UNIX_DIR);\n     m_BATCH_COMPILE_run:= replace(m_BATCH_COMPILE_run, '${p_addon_dir}',                :PARAMETER.P_ADDON_DIR);\n    m_BATCH_COMPILE_run:= replace(m_BATCH_COMPILE_run, '${p_srcfile}',                   p_srcfile);\n    m_BATCH_COMPILE_run:= replace(m_BATCH_COMPILE_run, '${p_unix_dir}',                 :PARAMETER.P_UNIX_DIR);\n     m_BATCH_COMPILE_run:= replace(m_BATCH_COMPILE_run, '${p_script_dir}',                :PARAMETER.P_SCRIPT_DIR);\n     m_BATCH_COMPILE_run:= replace(m_BATCH_COMPILE_run, '${p_db_connect}',                :PARAMETER.P_DB_CONNECT);\n     m_BATCH_COMPILE_run:= replace(m_BATCH_COMPILE_run, '${p_comp_dir}',                  :PARAMETER.P_COMP_DIR);\n     m_BATCH_COMPILE_run:= replace(m_BATCH_COMPILE_run, '${p_log_dir}',                  :PARAMETER.P_LOG_DIR);\n     m_BATCH_COMPILE_run:= replace(m_BATCH_COMPILE_run, '${p_log_file}',                  p_srcfile||'-compile.txt');\n\n     prc_wrt_CMD('do_compile.cmd', m_BATCH_COMPILE_run);\n     \n     SYNCHRONIZE;\n      \n     ------------------- EO - write BATCH ---------------------\n      \n     prc_iflog('--- BO BATCH-COMPILE : '||  m_BATCH_COMPILE_run);\n\n    -- 22.03.2017 -- \n    IF :PARAMETER.P_HOST_CLIENT='CLIENT' THEN      \n        WEBUTIL_HOST.BLOCKING( 'CMD /C call ' || :PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'do_compile.cmd' );    \n     ELSIF :PARAMETER.P_HOST_CLIENT='HOST' THEN   \n       HOST( 'CALL '||:PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'do_compile.cmd' , NO_SCREEN );    \n     END IF;\n     \n    g.msg_free;\n    \n  EXCEPTION WHEN OTHERS THEN\n     prc_EXCEPTION;\n  END prc_run_batch_compile_cmd;\n  \n  ----------------------------------------------------------------------------------------------------------------------------\n  PROCEDURE prc_run_FAM_check_script(p_srcfile VARCHAR2) IS \n  BEGIN\n     g.msg_push('pkg_run_FAM_script.prc_run_FAM_check_script');\n     \n     -- save actual source file --\n     :PARAMETER.P_SOURCE_FILE:= p_srcfile;\n       \n     ------------------- BO - write SCRIPT ---------------------\n     m_FAM_SCRIPT_chkref:= C_FAM_SCRIPT_chkref;\n     m_FAM_SCRIPT_chkref:= replace(C_FAM_SCRIPT_chkref, '\\''', '''');\n     m_FAM_SCRIPT_chkref:= replace(m_FAM_SCRIPT_chkref, '${p_source_dir}',:PARAMETER.P_SOURCE_DIR);\n     m_FAM_SCRIPT_chkref:= replace(m_FAM_SCRIPT_chkref, '${p_srcfile}',p_srcfile);\n      \n     prc_wrt_CMD('check-ref.p2s', m_FAM_SCRIPT_chkref);    \n     ------------------- EO - write SCRIPT ---------------------\n     \n     ------------------- BO - write CMD ------------------------\n     m_CMD_RUN_chkref:= C_CMD_RUN_SCRIPT_chkref;\n     --- 1.) set FORMS_PATH ! then check references ! --   \n     m_CMD_RUN_chkref:= replace(m_CMD_RUN_chkref, '${p_source_dir}',:PARAMETER.P_SOURCE_DIR);\n     m_CMD_RUN_chkref:= replace(m_CMD_RUN_chkref, '${p_addon_dir}',:PARAMETER.P_ADDON_DIR);\n     m_CMD_RUN_chkref:= replace(m_CMD_RUN_chkref, '${p_srcfile}',p_srcfile);\n     -- 2.) set & write CMD --\n     m_CMD_RUN_chkref:= replace(m_CMD_RUN_chkref, '${p_config_formsapi_execute}', :PARAMETER.P_CONFIG_FORMSAPI_EXECUTE);\n     m_CMD_RUN_chkref:= replace(m_CMD_RUN_chkref, '${p_script_dir}',              :PARAMETER.P_SCRIPT_DIR);\n     m_CMD_RUN_chkref:= replace(m_CMD_RUN_chkref, '${p_script_name}',              'check-ref.p2s');\n     \n     --prc_info(m_CMD_RUN_chkref);\n     prc_wrt_CMD('check-ref.cmd', m_CMD_RUN_chkref);\n     SYNCHRONIZE;\n     \n     ------------------- EO - write CMD ------------------------\n          \n     -- 3.) run CMD         --\n     prc_iflog('--- BO SCRIPT-CHECK-REF : '||m_CMD_RUN_chkref);\n     \n     -- 22.03.2017 /26.04.2017 -- \n     IF :PARAMETER.P_HOST_CLIENT='CLIENT' THEN \n         WEBUTIL_HOST.BLOCKING( 'CMD /C CALL '||:PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'check-ref.cmd' ); \n      ELSIF  :PARAMETER.P_HOST_CLIENT='HOST' THEN \n        HOST( 'CMD /C CALL '||:PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'check-ref.cmd' , NO_SCREEN );\n      END IF;\n      \n      prc_iflog('--- EO SCRIPT-CHECK-REF --- ');\n      \n     g.msg_free;\n     \n  EXCEPTION WHEN OTHERS THEN\n     prc_EXCEPTION;\n  END prc_run_FAM_check_script;\n\n  ----------------------------------------------------------------------------------------------------------------------------\n  PROCEDURE prc_run_FAM_script_mig(p_script_name VARCHAR2) IS \n  BEGIN\n     g.msg_push('pkg_run_FAM_script.prc_run_FAM_script_mig');\n     \n     m_CMD_RUN_SCRIPT:= C_CMD_RUN_SCRIPT_def_mig;\n     \n     -- 1.) set FORMS_PATH  --\n     m_CMD_RUN_SCRIPT:=replace(m_CMD_RUN_SCRIPT,  '${p_addon_dir}',        :PARAMETER.P_ADDON_DIR);\n     m_CMD_RUN_SCRIPT:= replace(m_CMD_RUN_SCRIPT, '${p_source_dir}',       :PARAMETER.P_SOURCE_DIR);\n     m_CMD_RUN_SCRIPT:= replace(m_CMD_RUN_SCRIPT, '${p_source_network}',  substr(:PARAMETER.P_ADDON_DIR,1,2));\n     \n     -- 2.) set & write CMD --\n     m_CMD_RUN_SCRIPT:= replace(m_CMD_RUN_SCRIPT, '${p_config_formsapi_execute}', :PARAMETER.P_CONFIG_FORMSAPI_EXECUTE);\n     m_CMD_RUN_SCRIPT:= replace(m_CMD_RUN_SCRIPT, '${p_script_dir}',              :PARAMETER.P_SCRIPT_DIR);\n     m_CMD_RUN_SCRIPT:= replace(m_CMD_RUN_SCRIPT, '${p_script_name}',              p_script_name);\n          \n     prc_wrt_CMD('run_migration_one.cmd', m_CMD_RUN_SCRIPT);\n     \n     SYNCHRONIZE;\n     \n     -- 3.) run CMD         --\n     prc_iflog('--- BO SCRIPT-MIGRATE-ONE : '||  m_CMD_RUN_SCRIPT);\n  \n     -- 22.03.2017 /26.04.2017 -- \n     IF :PARAMETER.P_HOST_CLIENT='CLIENT' THEN \n         WEBUTIL_HOST.BLOCKING( 'CMD /C CALL '||:PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'run_migration_one.cmd' );\n      ELSIF  :PARAMETER.P_HOST_CLIENT='HOST' THEN \n        HOST( 'CMD /C CALL '||:PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'run_migration_one.cmd' , NO_SCREEN );\n      END IF;  \n      \n      prc_iflog('--- EO SCRIPT-MIGRATE-ONE --- ');\n      \n     g.msg_free;\n     \n  EXCEPTION WHEN OTHERS THEN\n     prc_EXCEPTION;\n  END prc_run_FAM_script_mig;\n  \n  ----------------------------------------------------------------------------------------------------------------------------  \n  PROCEDURE prc_run_FAM_script_win2unix(p_script_name VARCHAR2) IS \n  BEGIN\n     g.msg_push('pkg_run_FAM_script.prc_run_FAM_script_w2unix');\n     \n     m_CMD_RUN_SCRIPT:= C_CMD_RUN_SCRIPT_def_win2unix;\n     \n     -- 1.) set FORMS_PATH  --\n     m_CMD_RUN_SCRIPT:=replace(m_CMD_RUN_SCRIPT,  '${p_addon_dir}',        :PARAMETER.P_ADDON_DIR);\n     m_CMD_RUN_SCRIPT:= replace(m_CMD_RUN_SCRIPT, '${p_source_dir}',       :PARAMETER.P_SOURCE_DIR);\n     m_CMD_RUN_SCRIPT:= replace(m_CMD_RUN_SCRIPT, '${p_source_network}',  substr(:PARAMETER.P_ADDON_DIR,1,2));\n     \n     -- 2.) set & write CMD --\n     m_CMD_RUN_SCRIPT:= replace(m_CMD_RUN_SCRIPT, '${p_config_formsapi_execute}', :PARAMETER.P_CONFIG_FORMSAPI_EXECUTE);\n     m_CMD_RUN_SCRIPT:= replace(m_CMD_RUN_SCRIPT, '${p_script_dir}',              :PARAMETER.P_SCRIPT_DIR);\n     m_CMD_RUN_SCRIPT:= replace(m_CMD_RUN_SCRIPT, '${p_script_name}',              p_script_name);\n          \n     prc_wrt_CMD('run_win2unix.cmd', m_CMD_RUN_SCRIPT);\n     \n     SYNCHRONIZE;\n     \n     -- 3.) run CMD         --\n     prc_iflog('--- BO SCRIPT-MIGRATE-ONE : '||  m_CMD_RUN_SCRIPT);\n  \n     -- 22.03.2017 /26.04.2017 -- \n     IF :PARAMETER.P_HOST_CLIENT='CLIENT' THEN \n         WEBUTIL_HOST.BLOCKING( 'CMD /C CALL '||:PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'run_win2unix.cmd' );\n      ELSIF  :PARAMETER.P_HOST_CLIENT='HOST' THEN \n        HOST( 'CMD /C CALL '||:PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'run_win2unix.cmd' , NO_SCREEN );\n      END IF;\n      \n      prc_iflog('--- EO SCRIPT-MIGRATE-ONE --- ');\n      \n     g.msg_free;\n     \n  EXCEPTION WHEN OTHERS THEN\n     prc_EXCEPTION;\n  END prc_run_FAM_script_win2unix;\n  \n  ---------------------------------------------------------------------------------------------------------------------------------\n  \nEND pkg_FAM_run_Script;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/PKG_FAM_RUN_SCRIPT.pks",
    "content": "PACKAGE pkg_FAM_run_Script IS\n  \n  \n  -- F.Matz: 15.01.2017 , 21.02.2017\n  \n  PROCEDURE prc_run_batch_version_cmd (p_srcfile VARCHAR2);\n  \n  PROCEDURE prc_run_batch_comp_forms_cmd (p_srcfile VARCHAR2, p_compfile VARCHAR2, p_type VARCHAR2 DEFAULT 'FORM');\n \n  PROCEDURE prc_run_batch_comp_reports_cmd (p_srcfile VARCHAR2, p_compfile VARCHAR2, p_type VARCHAR2 DEFAULT 'REPORTS');\n \n  PROCEDURE prc_run_batch_compile_cmd (p_srcfile VARCHAR2);\n  \n  PROCEDURE prc_run_FAM_script_mig(p_script_name VARCHAR2);\n  \n  PROCEDURE prc_run_FAM_script_win2unix(p_script_name VARCHAR2);\n  \n  PROCEDURE prc_run_FAM_check_script(p_srcfile VARCHAR2);\n  \n  PROCEDURE prc_wrt_CMD(p_cmd_name VARCHAR2, p_script VARCHAR2);\n  \n  \n  \nEND pkg_FAM_run_Script;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/PRC_ABORT.pcd",
    "content": "PROCEDURE prc_ABORT IS\nBEGIN\n  \n  prc_info('$$$ The module is now closed ! $$$');\n  \n  EXIT_FORM; -- <<< SENSE <<<\n  \nEND prc_ABORT;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/PRC_CHECK_FAM.pcd",
    "content": "PROCEDURE prc_Check_FAM IS\n\n    C_SCRIPT_CHECK CONSTANT VARCHAR2(512) := '${p_formsapi_execute} /SCRIPT /RUN=\"${p_script_dir}\\${p_script_name}\"  /output=\"${p_log_dir}\"';\n    \n    C_SCRIPT_CHECK_def CONSTANT VARCHAR2(512):= \n'PROGRAM Check_FAM;\n\n//Begin Main\nBEGIN\n  // -- get the current FormsAPI Master Version\n  logadd(\\''Version      : \\''+GetFormsAPIMasterVersionInfo);\n  logadd(\\''license Name : \\''+getLicenseName );\n\n  // -- who is running me?\n  logadd(GetUserName+\\''@\\''+GetComputerName);\n\n  // -- what is my script name?\n  logadd(GetScriptName);\n \n  logadd( \\''drives : \\''+getDrives );\n\nEND.\n//End Main\n       ';\n          \n    l_script_check VARCHAR2(4096);\n    l_in_file      Text_IO.File_Type;\n    l_in_file_C    client_Text_IO.File_Type;\n    l_in_buff      VARCHAR2(400);\n    l_buff_all     VARCHAR2(4000);\n    l_cnt          NUMBER(4);\n    l_cmd         VARCHAR2(4096);\n         \n BEGIN\n   \n    g.msg_push('prc_check_FAM');    \n    \n    IF :PARAMETER.P_CONFIG_FORMSAPI_EXECUTE IS NULL THEN      \n       prc_ERROR('$$$ FormsAPI Master not found - ABORT ! $$$');\n       EXIT_FORM;\n    END IF;\n    \n    -- write check script --\n    prc_write_script(:PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'check-fam.p2s', replace(C_SCRIPT_CHECK_def, '\\''', ''''));\n    \n    SYNCHRONIZE;\n    \n    -- set rdy => run     --   \n    l_script_check := C_SCRIPT_CHECK;\n    \n    l_script_check:= replace(l_script_check, '${p_formsapi_execute}', :PARAMETER.P_CONFIG_FORMSAPI_EXECUTE); \n    l_script_check:= replace(l_script_check, '${p_script_dir}',       :PARAMETER.P_SCRIPT_DIR);\n    l_script_check:= replace(l_script_check, '${p_script_name}',      'check-fam.p2s');\n    l_script_check:= replace(l_script_check, '${p_log_dir}',           :PARAMETER.P_LOG_DIR);\n    \n    IF :PARAMETER.P_HOST_CLIENT='HOST' THEN \n      \n       l_cmd:= 'CMD /C IF EXIST '||:PARAMETER.P_SCRIPT_DIR||'\\check-fam.log'||' DEL '||:PARAMETER.P_SCRIPT_DIR||'\\check-fam.log';\n       \n       HOST( l_cmd, NO_SCREEN );  \n       SYNCHRONIZE;\n       \n        pkg_FAM_run_Script.prc_wrt_CMD('do_check_fam.cmd', l_script_check);\n        SYNCHRONIZE;\n            \n       HOST( 'CMD /C CALL '||:PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'do_check_fam.cmd', NO_SCREEN);  \n       SYNCHRONIZE;\n      \n       --- Read results ---    \n       l_cnt:=1;\n       l_buff_all:='';\n       l_in_file := Text_IO.Fopen(:PARAMETER.P_SCRIPT_DIR||'\\check-fam.log', 'r');\n       LOOP\n         BEGIN\n             Text_IO.get_line(l_in_File, l_in_buff);\n             l_buff_all:= l_buff_all||replace(l_in_buff,'          ',' ')||'/';   \n             IF    l_cnt=2 THEN \n                   :PARAMETER.P_FORMSAPI_VERSION := substr(l_in_buff, 35, length(l_in_buff)+1-35);\n             ELSIF l_cnt=3 THEN    \n                   :PARAMETER.P_FORMSAPI_LICENSE:= substr(l_in_buff, 35, length(l_in_buff)+1-35);\n             END IF;\n             l_cnt:= l_cnt+1;\n         EXCEPTION \n             WHEN NO_DATA_FOUND THEN\n               Text_IO.Fclose(l_in_File);\n               EXIT;\n             WHEN OTHERS THEN\n               Text_IO.Fclose(l_in_File);\n               prc_error('$$$ Fehler in prc_Check_FAM: '||sqlerrm);\n               EXIT;\n             EXIT;\n         END ;\n       END LOOP;\n    \n    ELSIF :PARAMETER.P_HOST_CLIENT='CLIENT' THEN \n      \n        IF webutil_file.file_exists(:PARAMETER.P_SCRIPT_DIR||'\\check-fam.log') THEN\n          IF webutil_file.delete_file(:PARAMETER.P_SCRIPT_DIR||'\\check-fam.log') THEN\n             NULL;\n          END IF;\n        END IF;\n      \n        pkg_FAM_run_Script.prc_wrt_CMD('do_check_fam.cmd', l_script_check);\n        SYNCHRONIZE;\n            \n       WEBUTIL_HOST.BLOCKING( 'CMD /C CALL '||:PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'do_check_fam.cmd' );  \n       SYNCHRONIZE;\n      \n       --- Read results ---    \n       l_cnt:=1;\n       l_buff_all:='';\n       l_in_file_C := client_Text_IO.Fopen(:PARAMETER.P_SCRIPT_DIR||'\\check-fam.log', 'r');\n       LOOP\n         BEGIN\n             client_Text_IO.get_line(l_in_File_C, l_in_buff);\n             l_buff_all:= l_buff_all||replace(l_in_buff,'          ',' ')||'/';   \n             IF    l_cnt=2 THEN \n                   :PARAMETER.P_FORMSAPI_VERSION := substr(l_in_buff, 35, length(l_in_buff)+1-35);\n             ELSIF l_cnt=3 THEN    \n                   :PARAMETER.P_FORMSAPI_LICENSE:= substr(l_in_buff, 35, length(l_in_buff)+1-35);\n             END IF;\n             l_cnt:= l_cnt+1;\n         EXCEPTION \n             WHEN NO_DATA_FOUND THEN\n               client_Text_IO.Fclose(l_in_File_C);\n               EXIT;\n             WHEN OTHERS THEN\n               client_Text_IO.Fclose(l_in_File_C);\n               prc_error('$$$ Fehler in prc_Check_FAM: '||sqlerrm);\n               EXIT;\n             EXIT;\n         END ;\n       END LOOP;\n               \n    END IF;\n               \n    g.msg_free;\n                  \nEXCEPTION WHEN OTHERS THEN\n    prc_EXCEPTION;\n           \nEND prc_check_FAM;\n "
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/PRC_CMD_HOST_CLIENT.pcd",
    "content": "\n-- 09.03.2017 --\n\nPROCEDURE prc_CMD_HOST_CLIENT(p_command VARCHAR2, p_blocking BOOLEAN DEFAULT TRUE) IS\nBEGIN\n  \n   CASE   \n     WHEN UPPER(:PARAMETER.P_HOST_CLIENT)='HOST' THEN      \n           HOST( p_COMMAND, NO_SCREEN );      \n\n     WHEN UPPER(:PARAMETER.P_HOST_CLIENT)='CLIENT' THEN        \n          IF p_blocking THEN\n             WEBUTIL_HOST.BLOCKING( p_command );\n          ELSE\n             WEBUTIL_HOST.NONBLOCKING( p_command );\n          END IF;\n   END CASE;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/PRC_CNG_MONTH_TIME.pcd",
    "content": "PROCEDURE prc_cng_month_time IS\n   l_time VARCHAR2(32);\n   l_h    VARCHAR2(16);\n   l_m    VARCHAR2(16);\n   l_mon  VARCHAR2(3);\nBEGIN\n   l_mon:= upper(substr(:BLK_HANDLG.DFILE, 4,3));\n   \n   IF    l_mon = ('JAN') THEN\n       :BLK_HANDLG.DFILE:= replace( upper(:BLK_HANDLG.DFILE), 'JAN', '01'); \n   ELSIF l_mon = ('FEB') THEN\n       :BLK_HANDLG.DFILE:= replace( upper(:BLK_HANDLG.DFILE), 'FEB', '02'); \n   ELSIF l_mon = ('MAR') THEN \n       :BLK_HANDLG.DFILE:= replace( upper(:BLK_HANDLG.DFILE), 'MAR', '03'); \n   ELSIF l_mon = ('MRZ') THEN\n       :BLK_HANDLG.DFILE:= replace( upper(:BLK_HANDLG.DFILE), 'MRZ', '03'); \n   ELSIF l_mon = ('APR') THEN\n       :BLK_HANDLG.DFILE:= replace( upper(:BLK_HANDLG.DFILE), 'APR', '04'); \n   ELSIF l_mon = ('MAI') THEN\n       :BLK_HANDLG.DFILE:= replace( upper(:BLK_HANDLG.DFILE), 'MAI', '05'); \n   ELSIF l_mon = ('MAY') THEN\n       :BLK_HANDLG.DFILE:= replace( upper(:BLK_HANDLG.DFILE), 'MAY', '05'); \n   ELSIF l_mon = ('JUN') THEN\n       :BLK_HANDLG.DFILE:= replace( upper(:BLK_HANDLG.DFILE), 'JUN', '06'); \n   ELSIF l_mon = ('JUL') THEN\n       :BLK_HANDLG.DFILE:= replace( upper(:BLK_HANDLG.DFILE), 'JUL', '07'); \n   ELSIF l_mon = ('AUG') THEN\n       :BLK_HANDLG.DFILE:= replace( upper(:BLK_HANDLG.DFILE), 'AUG', '08'); \n   ELSIF l_mon = ('SEP') THEN\n       :BLK_HANDLG.DFILE:= replace( upper(:BLK_HANDLG.DFILE), 'SEP', '09'); \n   ELSIF l_mon = ('OCT') THEN\n       :BLK_HANDLG.DFILE:= replace( upper(:BLK_HANDLG.DFILE), 'OCT', '10'); \n   ELSIF l_mon = ('OKT') THEN\n       :BLK_HANDLG.DFILE:= replace( upper(:BLK_HANDLG.DFILE), 'OKT', '10'); \n   ELSIF l_mon = ('NOV') THEN\n       :BLK_HANDLG.DFILE:= replace( upper(:BLK_HANDLG.DFILE), 'NOV', '11'); \n   ELSIF l_mon = ('DEC') THEN\n       :BLK_HANDLG.DFILE:= replace( upper(:BLK_HANDLG.DFILE), 'DEC', '12');\n   ELSIF l_mon = ('DEZ') THEN\n       :BLK_HANDLG.DFILE:= replace( upper(:BLK_HANDLG.DFILE), 'DEZ', '12');\n   END IF;\n   \n   l_time:= substr(  :BLK_HANDLG.DFILE, \n                     instr(:BLK_HANDLG.DFILE,' ')+1, \n                     length(:BLK_HANDLG.DFILE)-instr(:BLK_HANDLG.DFILE,' '));\n   \n   l_h:= substr (:BLK_HANDLG.DFILE, instr(:BLK_HANDLG.DFILE,' ')+1, instr(:BLK_HANDLG.DFILE,':')-instr(:BLK_HANDLG.DFILE,' ')-1);\n   IF length(l_h)<2 THEN\n       l_h:= '0'||l_h;\n   END IF;\n   l_m:= substr (:BLK_HANDLG.DFILE, instr(:BLK_HANDLG.DFILE,':')+1, length(:BLK_HANDLG.DFILE)-instr(:BLK_HANDLG.DFILE,':') );\n   IF length(l_m)<2 THEN\n       l_m:= '0'||l_m;\n   END IF;\n   l_time:= l_h||':'||l_m;   \n   :BLK_HANDLG.DFILE:= replace(substr(:BLK_HANDLG.DFILE, 1, instr(:BLK_HANDLG.DFILE,' ')-1)||' '||l_time, '-', '.');\n          \nEND prc_cng_month_time;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/PRC_COMPILATION.pcd",
    "content": "PROCEDURE prc_COMPILATION IS\n   l_fname_blank VARCHAR2(128); \nPROCEDURE prc_clear_results IS\nBEGIN\n   IF webutil_file.file_exists(:PARAMETER.P_COMP_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.fmx') THEN\n      IF webutil_file.delete_file(:PARAMETER.P_COMP_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.fmx') THEN\n          NULL;\n      END IF;\n   END IF;              \n   IF webutil_file.file_exists(:PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.fmb-compile.txt')   THEN\n      IF webutil_file.delete_file(:PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.fmb-compile.txt') THEN\n         NULL;\n      END IF;\n   END IF;        \n   IF webutil_file.file_exists(:PARAMETER.P_COMP_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.plx') THEN\n      IF webutil_file.delete_file(:PARAMETER.P_COMP_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.plx') THEN\n         NULL;\n      END IF;\n   END IF;              \n   IF webutil_file.file_exists(:PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.plx-compile.txt')   THEN\n      IF webutil_file.delete_file(:PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.plx-compile.txt') THEN\n         NULL;\n      END IF;\n   END IF;        \n    IF webutil_file.file_exists(:PARAMETER.P_COMP_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.mmx') THEN\n      IF webutil_file.delete_file(:PARAMETER.P_COMP_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.mmx') THEN\n         NULL;\n      END IF;\n   END IF;              \n   IF webutil_file.file_exists(:PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.mmx-compile.txt')   THEN\n      IF webutil_file.delete_file(:PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.mmx-compile.txt') THEN\n         NULL;\n      END IF;\n   END IF;              \n   IF webutil_file.file_exists(:PARAMETER.P_COMP_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.err')   THEN\n      IF webutil_file.delete_file(:PARAMETER.P_COMP_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.err') THEN\n         NULL;\n      END IF;\n   END IF;              \nEND prc_clear_results;\n\nPROCEDURE prc_clear_results_HOST IS\n   l_cmd VARCHAR2(2048);   \nBEGIN\n   -- HOST( 'IF EXIST '||:PARAMETER.P_COMP_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.plx'||' DEL '||:PARAMETER.P_COMP_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.plx',  NO_SCREEN);\n   \n   HOST( 'IF EXIST '||:PARAMETER.P_COMP_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.fmx'||              ' DEL '||:PARAMETER.P_COMP_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.fmx',  NO_SCREEN);\n\n   HOST( 'IF EXIST '||:PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.fmb-compile.txt'||  ' DEL '||:PARAMETER.P_LOG_DIR ||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.fmb-compile.txt',  NO_SCREEN);\n    \n   HOST( 'IF EXIST '||:PARAMETER.P_COMP_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.plx'||              ' DEL '||:PARAMETER.P_COMP_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.plx',  NO_SCREEN);\n            \n   HOST( 'IF EXIST '||:PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.plx-compile.txt'||  ' DEL '||:PARAMETER.P_LOG_DIR ||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.plx-compile.txt',  NO_SCREEN);\n    \n   HOST( 'IF EXIST '||:PARAMETER.P_COMP_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.mmx'||              ' DEL '||:PARAMETER.P_COMP_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.mmx',  NO_SCREEN);\n      \n   HOST( 'IF EXIST '||:PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.mmx-compile.txt'||  ' DEL '||:PARAMETER.P_LOG_DIR ||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.mmx-compile.txt',  NO_SCREEN);\n        \n   HOST( 'IF EXIST '||:PARAMETER.P_COMP_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.err'||              ' DEL '||:PARAMETER.P_COMP_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.err',  NO_SCREEN);\n   \nEND prc_clear_results_HOST;\n\nBEGIN\n  \n   l_fname_blank:= substr(:BLK_HANDLG.FNAME, 1, length(:BLK_HANDLG.FNAME)-4);\n   \n   IF :BLK_HANDLG.FNAME IS NOT NULL AND :BLK_HANDLG.CB='Y' AND \n      :BLK_HANDLG.FEXTENT IN ('FMB', 'PLL', 'MMB') AND\n      :BLK_HANDLG.STATUS_CHECK   <> 'ERROR' AND\n      :BLK_HANDLG.STATUS_MIGRATE <> 'ERROR' THEN        \n          \n      IF :PARAMETER.P_HOST_CLIENT='HOST' THEN  \n          prc_clear_results_HOST;    \n          \n          pkg_FAM_RUN_Script.prc_run_batch_compile_cmd(:BLK_HANDLG.FNAME); \n          prc_Set_Compile_result(:BLK_HANDLG.FNAME);\n          SYNCHRONIZE;\n        \n      ELSIF :PARAMETER.P_HOST_CLIENT='CLIENT' THEN  \n          prc_clear_results;   \n                    \n           pkg_FAM_RUN_Script.prc_run_batch_compile_cmd(:BLK_HANDLG.FNAME); \n          prc_Set_Compile_result(:BLK_HANDLG.FNAME);\n          SYNCHRONIZE;\n                                                                                                             \n       END IF;\n      \n   ELSIF  :BLK_HANDLG.FNAME IS NOT NULL AND :BLK_HANDLG.CB='Y' AND \n           :BLK_HANDLG.FEXTENT IN ('RDF') AND\n           :BLK_HANDLG.STATUS_CHECK   <> 'ERROR' AND\n            :BLK_HANDLG.STATUS_MIGRATE <> 'ERROR' THEN\n        \n        IF :PARAMETER.P_REPORTS_RUN='YES' THEN     \n           pkg_FAM_RUN_Script.prc_run_batch_comp_reports_cmd(:BLK_HANDLG.FNAME,replace(lower(:BLK_HANDLG.FNAME),'.rdf','.rep'));\n           prc_Set_Compile_result(:BLK_HANDLG.FNAME);\n        END IF;\n        \n   END IF;\n            \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/PRC_CONFIGURATION.pcd",
    "content": "PROCEDURE prc_CONFIGURATION IS\nBEGIN\n   \n   prc_show_init;   \n   \n   prc_set_UserHome;\n       \n   SYNCHRONIZE;\n\n   -- 20.02.2017 / 26.04.2017 - FM - BO UNIX\n   :PARAMETER.P_FILE_SEPARATOR:= fnc_get_file_separator;  --- webutil_file.GET_FILE_SEPARATOR;\n    \n   -- 20.02.2017 - F.Matz --\n   IF :PARAMETER.P_CONFIG_INI IS NOT NULL THEN \n      pkg_Config.prc_get_config(:PARAMETER.P_CONFIG_INI);\n   ELSIF :PARAMETER.P_CONFIG_INI_BLANK IS NOT NULL THEN\n       pkg_Config.prc_get_config(:PARAMETER.P_CONFIG_INI_BLANK);\n   ELSE\n       prc_ERROR('$$$ ERROR: Config.INI not used ! $$$'||chr(10)||\n                 ' - Modul Abort ! - ');\n       EXIT_FORM; --- <<< SENSE <<<\n   END IF;\n   \n   -- 19.05.2017 --\n   prc_show_init('STEP1', 'Read configuration from config.ini', 'SUCCESS');\n   \n   IF :PARAMETER.P_HOST_CLIENT='CLIENT' THEN \n        \n      pkg_Config.prc_Create_DIRS;\n    \n      -- copy from user.space & fam.scripts to workspace . --\n      pkg_Config.prc_Copy_Dir( :PARAMETER.P_CONFIG_USER_SOURCES,      :PARAMETER.P_SOURCE_DIR );\n      pkg_Config.prc_Copy_Dir( :PARAMETER.P_CONFIG_USER_ADDONS,       :PARAMETER.P_ADDON_DIR  );\n      pkg_Config.prc_Copy_Dir( :PARAMETER.P_CONFIG_FORMSAPI_SCRIPTS, :PARAMETER.P_SCRIPT_DIR );\n      \n      -- 19.05.2017 --\n      prc_show_init('STEP2', 'Create directories and copy files', 'SUCCESS');\n            \n      pkg_BLK_DATA.prc_exec_from_directory('HANDLG', :PARAMETER.P_SOURCE_DIR, '*.*');\n      \n      -- 19.05.2017 --\n      prc_show_init('STEP3', 'Read from source directory into block', 'SUCCESS');\n      \n   ELSIF :PARAMETER.P_HOST_CLIENT='HOST' THEN\n        \n      pkg_Config.prc_Create_DIRS_HOST;\n          \n      pkg_Config.prc_Copy_Dir_HOST( :PARAMETER.P_CONFIG_USER_SOURCES,     :PARAMETER.P_SOURCE_DIR );\n      pkg_Config.prc_Copy_Dir_HOST( :PARAMETER.P_CONFIG_USER_ADDONS,      :PARAMETER.P_ADDON_DIR  );\n      pkg_Config.prc_Copy_Dir_HOST( :PARAMETER.P_CONFIG_FORMSAPI_SCRIPTS, :PARAMETER.P_SCRIPT_DIR );       \n\n      -- 19.05.2017 --\n      prc_show_init('STEP2', 'Create directories and copy files', 'SUCCESS');\n               \n      pkg_BLK_DATA.prc_exec_from_directory_HOST(:PARAMETER.P_SOURCE_DIR);\n\n      -- 19.05.2017 --\n      prc_show_init('STEP3', 'Read from source directory into block', 'SUCCESS');\n\n   ELSE\n         \n      prc_ERROR('$$$ Parameter HOST / CLIENT NOT defined >>> ABORT ! $$$');\n         \n      EXIT_FORM; -- <<< SENSE !\n         \n   END IF;\n      \n   prc_Check_FAM;\n\n   -- 19.05.2017 --\n   prc_show_init('STEP4', 'Check script processing of FormsAPI', 'SUCCESS');\n   \nEXCEPTION WHEN OTHERS THEN\n   g.result:= '$$$ ERROR in Configuration. $$$';\n   prc_EXCEPTION;  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/PRC_COPY_FILE.pcd",
    "content": "PROCEDURE prc_copy_file(p_srcfile VARCHAR2, p_destfile VARCHAR2) IS\n    l_success BOOLEAN;\n    \nBEGIN\n    g.msg_push('pkg_Script.prc_DOS_file_copy');\n      \n    l_success := webutil_file.copy_file(p_srcfile, p_destfile);\n    \n    if l_success \n    then\n       NULL;\n       -- prc_info('Copy of file successfull');\n    else\n       prc_error('$$$ Copy failed. Source: \"' || p_srcfile|| '\" nach \"' || p_destfile || '\" $$$');\n    end if;\n    \n    g.msg_free;\n    \nEXCEPTION WHEN OTHERS THEN\n    prc_EXCEPTION;    \nEND prc_copy_file;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/PRC_COPY_FILE_HOST.pcd",
    "content": "PROCEDURE PRC_COPY_FILE_HOST(p_srcfile VARCHAR2, p_destfile VARCHAR2) IS\n    l_success BOOLEAN;\n    \nBEGIN\n    g.msg_push('pkg_Script.prc_DOS_file_copy_HOST');\n      \n    HOST(' COPY '||p_srcfile||' '||p_destfile, NO_SCREEN );\n    \n    g.msg_free;\n    \nEXCEPTION WHEN OTHERS THEN\n    prc_EXCEPTION;    \nEND prc_copy_file_HOST;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/PRC_ERROR.pcd",
    "content": "PROCEDURE prc_error(s VARCHAR2) IS\n  al_button PLS_INTEGER;\n  al_id     Alert;\nBEGIN\n  al_id:= FIND_ALERT('ERROR'); \n  SET_ALERT_PROPERTY(al_id, ALERT_MESSAGE_TEXT, s ); \n  al_button := SHOW_ALERT( al_id );     \nEND prc_error;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/PRC_EXCEPTION.pcd",
    "content": "PROCEDURE prc_EXCEPTION (p_code NUMBER DEFAULT NULL, p_place VARCHAR2 DEFAULT NULL) IS\n  \n  -- F.Matz: 15.01.107 \n  \n  l_place VARCHAR2(256);\n  \nBEGIN\n  \n  IF p_code IS NOT NULL THEN\n     \n     IF p_place IS NOT NULL THEN\n         -- actual g.p --\n        g.p := p_place;\n        -- msg stack free ! --\n        IF g.msg_pop_chk THEN\n           g.msg_free;\n        END IF;\n     END IF;\n     \n     prc_msg(p_code, p_type=>'EXCEPTION');\n     \n  ELSE   \n    -- IF place<> 'none' THEN ..\n    IF g.msg_pop_chk THEN\n       l_place:= g.msg_pop;\n    ELSE\n       l_place:= g.p;\n    END IF;\n    \n    IF ERROR_CODE <> 0 THEN\n       -- prc_info(ERROR_TYPE || '-' || to_char(ERROR_CODE )|| ': ' || ERROR_TEXT);       \n       prc_msg( '$$$ {1} in: {2}'||chr(10)||':: {3} - {4}', \n                'EXCEPTION', \n                 l_place , \n                 (ERROR_TYPE || '-' || to_char(ERROR_CODE )|| ': ' || ERROR_TEXT), \n                 sqlerrm,\n                 p_type=>'EXCEPTION'\n               );    \n    ELSE\n        -- prc_alert_exception('$$$ EXCEPTION: Code=0 in '||g.p);\n        prc_msg( '$$$ {1} in: {2}'||chr(10)||':: - {3}', \n                 'EXCEPTION', \n                  l_place, \n                  -- (ERROR_TYPE || '-' || to_char(ERROR_CODE )|| ': ' || ERROR_TEXT), \n                  sqlerrm,\n                  p_type=>'EXCEPTION'\n                );\n    END IF;  \n  END IF;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/PRC_FILE_MERGE.pcd",
    "content": "PROCEDURE prc_file_merge(p_first_file VARCHAR2, p_second_file VARCHAR2, p_result_file VARCHAR2, p_title2 VARCHAR2) IS\n\n   -- F.Matz: 11.02.2017\n   \n   l_in_file   client_Text_IO.File_Type;\n   l_out_file  client_Text_IO.File_Type;\n   l_buff      VARCHAR2(1024);\n   \nBEGIN\n   g.msg_push('prc_file_merge');\n   \n    prc_copy_file(p_first_file, p_result_file);\n   \n    l_in_file  := client_Text_IO.Fopen(p_second_file, 'r');\n    l_out_file := client_Text_IO.Fopen(p_result_file, 'a');\n    \n    client_Text_IO.put_line(l_out_file,'');  \n    client_Text_IO.put_line(l_out_file, p_title2);\n    client_Text_IO.put_line(l_out_file,'');     \n    \n    LOOP\n       BEGIN\n          client_Text_IO.get_line(l_in_File,  l_buff);                                    \n       EXCEPTION \n           WHEN NO_DATA_FOUND THEN\n              client_Text_IO.Fclose(l_in_File);\n              EXIT;\n           WHEN OTHERS THEN\n              client_Text_IO.Fclose(l_in_File);\n              prc_msg('$$$ Fehler in prc_file_merge: '||sqlerrm);\n              EXIT;\n       END ;\n        client_Text_IO.put_line(l_out_file, l_buff);     \n    END LOOP;\n    \n    client_Text_IO.Fclose(l_out_file);\n    \n    g.msg_free;\n   \nEXCEPTION WHEN OTHERS THEN\n    prc_EXCEPTION;\nEND prc_file_merge;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/PRC_FILE_MERGE_HOST.pcd",
    "content": "PROCEDURE prc_file_merge_HOST(p_first_file VARCHAR2, p_second_file VARCHAR2, p_result_file VARCHAR2, p_title2 VARCHAR2) IS\n\n   -- F.Matz: 11.02.2017\n   \n   l_in_file   Text_IO.File_Type;\n   l_out_file  Text_IO.File_Type;\n   l_buff      VARCHAR2(1024);\n   \nBEGIN\n   g.msg_push('prc_file_merge_HOST');\n   \n   prc_copy_file_HOST(p_first_file, p_result_file);\n   \n   l_in_file  := Text_IO.Fopen(p_second_file, 'r');\n   l_out_file := Text_IO.Fopen(p_result_file, 'a');\n    \n   Text_IO.put_line(l_out_file,'');  \n   Text_IO.put_line(l_out_file, p_title2);\n   Text_IO.put_line(l_out_file,'');     \n    \n   LOOP\n       BEGIN\n          Text_IO.get_line(l_in_File,  l_buff);                                    \n       EXCEPTION \n           WHEN NO_DATA_FOUND THEN\n              Text_IO.Fclose(l_in_File);\n              EXIT;\n           WHEN OTHERS THEN\n              Text_IO.Fclose(l_in_File);\n              prc_msg('$$$ Fehler in prc_file_merge_HOST: '||sqlerrm);\n              EXIT;\n       END ;\n        Text_IO.put_line(l_out_file, l_buff);     \n   END LOOP;\n    \n   Text_IO.Fclose(l_out_file);\n    \n   g.msg_free;\n   \nEXCEPTION WHEN OTHERS THEN\n    prc_EXCEPTION;\nEND prc_file_merge_HOST;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/PRC_FLOG.pcd",
    "content": "PROCEDURE prc_flog (p_log   VARCHAR2,    \n                    p_1      VARCHAR2 DEFAULT NULL, \n                    p_2      VARCHAR2 DEFAULT NULL, \n                    p_3      VARCHAR2 DEFAULT NULL, \n                    p_4      VARCHAR2 DEFAULT NULL, \n                    p_5      VARCHAR2 DEFAULT NULL, \n                    p_msg2  VARCHAR2 DEFAULT '.',\n                    p_TYPE   VARCHAR2 DEFAULT 'INFO') IS\n \n  l_out_file    Text_IO.File_Type;\n  l_out_file_C  client_Text_IO.File_Type;\n  l_msg         VARCHAR2(8000);\n  c_l_type      CONSTANT VARCHAR2(9):= 'EXCEPTION';\n  l_type        VARCHAR2(9);\n  \n  -- F.Matz: 15.01.2017 / 02.05.2017\n                \nBEGIN\n  \n   l_msg:= p_log;\n  \n   l_msg:= replace(l_msg, '{1}', p_1);\n   l_msg:= replace(l_msg, '{2}', p_2);\n   l_msg:= replace(l_msg, '{3}', p_3);\n   l_msg:= replace(l_msg, '{4}', p_4);\n   l_msg:= replace(l_msg, '{5}', p_5);\n   l_msg:= l_msg||' '||p_msg2;\n   \n   l_type:= p_TYPE;\n   l_type:= rpad(l_type, length(c_l_type));\n      \n   IF :PARAMETER.P_HOST_CLIENT='HOST' THEN\n      l_out_file := Text_IO.Fopen( :PARAMETER.P_USER_HOME ||:PARAMETER.P_FILE_SEPARATOR||\n                                            'Migration-'||replace(substr(webutil_clientinfo.get_date_time,1,8),'.','-')||\n                                            --:PARAMETER.P_PNO||\n                                             '.log', 'a');\n                                               \n      Text_IO.put_line(l_out_file, \n                                             replace(replace(webutil_clientinfo.get_date_time,' ','-'),':','-')||'['||\n                                              -- TO_CHAR(SYSDATE,'DD.MM.YYYY-HH24:MI:SS')||'-'||\n                                            webutil_clientinfo.get_user_name||']'||\n                                            --:PARAMETER.P_MODULE_SHORT||\n                                            '['||substr(l_type,1,5)||']'||\n                                            '['||g.p||']::'||                              \n                                            l_msg);     \n       \n      Text_IO.Fclose  (l_out_file);\n\n   ELSIF :PARAMETER.P_HOST_CLIENT='CLIENT' THEN\n       l_out_file_C := client_Text_IO.Fopen( :PARAMETER.P_USER_HOME ||:PARAMETER.P_FILE_SEPARATOR||\n                                            'Migration-'||replace(substr(webutil_clientinfo.get_date_time,1,8),'.','-')||\n                                            --:PARAMETER.P_PNO||\n                                             '.log', 'a');\n                                           \n      client_Text_IO.put_line(l_out_file_C, \n                                             replace(replace(webutil_clientinfo.get_date_time,' ','-'),':','-')||'['||\n                                              -- TO_CHAR(SYSDATE,'DD.MM.YYYY-HH24:MI:SS')||'-'||\n                                            webutil_clientinfo.get_user_name||']'||\n                                            --:PARAMETER.P_MODULE_SHORT||\n                                            '['||substr(l_type,1,5)||']'||\n                                            '['||g.p||']::'||                              \n                                            l_msg);     \n       \n      client_Text_IO.Fclose  (l_out_file_C);\n       \n   END IF;\n   \nEXCEPTION WHEN OTHERS THEN\n  prc_error('$$$ EXCEPTION in: prc_flog'||chr(10)||':: '||sqlerrm);  \nEND prc_flog;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/PRC_GET_CHK_REF_INFO.pcd",
    "content": "PROCEDURE prc_get_chk_ref_info(p_fn VARCHAR2) IS\n   l_buff       VARCHAR2(4096);\n   l_in_file     Text_IO.File_Type;\n   l_in_file_C   client_Text_IO.File_Type;\n   l_cnt        NUMBER(3);\nBEGIN\n     l_buff:='';\n     \n     IF :PARAMETER.P_HOST_CLIENT='HOST' THEN\n       l_in_file := Text_IO.Fopen(p_fn, 'r');\n       l_cnt:=1;\n       LOOP\n         BEGIN\n             Text_IO.get_line(l_in_File, l_buff);\n             --l_buff_all:= l_buff_all||replace(l_in_buff,'          ',' ')||'/';   \n             IF INSTR(l_buff, '$$$ EXCEPTION')>0 THEN\n                :BLK_HANDLG.STATUS_CHECK   := 'ERROR';         \n                Text_IO.Fclose(l_in_File);\n                EXIT;\n               Else\n                :BLK_HANDLG.STATUS_CHECK   := 'SUCCESS';\n             END IF;\n             l_cnt:= l_cnt+1;           \n         EXCEPTION \n             WHEN NO_DATA_FOUND THEN\n               Text_IO.Fclose(l_in_File);\n               EXIT;\n             WHEN OTHERS THEN\n               Text_IO.Fclose(l_in_File);\n               prc_msg('$$$ Fehler in get_src_info: '||sqlerrm);\n               EXIT;\n             EXIT;\n         END ;\n     END LOOP;\n    \n     ELSIF :PARAMETER.P_HOST_CLIENT='CLIENT' THEN\n       l_in_file_C := client_Text_IO.Fopen(p_fn, 'r');\n       l_cnt:=1;\n       LOOP\n         BEGIN\n             client_Text_IO.get_line(l_in_File_C, l_buff);\n             --l_buff_all:= l_buff_all||replace(l_in_buff,'          ',' ')||'/';   \n             IF INSTR(l_buff, '$$$ EXCEPTION')>0 THEN\n                :BLK_HANDLG.STATUS_CHECK   := 'ERROR';         \n                client_Text_IO.Fclose(l_in_File_C);\n                EXIT;\n             Else\n                :BLK_HANDLG.STATUS_CHECK   := 'SUCCESS';\n             END IF;\n             l_cnt:= l_cnt+1;           \n         EXCEPTION \n             WHEN NO_DATA_FOUND THEN\n               client_Text_IO.Fclose(l_in_File_C);\n               EXIT;\n             WHEN OTHERS THEN\n               client_Text_IO.Fclose(l_in_File_C);\n               prc_msg('$$$ Fehler in get_src_info: '||sqlerrm);\n               EXIT;\n             EXIT;\n         END ;\n        END LOOP;\n    \n    END IF;\n    \nEND prc_get_chk_ref_info;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/PRC_GET_CONNECT_INFO.pcd",
    "content": "PROCEDURE prc_Get_Connect_Info( the_username IN OUT VARCHAR2, \n              the_password IN OUT VARCHAR2, \n              the_connect  IN OUT VARCHAR2) IS \nBEGIN \n  the_username := Get_Application_Property(lower(USERNAME)); \n  the_password := Get_Application_Property(PASSWORD); \n  the_connect  := Get_Application_Property(CONNECT_STRING); \nEND prc_Get_Connect_Info; \n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/PRC_INFO.pcd",
    "content": "PROCEDURE prc_info(s VARCHAR2) IS\n  al_button PLS_INTEGER;\n  al_id     Alert;\n  \n  -- F.Matz: 15.01.107 \nBEGIN\n  al_id:= FIND_ALERT('INFO'); \n  SET_ALERT_PROPERTY(al_id, ALERT_MESSAGE_TEXT, s ); \n  al_button := SHOW_ALERT( al_id ); \nEND prc_info;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/PRC_MIGRATION.pcd",
    "content": "PROCEDURE prc_MIGRATION IS\n   l_fname_blank VARCHAR2(128);\n   \nPROCEDURE prc_clear_results IS\nBEGIN\n   -- clear final results       --\n   IF webutil_file.file_exists(:PARAMETER.P_MIGR_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME) THEN\n      IF webutil_file.delete_file(:PARAMETER.P_MIGR_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME) THEN\n         NULL;\n      END IF;\n   END IF;\n   IF webutil_file.file_exists(:PARAMETER.P_UNIX_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME) THEN\n      IF webutil_file.delete_file(:PARAMETER.P_UNIX_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME) THEN\n         NULL;\n      END IF;\n   END IF;         \n   -- delete all logs --\n   IF webutil_file.file_exists(:PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-mig_main_one.log') THEN\n      IF webutil_file.delete_file(:PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-mig_main_one.log') THEN\n         NULL;\n      END IF;\n   END IF;\n   IF webutil_file.file_exists(:PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-mig_Win2Unix_one.log') THEN\n      IF webutil_file.delete_file(:PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-mig_Win2Unix_one.log') THEN\n         NULL;\n      END IF;\n   END IF;\n   IF webutil_file.file_exists(:PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-mig_main_one-all.log') THEN\n      IF webutil_file.delete_file(:PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-mig_main_one-all.log') THEN\n         NULL;\n      END IF;\n   END IF;  \nEND prc_clear_results;\n\nPROCEDURE prc_clear_results_HOST IS\n   l_cmd VARCHAR2(2048);   \nBEGIN\n   \n   HOST( 'IF EXIST '||:PARAMETER.P_MIGR_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||                          ' DEL '||:PARAMETER.P_MIGR_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME,  NO_SCREEN);\n\n   HOST( 'IF EXIST '||:PARAMETER.P_UNIX_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||                          ' DEL '||:PARAMETER.P_UNIX_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME,  NO_SCREEN);\n\n   HOST( 'IF EXIST '||:PARAMETER.P_LOG_DIR ||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-mig_main_one.log'||    ' DEL '||:PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-mig_main_one.log',  NO_SCREEN);\n\n   HOST( 'IF EXIST '||:PARAMETER.P_LOG_DIR ||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-mig_Win2Unix_one.log'||' DEL '||:PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-mig_Win2Unix_one.log',  NO_SCREEN);\n\n   HOST( 'IF EXIST '||:PARAMETER.P_MIGR_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-mig_main_one-all.log'||' DEL '||:PARAMETER.P_MIGR_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-mig_main_one-all.log',  NO_SCREEN);\n\nEND prc_clear_results_HOST;\n\nBEGIN\n  \n   l_fname_blank:= substr(:BLK_HANDLG.FNAME, 1, length(:BLK_HANDLG.FNAME)-4);\n\n   IF :BLK_HANDLG.FNAME IS NOT NULL AND :BLK_HANDLG.CB='Y' AND \n      :BLK_HANDLG.FEXTENT IN ('FMB', 'PLL', 'MMB') AND\n      :BLK_HANDLG.STATUS_CHECK<>'ERROR' THEN\n      \n      -- for re-enter loop:: configure parameters for one fmb e.g. --\n       pkg_Config.prc_set_Config_INI_Source(:BLK_HANDLG.FNAME); \n             \n      IF :PARAMETER.P_HOST_CLIENT='CLIENT' THEN        \n         prc_clear_results;\n      ELSIF :PARAMETER.P_HOST_CLIENT='HOST' THEN       \n         prc_clear_results_HOST;\n      END IF;\n      \n       -- running 2 scripts for one --\n       pkg_FAM_RUN_Script.prc_run_FAM_script_mig('mig_main_one.p2s');\n       \n       IF :PARAMETER.P_HOST_CLIENT='CLIENT' THEN   \n         prc_copy_file( :PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'mig_main_one.log', :PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-mig_main_one.log'); \n       ELSIF :PARAMETER.P_HOST_CLIENT='HOST' THEN   \n         prc_copy_file_HOST( :PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'mig_main_one.log', :PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-mig_main_one.log'); \n       END IF;\n       \n      SYNCHRONIZE;  \n         \n      pkg_FAM_RUN_Script.prc_run_FAM_script_win2unix('mig_Win2Unix_one.p2s');\n      \n      IF :PARAMETER.P_HOST_CLIENT='CLIENT' THEN   \n         prc_copy_file( :PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'mig_Win2Unix_one.log', :PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-mig_Win2Unix_one.log');        \n         SYNCHRONIZE;  \n         \n         -- merge files --\n         prc_file_merge( :PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-mig_main_one.log', \n                           :PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-mig_Win2Unix_one.log',\n                           :PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-mig_main_one-all.log',\n                          '--- BEGINN - Windows => Unix Migration  --------------------------------' );\n                  \n         prc_Set_Migrate_Result(:PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-mig_main_one-all.log');\n        \n         SYNCHRONIZE;\n           \n          IF NOT webutil_file.file_exists(:PARAMETER.P_UNIX_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME)\n           --  OR\n          --  NOT webutil_file.file_exists(:PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-mig_main_one.log') OR\n          --  NOT webutil_file.file_exists(:PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-mig_Win2Unix_one.log')\n          THEN\n              :BLK_HANDLG.STATUS_MIGRATE  := 'ERROR';\n           ELSE\n              :BLK_HANDLG.STATUS_MIGRATE  := 'SUCCESS';\n          END IF;  \n       \n       ELSIF :PARAMETER.P_HOST_CLIENT='HOST' THEN \n          prc_copy_file_HOST( :PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'mig_Win2Unix_one.log', :PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-mig_Win2Unix_one.log');   \n          SYNCHRONIZE;  \n         \n          -- merge files --\n          prc_file_merge_HOST( :PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-mig_main_one.log', \n                                 :PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-mig_Win2Unix_one.log',\n                                 :PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-mig_main_one-all.log',\n                                '--- BEGINN - Windows => Unix Migration  --------------------------------' );\n                  \n          prc_Set_Migrate_Result(:PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-mig_main_one-all.log');\n        \n          SYNCHRONIZE;\n           \n           IF NOT fnc_File_Exists_HOST(:PARAMETER.P_UNIX_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME)\n           --  OR\n          --  NOT webutil_file.file_exists(:PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-mig_main_one.log') OR\n          --  NOT webutil_file.file_exists(:PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-mig_Win2Unix_one.log')\n          THEN\n              :BLK_HANDLG.STATUS_MIGRATE  := 'ERROR';\n           ELSE\n              :BLK_HANDLG.STATUS_MIGRATE  := 'SUCCESS';\n           END IF;  \n           \n       END IF;\n       \n    -- 28.02.2017 / 02.05.2017 --\n    ELSIF :BLK_HANDLG.FNAME IS NOT NULL AND :BLK_HANDLG.CB='Y' AND \n          :BLK_HANDLG.FEXTENT = 'RDF' AND \n          :BLK_HANDLG.STATUS_CHECK<>'ERROR' THEN\n          \n          IF :PARAMETER.P_REPORTS_RUN='YES' THEN \n              pkg_Config.prc_set_Config_INI_Source(:BLK_HANDLG.FNAME);\n             pkg_FAM_RUN_Script.prc_run_FAM_script_mig('mig_rdfconvert.p2s');\n             \n             IF :PARAMETER.P_HOST_CLIENT='CLIENT' THEN   \n                prc_copy_file( :PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'mig_rdfconvert.log', :PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-mig_main_one.log');  \n                SYNCHRONIZE;\n                             \n                IF NOT webutil_file.file_exists(:PARAMETER.P_UNIX_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME) THEN\n                    :BLK_HANDLG.STATUS_MIGRATE  := 'ERROR';\n                 ELSE\n                    :BLK_HANDLG.STATUS_MIGRATE  := 'SUCCESS';\n                 END IF; \n             \n             ELSIF :PARAMETER.P_HOST_CLIENT='HOST' THEN \n                prc_copy_file_HOST( :PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'mig_rdfconvert.log', :PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-mig_main_one.log');  \n                SYNCHRONIZE;\n                           \n                 IF NOT fnc_File_Exists_HOST(:PARAMETER.P_UNIX_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME) THEN\n                    :BLK_HANDLG.STATUS_MIGRATE  := 'ERROR';\n                 ELSE\n                    :BLK_HANDLG.STATUS_MIGRATE  := 'SUCCESS';\n                 END IF;   \n                 \n              END IF;\n          END IF;\n          \n    END IF;   \n    \nEND prc_MIGRATION;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/PRC_MSG.pcd",
    "content": "/** \n *  Erstellt: F.Matz - Okt.2016\n *  Geaendert: 26.10.2016 , 29.06.2017 - F.Matz \n *\n */\n \nPROCEDURE prc_msg (p_msg     VARCHAR2, \n                   p_1       VARCHAR2 DEFAULT NULL, \n                   p_2       VARCHAR2 DEFAULT NULL, \n                   p_3       VARCHAR2 DEFAULT NULL,\n                   p_4       VARCHAR2 DEFAULT NULL,\n                   p_5       VARCHAR2 DEFAULT NULL,\n                   p_msg2    VARCHAR2 DEFAULT NULL,\n                   p_title   VARCHAR2 DEFAULT NULL,      \n                   p_type    VARCHAR2 DEFAULT 'MESSG'\n                   ) IS\n \n    C_MAX_ALERT_LEN CONSTANT NUMBER(3):= 200;\n    \n    l_alert           Alert;\n    l_b               PLS_INTEGER;\n    l_msg             VARCHAR2(2048);\n    l_msg_t           VARCHAR2(2048);\n    l_msgtab          BOOLEAN;\n    l_type            VARCHAR2(10);\n    l_exception_alert EXCEPTION;\n    l_exception_msgno EXCEPTION;\n    l_errorno          VARCHAR2(5);\n    l_errorcode        VARCHAR2(10);\n    \n    ---------------------------------------------------------\n    PROCEDURE prc_lmsg (p_str VARCHAR2) IS\n      l_b PLS_INTEGER;\n    BEGIN\n      Set_Alert_property(l_alert, alert_message_text, p_str);\n      l_b := Show_Alert(l_alert);\n    END prc_lmsg;\n    ---------------------------------------------------------\n    \nBEGIN\n  \n    l_errorno   := NULL;\n    l_errorcode := NULL;\n    \n    l_alert:= Find_Alert(p_type);\n    IF Id_Null(l_alert) THEN \n       Message('$$$ Das Alert: '||p_type||' existiert nicht! $$$'); \n       RAISE l_exception_alert; \n    END IF;\n    \n    -- flying messages --\n    -- set --\n    l_msg     := p_msg;\n    l_type    := p_type;\n    l_msgtab  := FALSE;\n      \n    l_msg:= replace(l_msg, '{1}', p_1);\n    l_msg:= replace(l_msg, '{2}', p_2);\n    l_msg:= replace(l_msg, '{3}', p_3);\n    l_msg:= replace(l_msg, '{4}', p_4);\n    l_msg:= replace(l_msg, '{5}', p_5);\n            \n    IF p_title IS NOT NULL THEN\n      Set_Alert_property(l_alert, title, p_title);\n    END IF;\n    \n    -- Textlange behandeln --\n    l_msg_t:= l_msg;\n    \n    LOOP \n      IF length(l_msg)>C_MAX_ALERT_LEN THEN\n        l_msg_t:= substr(l_msg,1,C_MAX_ALERT_LEN);\n        l_msg:= substr(l_msg, C_MAX_ALERT_LEN+1,length(l_msg)-C_MAX_ALERT_LEN-1);\n      ELSE  \n        l_msg_t:= l_msg;\n        l_msg:=NULL;\n      END IF;\n      \n      Set_Alert_property(l_alert, alert_message_text, l_msg_t);\n      l_b := Show_Alert(l_alert);\n  \n      EXIT WHEN l_msg IS NULL;\n    END LOOP;\n    \n    IF p_TYPE IN ('ERROR', 'EXCEPTION') THEN\n       g.STATE:= l_TYPE;\n       IF l_errorno IS NOT NULL THEN\n           -- save Global ! --\n           g.ERROR_NO   := l_errorno;\n           g.ERROR_CODE := l_errorcode;\n       END IF;\n    END IF;\n    \n  EXCEPTION WHEN l_exception_alert THEN\n        message('$$$ EXCEPTION: prc_msg(l_exception_alert) - Alert nicht gefunden! $$$');\n      WHEN l_exception_msgno THEN\n        message('$$$ EXCEPTION: prc_msg(l_exception_msg) - Message Problem! $$$');\n      WHEN OTHERS THEN\n        prc_lmsg('$$$ EXCEPTION in prc_msg bei: '||l_msg||chr(10)||sqlerrm);      \n        \nEND prc_msg;\n  "
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/PRC_SET_COMPILE_RESULT.pcd",
    "content": "PROCEDURE prc_Set_Compile_result(p_fn VARCHAR2) IS\n   l_fname_blank   VARCHAR2(128);   \nBEGIN  \n     -- l_buff:='';\n     \n     l_fname_blank:= substr(p_fn, 1, length(p_fn)-4);\n\n     -- check if *.fmx / *.plx / *.mmx exists          --\n     \n     IF :PARAMETER.P_HOST_CLIENT='CLIENT' THEN\n        IF    :BLK_HANDLG.FEXTENT='FMB' AND NOT webutil_file.file_exists(:PARAMETER.P_COMP_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.fmx')    THEN\n               :BLK_HANDLG.STATUS_COMPILE  := 'ERROR';\n        ELSIF :BLK_HANDLG.FEXTENT='PLL' AND NOT webutil_file.file_exists(:PARAMETER.P_COMP_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.plx')    THEN\n               :BLK_HANDLG.STATUS_COMPILE  := 'ERROR';\n       ELSIF :BLK_HANDLG.FEXTENT='MMB' AND NOT webutil_file.file_exists(:PARAMETER.P_COMP_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.mmx')    THEN\n               :BLK_HANDLG.STATUS_COMPILE  := 'ERROR';\n        ELSIF :BLK_HANDLG.FEXTENT='RDF' AND NOT webutil_file.file_exists(:PARAMETER.P_COMP_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.rep')    THEN\n               :BLK_HANDLG.STATUS_COMPILE  := 'ERROR';\n        ELSE\n               :BLK_HANDLG.STATUS_COMPILE  := 'SUCCESS';\n                -- RETURN;  -- <<< SENSE <<<\n        END IF;  \n     \n        ELSIF :PARAMETER.P_HOST_CLIENT='HOST' THEN  \n          \n        IF    :BLK_HANDLG.FEXTENT='FMB' AND NOT fnc_File_Exists_HOST(:PARAMETER.P_COMP_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.fmx')    THEN\n               :BLK_HANDLG.STATUS_COMPILE  := 'ERROR';\n        ELSIF :BLK_HANDLG.FEXTENT='PLL' AND NOT fnc_File_Exists_HOST(:PARAMETER.P_COMP_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.plx')    THEN\n               :BLK_HANDLG.STATUS_COMPILE  := 'ERROR';\n       ELSIF :BLK_HANDLG.FEXTENT='MMB' AND NOT fnc_File_Exists_HOST(:PARAMETER.P_COMP_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.mmx')    THEN\n               :BLK_HANDLG.STATUS_COMPILE  := 'ERROR';\n       ELSIF :BLK_HANDLG.FEXTENT='RDF' AND NOT fnc_File_Exists_HOST(:PARAMETER.P_COMP_DIR||:PARAMETER.P_FILE_SEPARATOR||l_fname_blank||'.rep')    THEN\n               :BLK_HANDLG.STATUS_COMPILE  := 'ERROR';\n        ELSE\n            :BLK_HANDLG.STATUS_COMPILE  := 'SUCCESS';\n            -- RETURN;  -- <<< SENSE <<<\n        END IF;\n        \n    END IF;\n  \nEND prc_Set_Compile_result;\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/PRC_SET_INFOS.pcd",
    "content": "PROCEDURE prc_set_infos IS\nBEGIN\n\n  :CTL_INFO.FORMS_VERSION      := GET_APPLICATION_PROPERTY(VERSION);\n  -- IF SUBSTR(V_VERSION,1,10) ='12.2.1.0.0' THEN\n\n  :CTL_INFO.FORMSAPI_VERSION := substr(:PARAMETER.P_FORMSAPI_VERSION, 1,instr(:PARAMETER.P_FORMSAPI_VERSION,'(')-1)||' - '||\n                                substr(:PARAMETER.P_FORMSAPI_VERSION, instr(:PARAMETER.P_FORMSAPI_VERSION,'(')+1, 3);    \n                                \n  :CTL_INFO.FORMSAPI_LICENSE := :PARAMETER.P_FORMSAPI_LICENSE;\n  \n  :CTL_INFO.MODUL_VARIANTE   := :PARAMETER.P_MODULE_VARIANTE;      \n  :CTL_INFO.MODUL_VERSION    := :PARAMETER.P_MODULE_VERSION;  \n  :CTL_INFO.MODUL_HERSTELLER := 'Cologne Data GmbH';\n    \nEND prc_set_infos;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/PRC_SET_MIGRATE_RESULT.pcd",
    "content": "PROCEDURE prc_Set_Migrate_Result(p_fname VARCHAR2) IS\n   \n   l_buff VARCHAR2(4096);\n   l_cnt  NUMBER(3); \n    \nPROCEDURE get_result_HOST IS \n   l_in_file Text_IO.File_Type;\nBEGIN\n   l_buff:='';\n   l_in_file := Text_IO.Fopen(p_fname, 'r');\n   l_cnt:=1;\n   LOOP\n       BEGIN\n           Text_IO.get_line(l_in_File, l_buff);\n           IF substr(l_buff, 10, length('[Error]'))='[Error]' THEN \n              :BLK_HANDLG.STATUS_MIGRATE:= 'ERROR'; \n              Text_IO.Fclose(l_in_File);\n              EXIT;\n           END IF;\n           l_cnt:= l_cnt+1;           \n       EXCEPTION \n           WHEN NO_DATA_FOUND THEN\n             Text_IO.Fclose(l_in_File);\n             EXIT;\n           WHEN OTHERS THEN\n             Text_IO.Fclose(l_in_File);\n             prc_msg('$$$ Fehler in prc_Set_Migrate_Result: '||sqlerrm);\n             EXIT;\n           EXIT;\n    END ;\n    END LOOP;\nEND get_result_HOST;\n\nPROCEDURE get_result IS \n   l_in_file_C client_Text_IO.File_Type;\nBEGIN\n   l_buff:='';\n   l_in_file_C := client_Text_IO.Fopen(p_fname, 'r');\n   l_cnt:=1;\n   LOOP\n       BEGIN\n           client_Text_IO.get_line(l_in_File_C, l_buff);\n           IF substr(l_buff, 10, length('[Error]'))='[Error]' THEN \n              :BLK_HANDLG.STATUS_MIGRATE:= 'ERROR'; \n              client_Text_IO.Fclose(l_in_File_C);\n              EXIT;\n           END IF;\n           l_cnt:= l_cnt+1;           \n       EXCEPTION \n           WHEN NO_DATA_FOUND THEN\n             client_Text_IO.Fclose(l_in_File_C);\n             EXIT;\n           WHEN OTHERS THEN\n             client_Text_IO.Fclose(l_in_File_C);\n             prc_msg('$$$ Fehler in prc_Set_Migrate_Result: '||sqlerrm);\n             EXIT;\n           EXIT;\n    END ;\n    END LOOP;\nEND get_result;\n\nBEGIN\n   g.msg_push('prc_Set_Migrate_Result');\n   \n   IF :PARAMETER.P_HOST_CLIENT='HOST' THEN\n      get_result_HOST;\n      \n   ELSIF :PARAMETER.P_HOST_CLIENT='CLIENT' THEN\n      get_result;\n      \n   END IF;\n   \n   g.msg_free;\n   \nEXCEPTION WHEN OTHERS THEN\n   prc_EXCEPTION;\nEND prc_Set_Migrate_Result;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/PRC_SET_STATISTIK.pcd",
    "content": "PROCEDURE prc_set_statistik IS\n   \n   l_result VARCHAr2(32);\n   \nPROCEDURE get_src_info(p_fn VARCHAR2,p_type VARCHAR2) IS\n\n   l_buff VARCHAR2(4096);\n   l_in_file     Text_IO.File_Type;\n   l_in_file_C   client_Text_IO.File_Type;\n   l_cnt  NUMBER(3);\n\nBEGIN\n     l_buff:='';\n     \n     IF :PARAMETER.P_HOST_CLIENT='HOST' THEN        \n       l_in_file := Text_IO.Fopen(p_fn, 'r');\n       l_cnt:=1;\n       LOOP\n         BEGIN\n             Text_IO.get_line(l_in_File, l_buff);\n             --l_buff_all:= l_buff_all||replace(l_in_buff,'          ',' ')||'/';   \n             IF l_cnt=11 THEN \n                :BLK_HANDLG.DFILE  := replace(substr(l_buff, 52,16) , '-', '.');    \n                prc_cng_month_time;\n                \n                if p_type <> 'RDF'\n                then  \n                  :BLK_HANDLG.FORMS_OBJ_VNO := substr(l_buff, 96,10);\n                else\n                   :BLK_HANDLG.FORMS_OBJ_VNO := 'undefined';\n                end if;\n                \n                l_result:= substr(l_buff, 86,7);   \n                -- 20.02.2017 --   \n                IF instr(l_result,'WARNING',1,1) > 0 THEN\n                    l_result:='SUCCESS';\n                   -- :BLK_HANDLG.STATUS_CHECK:='SUCCESS';\n                   -- prc_info('Switched=>SUCCESS');\n                END IF;  \n                Text_IO.Fclose(l_in_File);\n                EXIT;\n             END IF;\n             l_cnt:= l_cnt+1;           \n         EXCEPTION \n             WHEN NO_DATA_FOUND THEN\n               Text_IO.Fclose(l_in_File);\n               EXIT;\n             WHEN OTHERS THEN\n               Text_IO.Fclose(l_in_File);\n               prc_msg('$$$ Fehler in get_src_info: '||sqlerrm);\n               EXIT;\n             EXIT;\n         END ;\n      END LOOP;\n   \n   ELSIF :PARAMETER.P_HOST_CLIENT='CLIENT' THEN        \n       l_in_file_C := client_Text_IO.Fopen(p_fn, 'r');\n       l_cnt:=1;\n       LOOP\n         BEGIN\n             client_Text_IO.get_line(l_in_File_C, l_buff);\n             --l_buff_all:= l_buff_all||replace(l_in_buff,'          ',' ')||'/';   \n             IF l_cnt=11 THEN \n                :BLK_HANDLG.DFILE  := replace(substr(l_buff, 52,16) , '-', '.');    \n                prc_cng_month_time;\n                \n                if p_type <> 'RDF'\n                then  \n                  :BLK_HANDLG.FORMS_OBJ_VNO := substr(l_buff, 96,10);\n                else\n                   :BLK_HANDLG.FORMS_OBJ_VNO := 'undefined';\n                end if;\n                \n                -- :BLK_HANDLG.STATUS_CHECK   := substr(l_buff, 86,7);  \n                l_result:= substr(l_buff, 86,7);     \n                -- 20.02.2017 --\n                -- IF instr(:BLK_HANDLG.STATUS_CHECK,'WARNING',1,1) > 0 THEN\n                  IF instr(l_result,'WARNING',1,1) > 0 THEN\n                    l_result:='SUCCESS';\n                   -- :BLK_HANDLG.STATUS_CHECK:='SUCCESS';\n                   -- prc_info('Switched=>SUCCESS');\n                END IF;  \n                client_Text_IO.Fclose(l_in_File_C);\n                EXIT;\n             END IF;\n             l_cnt:= l_cnt+1;           \n         EXCEPTION \n             WHEN NO_DATA_FOUND THEN\n               client_Text_IO.Fclose(l_in_File_C);\n               EXIT;\n             WHEN OTHERS THEN\n               client_Text_IO.Fclose(l_in_File_C);\n               prc_msg('$$$ Fehler in get_src_info: '||sqlerrm);\n               EXIT;\n             EXIT;\n         END ;\n       END LOOP;\n   \n   END IF;\n\nEND get_src_info;\n\nPROCEDURE get_chk_ref_info(p_fn VARCHAR2) IS\n   l_buff      VARCHAR2(4096);\n   l_in_file   Text_IO.File_Type;\n   l_in_file_C client_Text_IO.File_Type;\n   l_cnt       NUMBER(3);\nBEGIN\n     l_buff:='';\n     \n      IF :PARAMETER.P_HOST_CLIENT='HOST' THEN        \n       l_in_file := Text_IO.Fopen(p_fn, 'r');\n       l_cnt:=1;\n       LOOP\n         BEGIN\n             Text_IO.get_line(l_in_File, l_buff);\n             --l_buff_all:= l_buff_all||replace(l_in_buff,'          ',' ')||'/';   \n             IF INSTR(l_buff, '$$$ EXCEPTION')>0 THEN\n                :BLK_HANDLG.STATUS_CHECK   := 'ERROR';\n                Text_IO.Fclose(l_in_File);\n                EXIT;\n             END IF;\n             l_cnt:= l_cnt+1;           \n         EXCEPTION \n             WHEN NO_DATA_FOUND THEN\n               :BLK_HANDLG.STATUS_CHECK   := 'SUCCESS';\n               Text_IO.Fclose(l_in_File);\n               EXIT;\n             \n             WHEN OTHERS THEN\n               Text_IO.Fclose(l_in_File);\n               prc_msg('$$$ Fehler in get_src_info: '||sqlerrm);\n               EXIT;\n             EXIT;\n          END ;\n          END LOOP;\n      \n      ELSIF :PARAMETER.P_HOST_CLIENT='CLIENT' THEN        \n       l_in_file_C := client_Text_IO.Fopen(p_fn, 'r');\n       l_cnt:=1;\n       LOOP\n         BEGIN\n             client_Text_IO.get_line(l_in_File_C, l_buff);\n             --l_buff_all:= l_buff_all||replace(l_in_buff,'          ',' ')||'/';   \n             IF INSTR(l_buff, '$$$ EXCEPTION')>0 THEN\n                :BLK_HANDLG.STATUS_CHECK   := 'ERROR';\n                client_Text_IO.Fclose(l_in_File_C);\n                EXIT;\n             END IF;\n             l_cnt:= l_cnt+1;           \n         EXCEPTION \n             WHEN NO_DATA_FOUND THEN\n               :BLK_HANDLG.STATUS_CHECK   := 'SUCCESS';\n               client_Text_IO.Fclose(l_in_File_C);\n               EXIT;\n             \n             WHEN OTHERS THEN\n               client_Text_IO.Fclose(l_in_File_C);\n               prc_msg('$$$ Fehler in get_src_info: '||sqlerrm);\n               EXIT;\n             EXIT;\n          END ;\n          END LOOP;\n      END IF;\n      \nEND get_chk_ref_info;\n\nBEGIN\n  -- prc_info('START-Check');\n  \n  go_block('BLK_HANDLG');\n  first_record;\n  LOOP\n    -- extract data from file to BLK_HANDLG --\n    IF :BLK_HANDLG.FNAME IS NOT NULL AND :BLK_HANDLG.CB='Y' AND \n       :BLK_HANDLG.FEXTENT IN ( 'FMB', 'PLL', 'MMB')THEN\n      \n       pkg_FAM_run_Script.prc_run_batch_version_cmd (:BLK_HANDLG.FNAME);\n       \n       IF :PARAMETER.P_HOST_CLIENT='HOST' THEN\n         \n          get_src_info(  :PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'check.txt', :BLK_HANDLG.FEXTENT);\n          prc_copy_file_HOST( :PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'check.txt', :PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-check.log');\n  \n          pkg_FAM_run_Script.prc_run_FAM_check_script(:BLK_HANDLG.FNAME);\n          \n          get_chk_ref_info( :PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'check-ref.log' );\n          prc_copy_file_HOST( :PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'check-ref.log', :PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-check-ref.log');      \n         \n          -- merge files --\n          prc_file_merge_HOST( :PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-check.log', \n                                :PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-check-ref.log',\n                                :PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-check-all.log',\n                                '--- BEGINN - CHECK - REFERENCES --------------------------------' );\n        \n       ELSIF :PARAMETER.P_HOST_CLIENT='CLIENT' THEN\n         \n          get_src_info(  :PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'check.txt', :BLK_HANDLG.FEXTENT);\n          prc_copy_file( :PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'check.txt', :PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-check.log');\n  \n          pkg_FAM_run_Script.prc_run_FAM_check_script(:BLK_HANDLG.FNAME);\n          get_chk_ref_info( :PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'check-ref.log' );\n          prc_copy_file( :PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'check-ref.log', :PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-check-ref.log');      \n         \n          -- merge files --\n          prc_file_merge( :PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-check.log', \n                           :PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-check-ref.log',\n                           :PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-check-all.log',\n                           '--- BEGINN - CHECK - REFERENCES --------------------------------' );\n         \n       END IF;\n       \n     ELSIF :BLK_HANDLG.FNAME IS NOT NULL AND :BLK_HANDLG.CB='Y' AND :BLK_HANDLG.FEXTENT= 'RDF' THEN\n\n        pkg_FAM_run_Script.prc_run_batch_version_cmd (:BLK_HANDLG.FNAME);\n        \n        IF :PARAMETER.P_HOST_CLIENT='HOST' THEN\n          get_src_info(  :PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'check.txt',:BLK_HANDLG.FEXTENT);\n                \n          prc_copy_file_HOST( :PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'check.txt',     \n                              :PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-check.log');  \n       \n       ELSIF :PARAMETER.P_HOST_CLIENT='CLIENT' THEN\n          get_src_info(  :PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'check.txt',:BLK_HANDLG.FEXTENT);\n                \n          prc_copy_file( :PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'check.txt',     \n                         :PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-check.log');  \n\n       END IF;\n               \n       -- go over ! --\n       :BLK_HANDLG.STATUS_CHECK:= 'SUCCESS';  \n                             \n    END IF;\n    \n    IF :SYSTEM.LAST_RECORD='TRUE' THEN\n       EXIT;\n    END IF;\n    \n    SYNCHRONIZE;\n    \n    next_record;\n    \n  END LOOP;\n  \n  first_record;\n  -- re-query --\n   \nEND prc_set_statistik;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/PRC_SET_STATISTIK_SINGLE.pcd",
    "content": "PROCEDURE PRC_SET_STATISTIK_SINGLE IS\n\n   l_result VARCHAR2(32);\n   \nPROCEDURE get_src_info(p_fn VARCHAR2, p_type VARCHAR2) IS\n\n   l_buff      VARCHAR2(4096);\n   l_in_file   Text_IO.File_Type;\n   l_in_file_C client_Text_IO.File_Type;\n   l_cnt       NUMBER(3);\n\nBEGIN\n     l_buff:='';\n     \n     IF :PARAMETER.P_HOST_CLIENT='HOST' THEN\n       l_in_file := Text_IO.Fopen(p_fn, 'r');\n       l_cnt:=1;\n       LOOP\n         BEGIN\n             Text_IO.get_line(l_in_File, l_buff);\n             --l_buff_all:= l_buff_all||replace(l_in_buff,'          ',' ')||'/';   \n             IF l_cnt=11 THEN \n                :BLK_HANDLG.DFILE := replace(substr(l_buff, 52,16) , '-', '.');    \n                prc_cng_month_time;\n                \n                if p_type <> 'RDF'\n                then  \n                  :BLK_HANDLG.FORMS_OBJ_VNO := substr(l_buff, 96,10);\n                else\n                   :BLK_HANDLG.FORMS_OBJ_VNO := 'undefined';\n                end if;\n                \n                l_result:= substr(l_buff, 86,7); \n                -- 20.02.2017 --\n                -- IF instr(:BLK_HANDLG.STATUS_CHECK,'WARNING',1,1) > 0 THEN\n                IF instr(l_result, 'WARNING',1,1) > 0 THEN\n                    l_result:= 'SUCCESS';\n                END IF;  \n                Text_IO.Fclose(l_in_File);\n                EXIT;\n             END IF;\n             l_cnt:= l_cnt+1;           \n         EXCEPTION \n             WHEN NO_DATA_FOUND THEN\n               Text_IO.Fclose(l_in_File);\n               EXIT;\n             WHEN OTHERS THEN\n               Text_IO.Fclose(l_in_File);\n               prc_msg('$$$ Fehler in get_src_info: '||sqlerrm);\n               EXIT;\n             EXIT;\n         END ;\n       END LOOP;\n\n     ELSIF :PARAMETER.P_HOST_CLIENT='CLIENT' THEN\n       l_in_file_C := client_Text_IO.Fopen(p_fn, 'r');\n       l_cnt:=1;\n       LOOP\n         BEGIN\n             client_Text_IO.get_line(l_in_File_C, l_buff);\n             --l_buff_all:= l_buff_all||replace(l_in_buff,'          ',' ')||'/';   \n             IF l_cnt=11 THEN \n                :BLK_HANDLG.DFILE := replace(substr(l_buff, 52,16) , '-', '.');    \n                prc_cng_month_time;\n                \n                if p_type <> 'RDF'\n                then  \n                  :BLK_HANDLG.FORMS_OBJ_VNO := substr(l_buff, 96,10);\n                else\n                   :BLK_HANDLG.FORMS_OBJ_VNO := 'undefined';\n                end if;\n                \n                -- :BLK_HANDLG.STATUS_CHECK   := substr(l_buff, 86,7);       \n                l_result:= substr(l_buff, 86,7); \n                -- 20.02.2017 --\n                -- IF instr(:BLK_HANDLG.STATUS_CHECK,'WARNING',1,1) > 0 THEN\n                IF instr(l_result, 'WARNING',1,1) > 0 THEN\n                    l_result:= 'SUCCESS';\n                   -- :BLK_HANDLG.STATUS_CHECK:='SUCCESS';\n                   -- prc_info('Switched=>SUCCESS');\n                END IF;  \n                client_Text_IO.Fclose(l_in_File_C);\n                EXIT;\n             END IF;\n             l_cnt:= l_cnt+1;           \n         EXCEPTION \n             WHEN NO_DATA_FOUND THEN\n               client_Text_IO.Fclose(l_in_File_C);\n               EXIT;\n             WHEN OTHERS THEN\n               client_Text_IO.Fclose(l_in_File_C);\n               prc_msg('$$$ Fehler in get_src_info: '||sqlerrm);\n               EXIT;\n             EXIT;\n         END ;\n        END LOOP;  \n     \n    END IF;\n    \nEND get_src_info;\n\nPROCEDURE get_chk_ref_info(p_fn VARCHAR2) IS\n   l_buff      VARCHAR2(4096);\n   l_in_file   Text_IO.File_Type;\n   l_in_file_C client_Text_IO.File_Type;\n   l_cnt       NUMBER(3);\nBEGIN\n     l_buff:='';\n     \n     IF :PARAMETER.P_HOST_CLIENT='HOST' THEN\n       l_in_file := Text_IO.Fopen(p_fn, 'r');\n       l_cnt:=1;\n       LOOP\n         BEGIN\n             Text_IO.get_line(l_in_File, l_buff);\n             --l_buff_all:= l_buff_all||replace(l_in_buff,'          ',' ')||'/';   \n             IF INSTR(l_buff, '$$$ EXCEPTION')>0 THEN\n                :BLK_HANDLG.STATUS_CHECK   := 'ERROR';\n                Text_IO.Fclose(l_in_File);\n                EXIT;\n             END IF;\n             l_cnt:= l_cnt+1;                        \n         EXCEPTION \n             WHEN NO_DATA_FOUND THEN\n               :BLK_HANDLG.STATUS_CHECK   := 'SUCCESS';\n               Text_IO.Fclose(l_in_File);\n               EXIT;             \n             WHEN OTHERS THEN\n               Text_IO.Fclose(l_in_File);\n               prc_msg('$$$ Fehler in get_src_info: '||sqlerrm);\n               EXIT;\n             EXIT;\n         END ;\n     END LOOP;\n     \n     ELSIF :PARAMETER.P_HOST_CLIENT='CLIENT' THEN\n       l_in_file_C := client_Text_IO.Fopen(p_fn, 'r');\n       l_cnt:=1;\n       LOOP\n         BEGIN\n             client_Text_IO.get_line(l_in_File_C, l_buff);\n             --l_buff_all:= l_buff_all||replace(l_in_buff,'          ',' ')||'/';   \n             IF INSTR(l_buff, '$$$ EXCEPTION')>0 THEN\n                :BLK_HANDLG.STATUS_CHECK   := 'ERROR';\n                client_Text_IO.Fclose(l_in_File_C);\n                EXIT;\n             END IF;\n             l_cnt:= l_cnt+1;                        \n         EXCEPTION \n             WHEN NO_DATA_FOUND THEN\n               :BLK_HANDLG.STATUS_CHECK   := 'SUCCESS';\n               client_Text_IO.Fclose(l_in_File_C);\n               EXIT;             \n             WHEN OTHERS THEN\n               client_Text_IO.Fclose(l_in_File_C);\n               prc_msg('$$$ Fehler in get_src_info: '||sqlerrm);\n               EXIT;\n             EXIT;\n         END ;\n        END LOOP;\n     \n     END IF;\n          \nEND get_chk_ref_info;\n\nBEGIN\n\n    -- extract data from file to BLK_HANDLG --\n    IF :BLK_HANDLG.FNAME IS NOT NULL AND :BLK_HANDLG.CB='Y' AND \n       :BLK_HANDLG.FEXTENT IN ( 'FMB', 'PLL', 'MMB')THEN\n      \n       pkg_FAM_run_Script.prc_run_batch_version_cmd (:BLK_HANDLG.FNAME);\n       \n       IF :PARAMETER.P_HOST_CLIENT='HOST' THEN\n           get_src_info(  :PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'check.txt', :BLK_HANDLG.FEXTENT);\n           prc_copy_file_HOST( :PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'check.txt', :PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-check.log');\n  \n           pkg_FAM_run_Script.prc_run_FAM_check_script(:BLK_HANDLG.FNAME);\n           get_chk_ref_info( :PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'check-ref.log' );\n           prc_copy_file_HOST( :PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'check-ref.log', :PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-check-ref.log');      \n         \n           -- merge files --\n           prc_file_merge_HOST( :PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-check.log', \n                                :PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-check-ref.log',\n                                :PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-check-all.log',\n                                '--- BEGINN - CHECK - REFERENCES --------------------------------' );\n         \n       ELSIF :PARAMETER.P_HOST_CLIENT='CLIENT' THEN\n         \n           get_src_info(  :PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'check.txt', :BLK_HANDLG.FEXTENT);\n           prc_copy_file( :PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'check.txt', :PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-check.log');\n  \n           pkg_FAM_run_Script.prc_run_FAM_check_script(:BLK_HANDLG.FNAME);\n           get_chk_ref_info( :PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'check-ref.log' );\n           prc_copy_file( :PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'check-ref.log', :PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-check-ref.log');      \n         \n           -- merge files --\n           prc_file_merge( :PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-check.log', \n                           :PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-check-ref.log',\n                           :PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-check-all.log',\n                           '--- BEGINN - CHECK - REFERENCES --------------------------------' );\n                           \n       END IF;\n       \n     ELSIF :BLK_HANDLG.FNAME IS NOT NULL AND :BLK_HANDLG.CB='Y' AND :BLK_HANDLG.FEXTENT= 'RDF' THEN\n        \n        pkg_FAM_run_Script.prc_run_batch_version_cmd (:BLK_HANDLG.FNAME);\n       \n       IF :PARAMETER.P_HOST_CLIENT='HOST' THEN  \n            get_src_info(  :PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'check.txt',:BLK_HANDLG.FEXTENT); \n           prc_copy_file_HOST( :PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'check.txt',     \n                              :PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-check.log');  \n                              \n       ELSIF :PARAMETER.P_HOST_CLIENT='CLIENT' THEN  \n           get_src_info(  :PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'check.txt',:BLK_HANDLG.FEXTENT);\n           prc_copy_file( :PARAMETER.P_SCRIPT_DIR||:PARAMETER.P_FILE_SEPARATOR||'check.txt',     \n                         :PARAMETER.P_LOG_DIR||:PARAMETER.P_FILE_SEPARATOR||:BLK_HANDLG.FNAME||'-check.log');  \n       END IF;\n       \n       -- go over ! --\n       :BLK_HANDLG.STATUS_CHECK:= 'SUCCESS';  \n                             \n    END IF;\n        \n    SYNCHRONIZE;\n     \nEND prc_set_statistik_SINGLE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/PRC_SET_USERHOME.pcd",
    "content": "PROCEDURE prc_set_UserHome IS\n  -- F.Matz: 15.01.107  \n  BEGIN\n    g.p:= 'pkg_config.prc_set_UserHome';\n    \n    IF :PARAMETER.P_USER_HOME IS NULL THEN    \n       :PARAMETER.P_USER_HOME:= webutil_clientinfo.get_system_property('user.home');\n    END IF;\n    \n  EXCEPTION WHEN OTHERS THEN\n     prc_EXCEPTION;     \nEND prc_set_UserHome;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/PRC_SHOW_DURATION.pcd",
    "content": "PROCEDURE prc_show_duration IS\n   -- F.Matz --\n   FUNCTION secs (p_beg VARCHAR2, p_end VARCHAR2) RETURN INTERVAL DAY TO SECOND IS\n   BEGIN\n     RETURN ( to_timestamp(p_end, 'DD.MM.YYYY HH24:MI:SS') - \n              to_timestamp(p_beg, 'DD.MM.YYYY HH24:MI:SS')\n            );\n   END secs;\n\nBEGIN\n   :PARAMETER.P_END_TIME := fnc_get_timer_value;\n   clear_message; --to_char(:system.current_datetime,'DD.MM.YYYY HH24:MI:SS')\n   message( substr(secs(:PARAMETER.P_START_TIME, :PARAMETER.P_END_TIME), 5, 8) );\n   -- message('Runtime ' || to_char(round(((to_number(:parameter.p__end) - to_number(:parameter.p__start)) / 1000 / 60),2)) || ' min ');  \nEND prc_show_duration;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/PRC_SHOW_INIT.pcd",
    "content": "PROCEDURE prc_show_init(p_step VARCHAR2 DEFAULT 'INIT', p_txt VARCHAR2 DEFAULT NULL, p_result VARCHAR2 DEFAULT NULL) IS\n\n-- F.Matz : 18.05.2017\n\nPROCEDURE prc_init  IS BEGIN g.rstate:= 'OPENED';     g.rcnt:= 0; g.result:='OK'; show_view('CNV_INIT');  END prc_init;\n\nPROCEDURE prc_show1 IS BEGIN g.rstate:= 'STEP1';      g.rcnt:= 1; \n                             :CTL_INIT.STEP1:=p_txt;  :CTL_INIT.RES1:=p_result;                           END prc_show1;\n\nPROCEDURE prc_show2 IS BEGIN g.rstate:= 'STEP2';      g.rcnt:= 2; \n                              :CTL_INIT.STEP2:=p_txt;  :CTL_INIT.RES2:=p_result;                            END prc_show2;\n\nPROCEDURE prc_show3 IS BEGIN g.rstate:= 'STEP3';      g.rcnt:= 3;                            \n                             :CTL_INIT.STEP3:=p_txt;  :CTL_INIT.RES3:=p_result;                            END prc_show3;\n\nPROCEDURE prc_show4 IS BEGIN g.rstate:= 'STEP4';      g.rcnt:= 4;                            \n                             :CTL_INIT.STEP4:=p_txt;  :CTL_INIT.RES4:=p_result;                            END prc_show4;\n\nPROCEDURE prc_close IS BEGIN g.rstate:= 'CLOSED';     g.rcnt:= 5; \n                             hide_view('CNV_INIT');    go_item('CTL_BASIC.BT_CHECK');                      END prc_close;\n  \nBEGIN\n  \n   g.msg_push('prc_show_init');\n      \n   IF :PARAMETER.P_SHOW_INIT='YES' THEN\n     \n       CASE WHEN g.rstate='INIT'   AND p_step='INIT'                                       THEN prc_init;  \n             WHEN g.rstate='OPENED' AND p_step='STEP1'                                       THEN prc_show1;   \n             WHEN g.rstate='STEP1'  AND p_step='STEP2'                                        THEN prc_show2;  \n             WHEN g.rstate='STEP2'  AND p_step='STEP3'                                       THEN prc_show3;  \n             WHEN g.rstate='STEP3'  AND p_step='STEP4'                                        THEN prc_show4;            \n             WHEN g.rstate='STEP4'  AND p_step='CLOSE' AND g.result='OK' AND g.state='OK'  THEN prc_close;             \n            ELSE  prc_ABORT; -- <<< SENSE <<<\n       END CASE;\n            \n   END IF;\n   \n   g.msg_free;\n     \nEXCEPTION WHEN OTHERS THEN\n    prc_EXCEPTION;  \n    \nEND prc_show_init;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/PRC_VIEW_FILE.pcd",
    "content": "PROCEDURE prc_view_file (p_file VARCHAR2) IS\n\n  -- F.Matz: 11.02.2017, 09.05.2017, 18.06.2017 : IF HOST THEN transfer from AS => CLIENT; END IF;\n  \n  -- m_init_n      VARCHAR2(2048)  := 'CMD /C notepad.exe \"${p_file}\"  '; \n  m_init_n          VARCHAR2(2048)  := ' notepad.exe \"${p_file}\"  '; \n  m_run_notepad    VARCHAR2(4096);\n  m_bare_filename  VARCHAR2(64);\n  --------------------------------------------------------------------\n  PROCEDURE prc_run_view_notepad(p_file VARCHAR2) IS          \n  BEGIN\n  \n      m_run_notepad:= m_init_n;      \n     m_run_notepad:= replace( m_run_notepad, '${p_file}',  p_file );  \n     SYNCHRONIZE;\n    \n     -- -notabbar -nosession\n     --     client_host('CMD /C call ' || m_run_notepad);\n     IF :PARAMETER.P_HOST_CLIENT='HOST' THEN\n        -- HOST( 'CMD /C call ' || m_run_notepad );\n        client_host( 'CMD /C call ' || m_run_notepad );       \n     ELSIF :PARAMETER.P_HOST_CLIENT='CLIENT' THEN\n         WEBUTIL_HOST.BLOCKING( 'CMD /C call ' || m_run_notepad );\n     END IF;\n     \n  END prc_run_view_notepad;\n  --------------------------------------------------------------------  \n \n  PROCEDURE prc_run_view_notepad_HOST IS          \n  BEGIN  \n      m_run_notepad:= m_init_n;      \n     m_run_notepad:= replace( m_run_notepad, '${p_file}',  :PARAMETER.P_USER_HOME||'\\'||m_bare_filename );  \n     SYNCHRONIZE;\n    \n     -- -notabbar -nosession\n     -- client_host('CMD /C call ' || m_run_notepad);    \n     -- HOST( 'CMD /C call ' || m_run_notepad );\n     \n     WEBUTIL_HOST.BLOCKING( 'CMD /C call ' || m_run_notepad );\n       \n  END prc_run_view_notepad_HOST;\n  --------------------------------------------------------------------  \n\n  FUNCTION fnc_trans_AS2CLIENT RETURN BOOLEAN IS\n     l_success       BOOLEAN;\n      \n  BEGIN\n\n   -- THIS CODE ASSUMES THAT CLIENT IS WINDOWS BASED\n  -- CHANGE THE serverFile PATH FROM C:\\TEMP TO THE LOCATION SET IN WEBUTIL.CFG\n  --\n  -- 09.05.2017 : IF transfer.appsrv.accessControl=FALSE(webutil.cfg) THEN \n  --                 transfer.appsrv.read.(webutil.cfg NOT USED \n  --              END IF;\n  -- e.g in webutil.cfg ::\n  -- ....\n  --    transfer.appsrv.enabled=TRUE\n  --        transfer.appsrv.workAreaRoot=\n  --    transfer.appsrv.accessControl=FALSE\n  --        #List transfer.appsrv.read.<n> directories\n  --        transfer.appsrv.read.1=c:\\temp\n  --        #List transfer.appsrv.write.<n> directories\n  --        transfer.appsrv.write.1=c:\\temp\n\n  l_success := webutil_file_transfer.AS_to_Client_with_progress(\n                 clientFile       => :PARAMETER.P_USER_HOME||'\\'||m_bare_filename\n                ,serverFile       => p_file\n                ,progressTitle    => 'Download from Application Server in progress.'\n                ,progressSubTitle => 'Please wait..'\n               );\n  IF l_success THEN\n     -- prc_info('File downloaded successfully from the Application Server');\n     RETURN(TRUE);\n  ELSE\n     prc_ERROR('$$$ File download from Application Server failed. $$$');\n     RETURN(FALSE);\n  END IF;\n  \n  EXCEPTION  WHEN others  THEN\n      prc_ERROR('File download failed: '||sqlerrm);\n      RETURN(FALSE);\n  END fnc_trans_AS2CLIENT;\n  \nBEGIN\n   \n   IF  :PARAMETER.P_HOST_CLIENT='HOST' THEN\n     \n       IF fnc_File_Exists_HOST(p_file) THEN\n           -- 09.05.2017 - transfer HOST => CLIENT --\n           -- set for transfer & view              --\n           m_bare_filename := substr(p_file, instr(p_file,'\\',-1)+1);          \n          IF fnc_trans_AS2CLIENT THEN \n             prc_run_view_notepad_HOST();\n          END IF;        \n       ELSE\n           prc_info('Ausgabe Datei existiert nicht !');\n       END IF;\n       \n   ELSIF :PARAMETER.P_HOST_CLIENT='CLIENT' THEN      \n         \n       IF webutil_file.file_exists(p_file) THEN\n          prc_run_view_notepad(p_file);\n       ELSE\n           prc_info('Ausgabe Datei existiert nicht !');\n       END IF;\n       \n   END IF;\n     \nEND prc_view_file;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/PRC_WRITE_SCRIPT.pcd",
    "content": "\nPROCEDURE prc_write_script(p_scriptname VARCHAR2, p_script VARCHAR2) IS\n   l_out_file Text_IO.File_Type;  \n   l_out_file_C client_Text_IO.File_Type;\n   \nBEGIN\n  \n    g.msg_push('prc_write_script');\n   \n   IF :PARAMETER.P_HOST_CLIENT='HOST' THEN\n      l_out_file := Text_IO.Fopen(p_scriptname, 'w');\n      BEGIN\n         Text_IO.put(l_out_file, p_script);\n      EXCEPTION\n         WHEN OTHERS THEN\n               prc_error('$$$ Fehler prc_write_script (ablk_prc_write_script) '||sqlerrm);            \n      END ablk_prc_write_script;   \n      Text_IO.Fclose(l_out_File); \n   \n   ELSIF :PARAMETER.P_HOST_CLIENT='CLIENT' THEN\n       l_out_file_C := client_Text_IO.Fopen(p_scriptname, 'w');\n       BEGIN\n           client_Text_IO.put(l_out_file_C, p_script);\n       EXCEPTION\n           WHEN OTHERS THEN\n               prc_error('$$$ Fehler prc_write_script (ablk_prc_write_script) '||sqlerrm);\n            \n       END ablk_prc_write_script;   \n       client_Text_IO.Fclose(l_out_File_C); \n       \n   END IF;\n   \n   g.msg_free;\n   \nEXCEPTION WHEN OTHERS THEN\n   prc_EXCEPTION;\nEND prc_write_script;\n\n-------------------------------------------------------------------------------------------------\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/WEBUTIL/WEBUTIL__DUMMY__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nif :system.cursor_block = 'WEBUTIL' then \n  next_block;\nend if;\nWebUtil_Core.ShowBeans(false);\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/WEBUTIL/WEBUTIL__WEBUTIL_BROWSER_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/WEBUTIL/WEBUTIL__WEBUTIL_CLIENTINFO_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/WEBUTIL/WEBUTIL__WEBUTIL_C_API_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/WEBUTIL/WEBUTIL__WEBUTIL_FILETRANSFER_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/WEBUTIL/WEBUTIL__WEBUTIL_FILE_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/WEBUTIL/WEBUTIL__WEBUTIL_HOST_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/WEBUTIL/WEBUTIL__WEBUTIL_SESSION_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0009/FORMSAPI_WIZARD_2905/metadata.json",
    "content": "{\n  \"alerts\": [\n    \"INFO\",\n    \"MESSG\",\n    \"DEBUG\",\n    \"ERROR\",\n    \"EXCEPTION\",\n    \"WEBUTIL_ERROR\"\n  ],\n  \"blocks\": [\n    {\n      \"name\": \"CTL_MAIN\",\n      \"items\": [\n        \"CMD_INFO\",\n        \"CMD_SUPPORT\",\n        \"CMD_EXIT\",\n        \"CMD_SAVE\",\n        \"CMD_CONFIG\",\n        \"CMD_DUMMY\"\n      ]\n    },\n    {\n      \"name\": \"CTL_BASIC\",\n      \"items\": [\n        \"BT_ALL\",\n        \"BT_CONFIGURE\",\n        \"BT_CHECK\",\n        \"BT_MIGRATE\",\n        \"BT_COMPILE\"\n      ]\n    },\n    {\n      \"name\": \"CTL_INFO\",\n      \"items\": [\n        \"DUMMY\",\n        \"FORMS_VERSION\",\n        \"FORMSAPI_VERSION\",\n        \"FORMSAPI_LICENSE\",\n        \"MODUL_VARIANTE\",\n        \"MODUL_VERSION\",\n        \"MODUL_HERSTELLER\"\n      ]\n    },\n    {\n      \"name\": \"CTL_INIT\",\n      \"items\": [\n        \"STEP1\",\n        \"RES1\",\n        \"STEP2\",\n        \"RES2\",\n        \"STEP3\",\n        \"RES3\",\n        \"STEP4\",\n        \"RES4\",\n        \"BT_CLOSE\"\n      ]\n    },\n    {\n      \"name\": \"BLK_HANDLG\",\n      \"items\": [\n        \"DMY\",\n        \"PNO\",\n        \"BT_SELECT\",\n        \"CB\",\n        \"RNO\",\n        \"FNAME\",\n        \"FSIZE\",\n        \"DFILE\",\n        \"FORMS_OBJ_VNO\",\n        \"STATUS_CHECK\",\n        \"BT_CHECK_SINGLE\",\n        \"BT_VIEW_CHECK\",\n        \"STATUS_MIGRATE\",\n        \"BT_MIGRATE_SINGLE\",\n        \"BT_VIEW_MIGRATE\",\n        \"STATUS_COMPILE\",\n        \"BT_COMPILE_SINGLE\",\n        \"BT_VIEW_COMPILE\",\n        \"FSTATUS\",\n        \"CBOX_FAM_ACTION\",\n        \"STATUS\",\n        \"FEXTENT\",\n        \"FAM_VERSION\",\n        \"FMESSAGE\",\n        \"REC_STATUS\",\n        \"REC_USER\",\n        \"REC_DCREATED\"\n      ]\n    },\n    {\n      \"name\": \"WEBUTIL\",\n      \"items\": [\n        \"DUMMY\",\n        \"WEBUTIL_CLIENTINFO_FUNCTIONS\",\n        \"WEBUTIL_FILE_FUNCTIONS\",\n        \"WEBUTIL_HOST_FUNCTIONS\",\n        \"WEBUTIL_SESSION_FUNCTIONS\",\n        \"WEBUTIL_FILETRANSFER_FUNCTIONS\",\n        \"WEBUTIL_C_API_FUNCTIONS\",\n        \"WEBUTIL_BROWSER_FUNCTIONS\"\n      ]\n    }\n  ],\n  \"lovs\": []\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0010/CHK_MYFFI_SAMPLE5/BLK/BLK__PB_WEB_FFI__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nDECLARE\n  \n  StringBuffer   varchar2(255) := 'An initial value that will be overwritten';\n  StringLength   pls_integer   := length(StringBuffer);\n  rc             pls_integer;\n  \n  f_handle   Webutil_c_api.FUNCTIONHANDLE;\n  args       Webutil_c_api.parameterlist;\n  param1     Webutil_c_api.ParameterHandle;\n  param2     Webutil_c_api.ParameterHandle;\n  loc       VARCHAR2(512);\n  \nBEGIN\n  \n  -- loc  := webutil_clientinfo.get_system_property('user.home') || '\\' ||\n  --          WEBUTIL_CORE.ReadFromPropertyBundle('install.syslib.location.client.0') || ';';\n\n  -- prc_show(loc);\n  \n  prc_show('Before Calling the C program the value of the string is:\"'||chr(10)||\n           StringBuffer||'\" with a length of '||to_char(StringLength));\n  \n  f_handle := WEBUTIL_C_API.register_function('FFIdll32.dll', 'PopulateString');\n  \n  --prc_show('-- After register_function(<FFIdll32.dll>) ---');\n  \n  args   := WEBUTIL_C_API.create_parameter_list;\n  param1 := WEBUTIL_C_API.add_parameter(args,WEBUTIL_C_API.C_CHAR_PTR\n                                            ,WEBUTIL_C_API.PARAM_INOUT\n                                            ,StringBuffer, 255);\n  \n  --prc_show('-- After add_parameter param1 ---');\n                                              \n  param2 := WEBUTIL_C_API.add_parameter(args,WEBUTIL_C_API.C_INT_PTR\n                                            ,WEBUTIL_C_API.PARAM_INOUT\n                                            ,StringLength);    \n\n  --prc_show('-- After add_parameter param2 ---');\n  \n  rc := WEBUTIL_C_API.Invoke_Int(  'FFIdll32.dll', 'PopulateString', args);  \n  \n  --prc_show('-- After Invoke_Int(<FFIdll32.dll>) --- : '||to_char(rc));\n\n  --- SUCCESS !!! ---\n  -----------------------------------------------------------------------------------------------------\n      \n  prc_show('The New value for String is: \"'||chr(10)||\n            WEBUTIL_C_API.Get_Parameter_String(args, param1)||\n            '\" with a length of ' ||\n            to_char(WEBUTIL_C_API.Get_Parameter_Number(args, param2)));\n\n  --prc_show('The New value for String is: \"'||WEBUTIL_C_API.Get_Parameter_String(args,\n  --          param2)||'\" with a length of ' ||to_char(WEBUTIL_C_API.Get_Parameter_Number(args, param2)));\n           \n  --prc_show('RC was : '||to_char(rc));  \n  \n  WEBUTIL_C_API.Destroy_Parameter_List(args);\n  \n  WEBUTIL_C_API.Deregister_Function(f_handle);\n                                  \nEND;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0010/CHK_MYFFI_SAMPLE5/BLK/BLK__URL__WHEN-MOUSE-CLICK.tgg",
    "content": "BEGIN\n\nBEGIN\n  web.show_document('http://www.oracle.com/technetwork/developer-tools/forms/howto-ffi-090477.html');\nEND;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0010/CHK_MYFFI_SAMPLE5/CHK_MYFFI_SAMPLE5/ON-LOGON.tgg",
    "content": "BEGIN\nnull;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0010/CHK_MYFFI_SAMPLE5/FNC_BOOL.fun",
    "content": "FUNCTION fnc_BOOL(p_bool BOOLEAN) RETURN VARCHAR2 IS\nBEGIN\n  IF p_bool THEN RETURN('TRUE');\n  ELSE           RETURN('FALSE');\n  END IF;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0010/CHK_MYFFI_SAMPLE5/PRC_SHOW.pcd",
    "content": "PROCEDURE prc_show(s VARCHAR2) IS\n  al_button PLS_INTEGER;\n  al_id     Alert;\n  \n  -- F.Matz: 15.01.107 \nBEGIN\n  al_id:= FIND_ALERT('INFO'); \n  SET_ALERT_PROPERTY(al_id, ALERT_MESSAGE_TEXT, s ); \n  al_button := SHOW_ALERT( al_id ); \nEND prc_show;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0010/CHK_MYFFI_SAMPLE5/WEBUTIL/WEBUTIL__DUMMY__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nif :system.cursor_block = 'WEBUTIL' then \n  next_block;\nend if;\nWebUtil_Core.ShowBeans(false);\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0010/CHK_MYFFI_SAMPLE5/WEBUTIL/WEBUTIL__WEBUTIL_BROWSER_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0010/CHK_MYFFI_SAMPLE5/WEBUTIL/WEBUTIL__WEBUTIL_CLIENTINFO_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0010/CHK_MYFFI_SAMPLE5/WEBUTIL/WEBUTIL__WEBUTIL_C_API_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0010/CHK_MYFFI_SAMPLE5/WEBUTIL/WEBUTIL__WEBUTIL_FILETRANSFER_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0010/CHK_MYFFI_SAMPLE5/WEBUTIL/WEBUTIL__WEBUTIL_FILE_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0010/CHK_MYFFI_SAMPLE5/WEBUTIL/WEBUTIL__WEBUTIL_HOST_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0010/CHK_MYFFI_SAMPLE5/WEBUTIL/WEBUTIL__WEBUTIL_SESSION_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0010/CHK_MYFFI_SAMPLE5/metadata.json",
    "content": "{\n  \"alerts\": [\n    \"INFO\",\n    \"WEBUTIL_ERROR\"\n  ],\n  \"blocks\": [\n    {\n      \"name\": \"BLK\",\n      \"items\": [\n        \"PB_WEB_FFI\",\n        \"URL\"\n      ]\n    },\n    {\n      \"name\": \"WEBUTIL\",\n      \"items\": [\n        \"DUMMY\",\n        \"WEBUTIL_CLIENTINFO_FUNCTIONS\",\n        \"WEBUTIL_FILE_FUNCTIONS\",\n        \"WEBUTIL_HOST_FUNCTIONS\",\n        \"WEBUTIL_SESSION_FUNCTIONS\",\n        \"WEBUTIL_FILETRANSFER_FUNCTIONS\",\n        \"WEBUTIL_C_API_FUNCTIONS\",\n        \"WEBUTIL_BROWSER_FUNCTIONS\"\n      ]\n    }\n  ],\n  \"lovs\": []\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/ABOUT/ABOUT__ABOUT_BUTTON__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nbegin\n  show_webutil_information;\n\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/BROWSER/BROWSER__APPLET_PARAMS__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nbegin\n  get_applet_parameters;\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/BROWSER/BROWSER__BROWSER_MESSAGE__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nbegin\n  set_browser_message (:browser_mess_text);\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/BROWSER/BROWSER__SEPARATE_FRAME__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nbegin\n  separate_frame_options;\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/BUILTINS/BUILTINS__GET_FILE_NAME__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nbegin\n  get_client_filename;\n  If :builtins.file_name IS NOT NULL Then\n    Go_Item('builtins.read_image');\n  end if;\n  \nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/BUILTINS/BUILTINS__GET_TOOL_ENV__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nbegin\n  client_getenv;\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/BUILTINS/BUILTINS__READ_IMAGE__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nbegin\n  If :builtins.file_name IS NULL then\n    message ('Please enter image filename.');\n    GO_ITEM('builtins.filename');\n    SYNCHRONIZE;\n    RAISE FORM_TRIGGER_FAILURE;\n  End if;\n  client_readimage;\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/BUILTINS/BUILTINS__TEXT_IO_BUTTON__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nbegin\n  client_textio;\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/CLIENTINFO/CLIENTINFO__ACTION__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nbegin\n  get_clientinfo;\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/CLIENT_GETENV.pcd",
    "content": "PROCEDURE client_getenv IS\nBEGIN\n  client_tool_env.getvar('NLS_LANG',:builtins.tool_env);\n  SYNCHRONIZE;\n  \n  If :builtins.tool_env IS NULL Then\n    :builtins.tool_env := 'NLS_LANG is not set.';\n  End if;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/CLIENT_READIMAGE.pcd",
    "content": "PROCEDURE client_readimage IS\nBEGIN\n  client_image.read_image_file(:builtins.file_name, 'GIF', 'builtins.image');\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/CLIENT_TEXTIO.pcd",
    "content": "PROCEDURE client_textio IS\n  l_out_file  client_Text_IO.File_Type;\nBEGIN\n  l_out_file := client_Text_IO.Fopen(:global.user_home ||'\\helloworld.txt', 'w');\n  client_text_io.put_line(l_out_file, 'At '||TO_CHAR(SYSDATE,'HH24:MI')||' ' \n                                      ||webutil_clientinfo.get_user_name||' wrote:');\n  client_text_io.put_line(l_out_file, :builtins.text_io_item);\n  client_text_io.fclose (l_out_file);\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/CTL/CTL__ACKNOWLEDGE__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\n\n  show_window ('window1');\n  hide_window('w_hello');\n  go_block('clientinfo');\n  SYNCHRONIZE;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/CTL/CTL__EXIT10__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\ndo_key('exit');\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/CTL/CTL__EXIT1__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\ndo_key('exit');\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/CTL/CTL__EXIT2__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\ndo_key('exit');\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/CTL/CTL__EXIT3__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\ndo_key('exit');\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/CTL/CTL__EXIT4__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\ndo_key('exit');\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/CTL/CTL__EXIT5__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\ndo_key('exit');\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/CTL/CTL__EXIT6__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\ndo_key('exit');\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/CTL/CTL__EXIT7__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\ndo_key('exit');\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/CTL/CTL__EXIT8__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\ndo_key('exit');\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/CTL/CTL__EXIT9__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\ndo_key('exit');\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/C_API/C_API__CALL_C_API__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\n-- IMPORTANT\n-- Be sure to review the following My Oracle Support Note\n-- Doc ID: 285331.1 - \"Exception When Calling PASCAL style Function Via WebUTIL_C_API\"\n\ndeclare\n  \n  StringBuffer varchar2(255) := 'Text to overwrite';\n  StringLength pls_integer   := length(StringBuffer);\n  rc pls_integer;\n  \n  f_handle WEBUTIL_C_API.FUNCTIONHANDLE;\n  args Webutil_c_api.parameterlist;\n  param1 Webutil_c_api.ParameterHandle;\n  param2 Webutil_c_api.ParameterHandle;\n  \nbegin\n  f_handle := WEBUTIL_C_API.register_function('ffisamp.dll','PopulateString');\n  args := WEBUTIL_C_API.create_parameter_list;\n  param1 := WEBUTIL_C_API.add_parameter(args,WEBUTIL_C_API.C_CHAR_PTR\n                                            ,WEBUTIL_C_API.PARAM_INOUT\n                                            ,StringBuffer, 255);\n  param2 := WEBUTIL_C_API.add_parameter(args,WEBUTIL_C_API.C_INT_PTR\n                                            ,WEBUTIL_C_API.PARAM_INOUT\n                                            ,StringLength);    \n                                          \n  rc := WEBUTIL_C_API.Invoke_Int(  'ffisamp.dll','PopulateString',args);  \n  \n  \n  \n  message('The New value for String is: '||WEBUTIL_C_API.Get_Parameter_String(args,param1));\n  message('New Length '||to_char(WEBUTIL_C_API.Get_Parameter_Number(args,param2)));\n  message('RC was '||to_char(RC));  \n  \n  WEBUTIL_C_API.Destroy_Parameter_List(args);\n  WEBUTIL_C_API.Deregister_Function(f_handle);                                \nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/C_API/C_API__LOCKSTATION__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\n-- IMPORTANT\n-- Be sure to review the following My Oracle Support Note\n-- Doc ID: 285331.1 - \"Exception When Calling PASCAL style Function Via WebUTIL_C_API\"\n  \n  \ndeclare\n  \n  rc pls_integer;\n  f_handle WEBUTIL_C_API.FUNCTIONHANDLE;\n  args Webutil_c_api.parameterlist;\n\n  winSysDir varchar2(255) := Client_Win_API_ENVIRONMENT.Get_Windows_Directory || '\\system32\\';\n\n--- IMPORTANT ---\n-----------------\n--\n-- WEBUTIL_C_API CURRENTLY ONLY SUPPORTS CALLING C STYLE LIBRARIES, THEREFORE SOME WINDOWS LIBRARIES CANNOT BE CALLED.\n-- ADDITIONALLY, IT IS NOT RECOMMENDED THAT YOU ATTEMPT TO CALL WINDOWS FUNCTIONS WHICH REQUIRE ARGS.\n--\n-- USE EXTREME CAUTION WHEN CALLING WINDOWS APIS. \n-- BE SURE TO THOROUGHLY TEST BEFORE MOVING TO PRODUCTION\n-- LOOK CLOSELY AT BOTH STABILITY AND MEMORY USAGE AS SOME CALLS\n-- MAY RESULT IN THE APPEARANCE OF A MEMORY LEAK.\n\n------------------------------------------------------------------------------------------\n-- This call to USER32.DLL will reference the LOCKWORKSTATION function.\n-- If the current OS user does not have a password configured, the workstation may not lock.\n------------------------------------------------------------------------------------------\n\n-- The Windows LockWorkStation function requires no args to be passed in.\n-- WebUtil expects something to be passed in. So an empty paramlist will be created.\n\nbegin\n\nIf webutil_clientinfo.get_operating_system LIKE 'Win%' Then    \n    \n  f_handle := WEBUTIL_C_API.register_function(winSysDir||'user32.dll','LockWorkStation');\n  args := WEBUTIL_C_API.create_parameter_list;    \n  \n/*\nIf the function succeeds, the return value is nonzero. Because the function executes asynchronously, \na nonzero return value indicates that the operation has been initiated. It does not indicate whether \nthe workstation has been successfully locked.  If the function fails, the return value is zero. \n\n    http://msdn.microsoft.com/en-us/library/aa376875(v=VS.85).aspx\n*/              \n  rc := WEBUTIL_C_API.Invoke_Int(winSysDir||'user32.dll','LockWorkStation',args);  \n\nEnd if;\n\n  WEBUTIL_C_API.Destroy_Parameter_List(args);\n  WEBUTIL_C_API.Deregister_Function(f_handle);      \n  SYNCHRONIZE;\n                          \nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/DOWNLOAD/DOWNLOAD__DOWNLOAD_AS__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nbegin\n  download_as;\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/DOWNLOAD/DOWNLOAD__DOWNLOAD_DB__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nbegin\n  download_db;\n  \n  exception\n  when others\n    then\n      message('File download failed: '||sqlerrm);\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/DOWNLOAD/DOWNLOAD__GET_FILE_NAME__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\ndeclare\n  l_filename varchar2(200);\nbegin\n   l_filename := webutil_file.file_save_dialog\n    (directory_name => :global.user_home\n                                    ,file_name      => 'downloaded_from_as.txt'\n                                    ,file_filter    => null\n                                    ,title          => 'Select client side filename where App Server file will be saved'\n                                    );\n\n  :download.file_name := l_filename;\nend;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/DOWNLOAD_AS.pcd",
    "content": "PROCEDURE DOWNLOAD_AS IS\n  l_success       boolean;\n  l_bare_filename varchar2(50);\nBEGIN\n\n-- THIS CODE ASSUMES THAT CLIENT IS WINDOWS BASED\n-- CHANGE THE serverFile PATH FROM C:\\TEMP TO THE LOCATION SET IN WEBUTIL.CFG\n  l_bare_filename := substr(:upload.file_name,instr(:upload.file_name,'\\',-1)+1);\n  l_success := webutil_file_transfer.AS_to_Client_with_progress\n                                    (clientFile       => :download.file_name\n                                    ,serverFile       => 'c:\\kassandra\\temp\\'||l_bare_filename\n                                    ,progressTitle    => 'Download from Application Server in progress'\n                                    ,progressSubTitle => 'Please wait'\n                                    );\n  if l_success\n  then\n    message('File downloaded successfully from the Application Server');\n  else\n    message('File download from Application Server failed');\n  end if;\n  \n  exception\n    when others\n    then\n      message('File download failed: '||sqlerrm);\n  \n\nEND;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/DOWNLOAD_DB.pcd",
    "content": "PROCEDURE DOWNLOAD_DB IS\n  l_success boolean;\nBEGIN\n  l_success := webutil_file_transfer.DB_To_Client_with_progress\n                                    (clientFile      => :download.file_name\n                                    ,tableName       => 'wu_fileupdown_demo'\n                                    ,columnName      => 'BLOB'\n                                    ,whereClause     => 'ID = 1'\n                                    ,progressTitle   => 'Download from Database in progress'\n                                    ,progressSubTitle=> 'Please wait'\n                                    );\n  if l_success\n  then\n    message('File downloaded successfully from the Database');\n  else\n    message('File download from Database failed');\n  end if;\n  \n  exception\n    when others\n    then\n      message('File download failed: '||sqlerrm);\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/FILES/FILES__COPY_FILE__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nbegin\n  files_wbp('COPY_FILE');\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/FILES/FILES__DELETE_FILE__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nbegin\n  files_wbp('DELETE_FILE');\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/FILES/FILES__FILE_INFO__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nbegin\n  files_wbp('FILE_INFO');\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/FILES/FILES__FILE_OPEN__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nbegin\n  files_wbp('FILE_OPEN');\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/FILES/FILES__FILE_SAVE__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nbegin\n  files_wbp('FILE_SAVE');\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/FILES/FILES__LIST_DIRS__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nbegin\n  files_wbp('LIST_DIRS');\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/FILES/FILES__LIST_FILES__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nbegin\n  files_wbp('LIST_FILES');\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/FILES_WBP.pcd",
    "content": "PROCEDURE FILES_WBP (P_ACTION IN VARCHAR2) IS\n  l_file_list  webutil_file.file_list;\n  l_temp_text  varchar2(8000);\n  l_filename   varchar2(80)   := :global.user_home ||'\\helloworld.txt';\n  l_copy_name  varchar2(80)   := :global.user_home ||'\\copy of helloworld.txt';\n  l_success    boolean;\nBEGIN\n  l_file_list.delete;\n  \n  if p_action = 'LIST_DIRS'\n  then\n    l_file_list := webutil_file.directory_root_list;\n\n  elsif p_action = 'LIST_FILES'\n  then\n    l_file_list := webutil_file.directory_list(:global.user_home,true);\n\n  elsif p_action = 'FILE_INFO'\n  then\n    l_file_list(1) := 'Exists:    '||webutil_util.booltostr(webutil_file.file_exists(l_filename));\n    l_file_list(2) := 'Readable:  '||webutil_util.booltostr(webutil_file.file_is_readable(l_filename));\n    l_file_list(3) := 'Writeable: '||webutil_util.booltostr(webutil_file.file_is_writable(l_filename));\n    l_file_list(4) := 'Hidden:    '||webutil_util.booltostr(webutil_file.file_is_hidden(l_filename));\n    l_file_list(5) := 'Directory: '||webutil_util.booltostr(webutil_file.file_is_directory(l_filename));\n    l_file_list(6) := 'Size:      '||to_char(webutil_file.file_size(l_filename))||' bytes';\n\n  elsif p_action = 'COPY_FILE'\n  then\n    l_success := webutil_file.copy_file(l_filename,l_copy_name);\n    if l_success \n    then\n       message('Copy of file successfull');\n    else\n       message('Copy failed');\n    end if;\n    l_file_list := webutil_file.directory_list(:global.user_home,true);\n\n  elsif p_action = 'DELETE_FILE'\n  then\n    l_success := webutil_file.delete_file(l_copy_name);\n    if l_success \n    then\n       message('Delete of file successfull');\n    else\n       message('Delete failed');\n    end if;\n    l_file_list := webutil_file.directory_list(:global.user_home,true);\n\n  elsif p_action = 'FILE_OPEN'\n  then\n    l_filename := webutil_file.file_open_dialog;\n    l_file_list(1) := 'Selected file: '||l_filename;\n\n  elsif p_action = 'FILE_SAVE'\n  then\n    l_copy_name := webutil_file.file_save_dialog;\n    --l_success   := webutil_file.copy_file(l_filename,l_copy_name);\n    l_file_list(1) := 'File Saved as: '||l_copy_name;\n\n  else\n    message('Invalid Event passed to FILES_WBP');\n  end if;\n  \n  -- write file list to text box\n  l_temp_text := '';\n  for i in 1 .. l_file_list.count\n  loop\n    l_temp_text := l_temp_text || l_file_list(i) || chr(10);\n  end loop;\n  :files.result_box := l_temp_text;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/GET_APPLET_PARAMETERS.pcd",
    "content": "PROCEDURE get_applet_parameters IS\nBEGIN\n  :applet_param_box := '<lookAndFeel> = '||webutil_browser.getappletparameter('lookAndFeel');\n  :applet_param_box := :applet_param_box || chr(10)|| '<colorScheme> = '||webutil_browser.getappletparameter('colorScheme');\n  :applet_param_box := :applet_param_box || chr(10)|| '<separateFrame> = '||webutil_browser.getappletparameter('separateFrame');\n  :applet_param_box := :applet_param_box || chr(10)|| 'Applet width and height = '||webutil_browser.getappletsize();\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/GET_CLIENTINFO.pcd",
    "content": "PROCEDURE GET_CLIENTINFO IS\nBEGIN\n  :CLIENTINFO.USER_NAME        := webutil_clientinfo.get_user_name;\n  :CLIENTINFO.IP_ADDRESS       := webutil_clientinfo.get_ip_address;\n  :CLIENTINFO.HOST_NAME        := webutil_clientinfo.get_host_name;\n  :CLIENTINFO.OPERATING_SYSTEM := webutil_clientinfo.get_operating_system;\n  :CLIENTINFO.JAVA_VERSION     := webutil_clientinfo.get_java_version;\n  :CLIENTINFO.PATH_SEPERATOR   := webutil_clientinfo.get_path_separator;\n  :CLIENTINFO.FILE_SEPERATOR   := webutil_clientinfo.get_file_separator;\n  :CLIENTINFO.LANGUAGE         := webutil_clientinfo.get_language;\n  :CLIENTINFO.TIME_ZONE        := webutil_clientinfo.get_time_zone;\n  :CLIENTINFO.DATE_TIME        := webutil_clientinfo.get_date_time;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/GET_CLIENT_FILENAME.pcd",
    "content": "PROCEDURE get_client_filename IS\n  l_filename varchar2(200);\nBEGIN\n  l_filename := client_get_file_name(directory_name => :global.user_home\n                                    ,file_name      => null\n                                    ,file_filter    => 'GIF Files (*.gif)|*.gif|All Files (*.*)|*.*'\n                                    ,message        => null\n                                    ,dialog_type    => null\n                                    ,select_file    => null\n                                    );\n  :builtins.file_name := l_filename;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/HOST/HOST__HOST_CALLBACK.tgg",
    "content": "BEGIN\nMESSAGE ('Host command called back into Forms');\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/HOST/HOST__RUN_HOST__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nDECLARE\n  fname VARCHAR2(255) := null;\n  pid WEBUTIL_HOST.PROCESS_ID;\nBEGIN\n  IF :HOST_ASK_FILENAME = 'true' THEN\n    fname := CLIENT_GET_FILE_NAME(null,null,null,null,OPEN_FILE,TRUE);\n  END IF;\n  IF :BLOCKING_RADIO = 'BLOCKING' THEN\n    CLIENT_HOST('CMD /C NOTEPAD '||fname);\n  ELSIF :BLOCKING_RADIO = 'NON_BLOCKING' THEN\n    WEBUTIL_HOST.NONBLOCKING('CMD /C NOTEPAD '||fname);\n  ELSIF :BLOCKING_RADIO = 'NON_BLOCKING_CALLBACK' THEN\n    pid := WEBUTIL_HOST.NONBLOCKING_WITH_CALLBACK('CMD /C NOTEPAD '||fname,'HOST_CALLBACK');\n  END IF;\nEND;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/OLE/OLE__SAVEFILE__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nbegin\n  :ole.filename := client_get_file_name('C:\\temp','','|Word Documents(*.doc)|*.doc|','Select output document...',SAVE_FILE,true);\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/OLE/OLE__WRITE__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nbegin\n  \n  If :OLE.OLETEXT is NULL then\n    Message ('Please enter some text.');\n    Message ('Please enter some text.');\n    CLEAR_MESSAGE;\n    GO_ITEM ('OLE.OLETEXT');\n    RAISE FORM_TRIGGER_FAILURE;\n  Else    \n  \n    ole_write;\n    message('Done.');\n  \n  End if;\n  \nend;    \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/OLE_WRITE.pcd",
    "content": "PROCEDURE OLE_WRITE IS\n  app       CLIENT_OLE2.OBJ_TYPE;\n  docs      CLIENT_OLE2.OBJ_TYPE;    \n  doc       CLIENT_OLE2.OBJ_TYPE; \n  selection CLIENT_OLE2.OBJ_TYPE; \n  args      CLIENT_OLE2.LIST_TYPE;\nBEGIN\n  -- create a new document\n  app := CLIENT_OLE2.CREATE_OBJ('Word.Application');\n  if :ole.silent = 'Y' \n  then\n    CLIENT_OLE2.SET_PROPERTY(app,'Visible',0);\n  else\n    CLIENT_OLE2.SET_PROPERTY(app,'Visible',1);\n  end if;\n  \n  docs := CLIENT_OLE2.GET_OBJ_PROPERTY(app, 'Documents');\n  doc  := CLIENT_OLE2.INVOKE_OBJ(docs, 'add');\n  \n  selection := CLIENT_OLE2.GET_OBJ_PROPERTY(app, 'Selection');\n\n  -- insert data into new document from long item\n  CLIENT_OLE2.SET_PROPERTY(selection, 'Text', :ole.oletext);\n\n  -- save document as example.tmp\n  args := CLIENT_OLE2.CREATE_ARGLIST;\n  CLIENT_OLE2.ADD_ARG(args, :ole.filename);\n  CLIENT_OLE2.INVOKE(doc, 'SaveAs', args);\n  CLIENT_OLE2.DESTROY_ARGLIST(args);\n\n  -- close example.tmp\n  args := CLIENT_OLE2.CREATE_ARGLIST;\n  CLIENT_OLE2.ADD_ARG(args, 0);\n  CLIENT_OLE2.INVOKE(doc, 'Close', args);\n  CLIENT_OLE2.DESTROY_ARGLIST(args);\n \n  CLIENT_OLE2.RELEASE_OBJ(selection);\n  CLIENT_OLE2.RELEASE_OBJ(doc); \n  CLIENT_OLE2.RELEASE_OBJ(docs); \n \n -- exit MSWord \n  CLIENT_OLE2.INVOKE(app,'Quit');\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/SEPARATE_FRAME_OPTIONS.pcd",
    "content": "PROCEDURE separate_frame_options IS\nBEGIN\n  if WebUtil_SeparateFrame.IsSeparateFrame\n  then\n    WebUtil_SeparateFrame.SetTitle('WebUtil Demo Form');\n  end if;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/SET_BROWSER_MESSAGE.pcd",
    "content": "PROCEDURE set_browser_message (  my_message  varchar2) IS\n  \nBEGIN\n  \n  If my_message IS NULL then\n  \n  WebUtil_Browser.BrowserMessage('Welcome '                  ||webutil_clientinfo.get_user_name   \n                               ||', your computer is called '||webutil_clientinfo.get_host_name\n                               ||', with IP address '        ||webutil_clientinfo.get_ip_address\n                               ||', running '                ||webutil_clientinfo.get_operating_system\n                               );\n  Else\n    \n      WebUtil_Browser.BrowserMessage (my_message);    \n  \n  End if;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/UPLOAD/UPLOAD__CREATE_TABLE__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\n/*\nTHE FOLLOWING IS THE SQL FOUND IN \"wu_fileupload_db_demo.sql\".\nIF THE TRIGGER BELOW EXECUTES SUCCESSFULLY, THE SAME TABLE WILL BE CREATED AS SEEN IN THE SCRIPT\nTHERE IS NO NEED TO RUN THE SCRIPT IF THIS TRIGGER HAS BEEN EXECUTED SUCCESSFULLY\n\n    drop table wu_fileupdown_demo;\n    create table wu_fileupdown_demo (blob blob, id number(2));\n    insert into wu_fileupdown_demo values (NULL,1);\n    commit;\n\n*/\n\n\nBEGIN \n  Forms_DDL('drop table wu_fileupdown_demo');\n  Forms_DDL('create table wu_fileupdown_demo (blob blob, id number(2))');\n  \n  IF NOT Form_Success THEN \n    -- Failure will most likely occur if the current user does not have permission to create tables\n    Message ('Table Creation Failed');  \n  \n  ELSE \n  Forms_DDL('insert into wu_fileupdown_demo values (NULL,1)');\n  Message ('Table \"wu_fileupdown_demo\" created.');\n  Message ('Table \"wu_fileupdown_demo\" created.');  \n \n -- Since the table was created successfully, we can now enable the appropriate buttons\n -- Also, we will remove the Create button since it is no longer needed\n   SET_ITEM_PROPERTY ('upload.upload_db',enabled, property_true);\n  SET_ITEM_PROPERTY ('download.download_db',enabled, property_true);\n  GO_ITEM('upload.file_name');\n  SYNCHRONIZE;\n  SET_ITEM_PROPERTY ('upload.create_table',enabled, property_false);\n  SET_ITEM_PROPERTY ('upload.create_table',visible, property_false);  \n  END IF;\n  \n\nEND;\n\n\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/UPLOAD/UPLOAD__GET_FILE_NAME__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\ndeclare\n  l_filename varchar2(200);\nbegin\n  l_filename := client_get_file_name(directory_name => :global.user_home\n                                    ,file_name      => null\n                                    ,file_filter    => null\n                                    ,message        => null\n                                    ,dialog_type    => null\n                                    ,select_file    => null\n                                    );\n  :upload.file_name := l_filename;\n  SYNCHRONIZE;\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/UPLOAD/UPLOAD__UPLOAD_AS__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nbegin\n  upload_as;\n\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/UPLOAD/UPLOAD__UPLOAD_DB__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nbegin\n  upload_db;\n    exception\n    when others\n    then\n      message('File upload failed: '||sqlerrm);\n\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/UPLOAD_AS.pcd",
    "content": "PROCEDURE UPLOAD_AS IS\n  l_success       boolean;\n  l_bare_filename varchar2(50);\nBEGIN\n  \n-- THIS CODE ASSUMES THAT CLIENT IS WINDOWS BASED\n-- CHANGE THE serverFile PATH FROM C:\\TEMP TO THE LOCATION SET IN WEBUTIL.CFG  \n  l_bare_filename := substr(:upload.file_name,instr(:upload.file_name,'\\',-1)+1);  \n  l_success := webutil_file_transfer.Client_To_AS_with_progress\n                                    (clientFile       => :upload.file_name\n                                    ,serverFile       => 'c:\\kassandra\\temp\\'||l_bare_filename\n                                    ,progressTitle    => 'Upload to Application Server in progress'\n                                    ,progressSubTitle => 'Please wait'\n                                    ,asynchronous     => false\n                                    ,callbackTrigger  => null\n                                    );\n  if l_success\n  then\n    message('File uploaded successfully to the Application Server');\n-- Added to make demo more user friendly.\n-- If file is successfully uploaded, move to \"Download\" tab.        \n    go_item('download.file_name');\n        \n  else\n    message('File upload to Application Server failed');\n  end if;\n  \n  exception\n    when others\n    then\n      message('File upload failed: '||sqlerrm);\n  \n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/UPLOAD_DB.pcd",
    "content": "PROCEDURE UPLOAD_DB IS\n  l_success boolean;\nBEGIN\n  l_success := webutil_file_transfer.Client_To_DB_with_progress\n                                    (clientFile      => :upload.file_name\n                                    ,tableName       => 'wu_fileupdown_demo'\n                                    ,columnName      => 'BLOB'\n                                    ,whereClause     => 'ID = 1'\n                                    ,progressTitle   => 'Upload to Database in progress'\n                                    ,progressSubTitle=> 'Please wait'\n                                    ,asynchronous    => false\n                                    ,callbackTrigger => null\n                                    );\n  if l_success\n  then\n  --\n  -- Force commit to save file in db.                                    \n  -- This is not in the original Demo \n  -- which causes the Demo to fail if \n  -- you exit and return later to download.\n    :System.Message_Level := '15';                                   \n    commit;\n    :System.Message_Level := '0';  \n    \n    message('File uploaded successfully into the Database');\n    \n-- Added to make demo more user friendly.\n-- If file is successfully uploaded, move to \"Download\" tab.        \n    go_item('download.file_name');\n    \n  else\n    message('File upload to Database failed');\n  end if;\n  \n  exception\n    when others\n    then\n      message('File upload failed: '||sqlerrm);\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/WEBUTIL/WEBUTIL__DUMMY__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nif :system.cursor_block = 'WEBUTIL' then \n  next_block;\nend if;\nWebUtil_Core.ShowBeans(false);\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/WEBUTIL/WEBUTIL__WEBUTIL_BROWSER_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/WEBUTIL/WEBUTIL__WEBUTIL_CLIENTINFO_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/WEBUTIL/WEBUTIL__WEBUTIL_C_API_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/WEBUTIL/WEBUTIL__WEBUTIL_FILETRANSFER_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/WEBUTIL/WEBUTIL__WEBUTIL_FILE_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/WEBUTIL/WEBUTIL__WEBUTIL_HOST_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/WEBUTIL/WEBUTIL__WEBUTIL_OLE_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/WEBUTIL/WEBUTIL__WEBUTIL_SESSION_FUNCTIONS__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nbegin\n  WEBUTIL_CORE.CustomEventHandler(:SYSTEM.CUSTOM_ITEM_EVENT,:SYSTEM.CUSTOM_ITEM_EVENT_PARAMETERS);\nend;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/WEBUTIL_DEMO/KEY-EXIT.tgg",
    "content": "BEGIN\nDECLARE\nal_id Alert;\nal_button NUMBER;\nbegin\n  al_id := Find_Alert('EXIT_ALERT');\n  al_button := Show_Alert(al_id); \n  \n  -- 88 constant for button 1\n  -- 89 constant for button 2\n  -- 90 constant for button 3\n  If al_button = 88 Then\n    -- OK was pressed\n    --WEBUTIL_SESSION.ENABLE_REDIRECT_ON_TIMEOUT('http://www.oracle.com/technetwork/developer-tools/forms/overview/');\n    --SYNCHRONIZE;\n     EXIT_FORM;\n     \n  Elsif al_button = 89 Then\n    -- EXIT was pressed\n    -- message ('Good-bye');\n     EXIT_FORM;\n     \n  Elsif al_button = 90 Then\n    -- CANCEL was pressed, don't exit\n    RAISE FORM_TRIGGER_FAILURE;\n        \n  End if;\n  \n\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/WEBUTIL_DEMO/WHEN-NEW-FORM-INSTANCE.tgg",
    "content": "BEGIN\ndeclare\n  fake_timer   TIMER;\n  istable      varchar2(2);\nbegin\n  \n  --\n  -- Purpose of the fake timer is the we cannot call webutil in this trigger since the\n  -- beans have not yet been instantiated.  If we put the code in a when-timer-expired-trigger\n  -- it means that this timer will not start running until Forms has focus (and so the webutil\n  -- beans will be instantiated and so call canbe made.\n  --\n  fake_timer:= CREATE_TIMER('webutil',150,NO_REPEAT);\n\n  show_window ('w_hello');\n  hide_window ('window1');\n\n  -- Test to see if WebUtil Demo table exists (wu_test_table)\n  -- This is used on the File Upload tab\n    SELECT DECODE(count(*),0,'F','T') INTO istable FROM user_tables WHERE table_name = upper('wu_fileupdown_demo');\n    If istable = 'F' Then \n      SET_ITEM_PROPERTY ('upload.upload_db',enabled, property_false);\n      SET_ITEM_PROPERTY ('download.download_db',enabled, property_false);  \n      SET_ITEM_PROPERTY ('upload.create_table',visible, property_true);\n      SET_ITEM_PROPERTY ('upload.create_table',enabled, property_true);\n    end if;          \nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/WEBUTIL_DEMO/WHEN-TAB-PAGE-CHANGED.tgg",
    "content": "BEGIN\nbegin  \n  if not WebUtil_SeparateFrame.IsSeparateFrame\n  then\n    set_item_property('browser.separate_frame',enabled,property_false);\n  end if;\nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/WEBUTIL_DEMO/WHEN-TIMER-EXPIRED.tgg",
    "content": "BEGIN\n  :global.user_home := webutil_clientinfo.get_system_property('user.home');\n  :OLE.FILENAME := :global.user_home||'\\temp.doc';\n  SET_ITEM_PROPERTY('builtins.text_io_item',PROMPT_TEXT,'Write to '||:global.user_home||'\\helloworld.txt');\n  SET_ITEM_PROPERTY('files.userdothome',PROMPT_TEXT,:global.user_home);\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/WEBUTIL_DEMO/WHEN-WINDOW-CLOSED.tgg",
    "content": "BEGIN\ndo_key('exit');\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0011/WEBUTIL_DEMO/metadata.json",
    "content": "{\n  \"alerts\": [\n    \"EXIT_ALERT\",\n    \"WEBUTIL_ERROR\"\n  ],\n  \"blocks\": [\n    {\n      \"name\": \"CLIENTINFO\",\n      \"items\": [\n        \"ACTION\",\n        \"DATE_TIME\",\n        \"TIME_ZONE\",\n        \"LANGUAGE\",\n        \"FILE_SEPERATOR\",\n        \"PATH_SEPERATOR\",\n        \"JAVA_VERSION\",\n        \"OPERATING_SYSTEM\",\n        \"IP_ADDRESS\",\n        \"USER_NAME\",\n        \"HOST_NAME\"\n      ]\n    },\n    {\n      \"name\": \"BUILTINS\",\n      \"items\": [\n        \"IMAGE\",\n        \"FILE_NAME\",\n        \"GET_FILE_NAME\",\n        \"READ_IMAGE\",\n        \"GET_TOOL_ENV\",\n        \"TOOL_ENV\",\n        \"TEXT_IO_BUTTON\",\n        \"TEXT_IO_ITEM\"\n      ]\n    },\n    {\n      \"name\": \"FILES\",\n      \"items\": [\n        \"LIST_DIRS\",\n        \"LIST_FILES\",\n        \"FILE_INFO\",\n        \"COPY_FILE\",\n        \"DELETE_FILE\",\n        \"FILE_OPEN\",\n        \"FILE_SAVE\",\n        \"RESULT_BOX\",\n        \"USERDOTHOME\"\n      ]\n    },\n    {\n      \"name\": \"OLE\",\n      \"items\": [\n        \"OLETEXT\",\n        \"SILENT\",\n        \"FILENAME\",\n        \"SAVEFILE\",\n        \"WRITE\"\n      ]\n    },\n    {\n      \"name\": \"UPLOAD\",\n      \"items\": [\n        \"FILE_NAME\",\n        \"GET_FILE_NAME\",\n        \"UPLOAD_DB\",\n        \"UPLOAD_AS\",\n        \"CREATE_TABLE\"\n      ]\n    },\n    {\n      \"name\": \"DOWNLOAD\",\n      \"items\": [\n        \"FILE_NAME\",\n        \"GET_FILE_NAME\",\n        \"DOWNLOAD_DB\",\n        \"DOWNLOAD_AS\"\n      ]\n    },\n    {\n      \"name\": \"BROWSER\",\n      \"items\": [\n        \"BROWSER_MESS_TEXT\",\n        \"BROWSER_MESSAGE\",\n        \"SEPARATE_FRAME\",\n        \"APPLET_PARAMS\",\n        \"APPLET_PARAM_BOX\"\n      ]\n    },\n    {\n      \"name\": \"HOST\",\n      \"items\": [\n        \"RUN_HOST\",\n        \"HOST_ASK_FILENAME\",\n        \"BLOCKING_RADIO\"\n      ]\n    },\n    {\n      \"name\": \"C_API\",\n      \"items\": [\n        \"CALL_C_API\",\n        \"LOCKSTATION\"\n      ]\n    },\n    {\n      \"name\": \"ABOUT\",\n      \"items\": [\n        \"ABOUT_BUTTON\"\n      ]\n    },\n    {\n      \"name\": \"CTL\",\n      \"items\": [\n        \"ACKNOWLEDGE\",\n        \"TERMSOFUSE\",\n        \"EXIT1\",\n        \"EXIT2\",\n        \"EXIT3\",\n        \"EXIT4\",\n        \"EXIT5\",\n        \"EXIT6\",\n        \"EXIT7\",\n        \"EXIT8\",\n        \"EXIT9\",\n        \"EXIT10\"\n      ]\n    },\n    {\n      \"name\": \"WEBUTIL\",\n      \"items\": [\n        \"DUMMY\",\n        \"WEBUTIL_CLIENTINFO_FUNCTIONS\",\n        \"WEBUTIL_FILE_FUNCTIONS\",\n        \"WEBUTIL_HOST_FUNCTIONS\",\n        \"WEBUTIL_SESSION_FUNCTIONS\",\n        \"WEBUTIL_FILETRANSFER_FUNCTIONS\",\n        \"WEBUTIL_OLE_FUNCTIONS\",\n        \"WEBUTIL_C_API_FUNCTIONS\",\n        \"WEBUTIL_BROWSER_FUNCTIONS\"\n      ]\n    }\n  ],\n  \"lovs\": []\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0012/PDFVIEWER/PDFVIEWER/ON-LOGON.tgg",
    "content": "BEGIN\nnull;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0012/PDFVIEWER/PDFVIEWER/WHEN-NEW-FORM-INSTANCE.tgg",
    "content": "BEGIN\ndeclare\n   hBean ITEM:= FIND_ITEM('BL.BEAN');\n   timer_id   Timer ;\nbegin\n   fbean.register_bean(hBean, 1, 'com.sun.pdfview.PDFViewer');\n   fbean.invoke( hBean, 1, 'doOpenUrl', 'http://forms12c.com/customer_bvi_eng.pdf');\n   \n   --fbean.invoke( hBean, 1, 'doOpenUrl', 'c:\\\\temp\\\\Musterreport.pdf');\n  \n   fbean.invoke( hBean, 1, 'doThumbs', 'false');\n   timer_id := Create_Timer( 'pageTimer', 10, NO_REPEAT ) ;\nend;  \n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0012/PDFVIEWER/PDFVIEWER/WHEN-TIMER-EXPIRED.tgg",
    "content": "BEGIN\ndeclare\n     hBean ITEM:= FIND_ITEM('BL.BEAN');\nbegin\n   fbean.invoke( hBean, 1, 'forceGotoPage', '0');\nend;  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0012/PDFVIEWER/metadata.json",
    "content": "{\n  \"alerts\": [],\n  \"blocks\": [\n    {\n      \"name\": \"BL\",\n      \"items\": [\n        \"BEAN\"\n      ]\n    }\n  ],\n  \"lovs\": []\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0013/COLOR_SLIDER/BL1/BL1__B__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\n-- Get new value --\n:BL1.VB := Get_Custom_Property( 'BL1.B', 1, 'GETVALUE') ;\n:GLOBAL.Blue := :BL1.VB ;\n\n:GLOBAL.Color := 'r' || :GLOBAL.Red || 'g' || :GLOBAL.Green || 'b' || :GLOBAL.Blue ;\nSet_Item_Property( 'BL1.COLOR', BACKGROUND_COLOR, :GLOBAL.Color ) ;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0013/COLOR_SLIDER/BL1/BL1__G__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\n-- Get new value --\n:BL1.VG := Get_Custom_Property( 'BL1.G', 1, 'GETVALUE') ;\n:GLOBAL.Green := :BL1.VG ;\n:GLOBAL.Color := 'r' || :GLOBAL.Red || 'g' || :GLOBAL.Green || 'b' || :GLOBAL.Blue ;\nSet_Item_Property( 'BL1.COLOR', BACKGROUND_COLOR, :GLOBAL.Color ) ;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0013/COLOR_SLIDER/BL1/BL1__R__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\n-- Get new value --\n:BL1.VR := Get_Custom_Property( 'BL1.R', 1, 'GETVALUE') ;\n:GLOBAL.Red := :BL1.VR ;\n:GLOBAL.Color := 'r' || :GLOBAL.Red || 'g' || :GLOBAL.Green || 'b' || :GLOBAL.Blue ;\nSet_Item_Property( 'BL1.COLOR', BACKGROUND_COLOR, :GLOBAL.Color ) ;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0013/COLOR_SLIDER/BL1/BL1__VB__POST-TEXT-ITEM.tgg",
    "content": "BEGIN\nPKG_SLIDER.Set_Value   ( 'BL1.B', 1, :BL1.VB ) ;\n:GLOBAL.Blue := Ltrim( To_Char( :BL1.B ) ) ;\n:GLOBAL.Color := 'r' || :GLOBAL.Red || 'g' || :GLOBAL.Green || 'b' || :GLOBAL.Blue ;\nSet_Item_Property( 'BL1.COLOR', BACKGROUND_COLOR, :GLOBAL.Color ) ;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0013/COLOR_SLIDER/BL1/BL1__VG__POST-TEXT-ITEM.tgg",
    "content": "BEGIN\nPKG_SLIDER.Set_Value   ( 'BL1.G', 1, :BL1.VG ) ;\n:GLOBAL.Green := Ltrim( To_Char( :BL1.G ) ) ;\n:GLOBAL.Color := 'r' || :GLOBAL.Red || 'g' || :GLOBAL.Green || 'b' || :GLOBAL.Blue ;\nSet_Item_Property( 'BL1.COLOR', BACKGROUND_COLOR, :GLOBAL.Color ) ;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0013/COLOR_SLIDER/BL1/BL1__VR__POST-TEXT-ITEM.tgg",
    "content": "BEGIN\nPKG_SLIDER.Set_Value   ( 'BL1.R', 1, :BL1.VR ) ;\n:GLOBAL.Red := Ltrim( To_Char( :BL1.R ) ) ;\n:GLOBAL.Color := 'r' || :GLOBAL.Red || 'g' || :GLOBAL.Green || 'b' || :GLOBAL.Blue ;\nSet_Item_Property( 'BL1.COLOR', BACKGROUND_COLOR, :GLOBAL.Color ) ;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0013/COLOR_SLIDER/COLOR_SLIDER/ON-LOGON.tgg",
    "content": "BEGIN\nNull ;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0013/COLOR_SLIDER/COLOR_SLIDER/WHEN-NEW-FORM-INSTANCE.tgg",
    "content": "BEGIN\n  --  MDI Title --\n  Set_Window_Property\n  (\n    FORMS_MDI_WINDOW, \n    TITLE, \n    'Oracle Forms 12c - Javabean'\n   ) ;\n\n-- ColorScheme used ? --\n--PKG_SLIDER.GC$CurScheme := PKG_SLIDER.GC$Blaf ;\n\n:GLOBAL.Red   := '0' ;\n:GLOBAL.Green := '0' ;\n:GLOBAL.Blue  := '0' ;\n:GLOBAL.Color := 'r' || :GLOBAL.Red || 'g' || :GLOBAL.Green || 'b' || :GLOBAL.Blue ;\nSet_Item_Property( 'BL1.COLOR', BACKGROUND_COLOR, :GLOBAL.Color ) ;\n\n-- Init the slider properties --\nPKG_SLIDER.Init_Slider ( 'BL1.R', 1, 'V,0,255,32,16' ) ;\nPKG_SLIDER.Set_Value   ( 'BL1.R', 1, 0 ) ;\nPKG_SLIDER.Init_Slider ( 'BL1.G', 1, 'V,0,255,32,16' ) ;\nPKG_SLIDER.Set_Value   ( 'BL1.G', 1, 0 ) ;\nPKG_SLIDER.Init_Slider ( 'BL1.B', 1, 'V,0,255,32,16' ) ;\nPKG_SLIDER.Set_Value   ( 'BL1.B', 1, 0 ) ;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0013/COLOR_SLIDER/PKG_SLIDER.pkb",
    "content": "PACKAGE BODY PKG_SLIDER IS\n  \nPROCEDURE    Init_Slider\n  (\n     PC$Name       IN VARCHAR2,\n     PN$Num        IN PLS_INTEGER,\n     PC$Bounds     IN VARCHAR2\n  )\nIs\n\n      LC$CVBColor   Varchar2(20) := Get_Canvas_Property( Get_Item_Property( PC$Name, ITEM_CANVAS ), BACKGROUND_COLOR ) ;\n      LC$CVFColor   Varchar2(20) := Get_Canvas_Property( Get_Item_Property( PC$Name, ITEM_CANVAS ), FOREGROUND_COLOR ) ;   \n      LC$BGColor    Varchar2(20) := Get_Item_Property(PC$Name, BACKGROUND_COLOR) ;\n      LC$FGColor    Varchar2(20) := Get_Item_Property(PC$Name, FOREGROUND_COLOR) ;      \n      LC$Color      Varchar2(15) ;\n\nBegin \n\n-- BackGround color --\nIf LC$BGColor is not null Then\n  LC$Color := Translate( LC$BGColor, '0123456789gbr','0123456789,,' ) ;\n  Set_Custom_Property( PC$Name, PN$Num, 'SETBGCOLOR', LC$Color ) ;     \nElsif LC$CVBColor is not null Then\n  LC$Color := Translate( LC$CVBColor, '0123456789gbr','0123456789,,' ) ;    \n  Set_Custom_Property( PC$Name, PN$Num, 'SETBGCOLOR', LC$Color ) ;\nElse\n      LC$Color := PKG_SLIDER.GC$CurScheme ;\n      Set_Custom_Property( PC$Name, PN$Num, 'SETBGCOLOR', LC$Color ) ;\nEnd if ;\n\n-- ForeGround color --\nIf LC$FGColor is not null Then\n  LC$Color := Translate( LC$FGColor, '0123456789gbr','0123456789,,' ) ;\n  Set_Custom_Property( PC$Name, PN$Num, 'SETFGCOLOR', LC$Color ) ;\nElsif LC$CVFColor is not null Then\n  LC$Color := Translate( LC$CVFColor, '0123456789gbr','0123456789,,' ) ;    \n  Set_Custom_Property( PC$Name, PN$Num, 'SETBGCOLOR', LC$Color ) ;  \nEnd if ;\n \n-- Bounds --\nSet_Custom_Property( PC$Name, PN$Num, 'SETBOUNDS', PC$Bounds ) ;\n \nEnd ;\n\n-------------------------------------------\n--  Set the current value of the Slider  --\n-------------------------------------------\nPROCEDURE Set_Value\n  (\n     PC$Name       IN VARCHAR2,\n     PN$Num        IN PLS_INTEGER,\n     PN$Value      IN NUMBER\n  )\nIS\n\nBEGIN\n\n  -- Initial value --\n  Set_Custom_Property( PC$Name, PN$Num, 'SETVALUE', To_Char(PN$Value) ) ;\n\n\nEnd Set_Value;\n\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0013/COLOR_SLIDER/PKG_SLIDER.pks",
    "content": "PACKAGE PKG_SLIDER IS\n  \n -- Colorscheme RGB values --\n  GC$Teal      Varchar2(15) := '115,142,140' ;\n  GC$Titanium  Varchar2(15) := '99,101,99' ;\n  GC$Red       Varchar2(15) := '156,130,123' ;  \n  GC$Khaki     Varchar2(15) := '140,142,123' ;        \n  GC$Blue      Varchar2(15) := '90,117,148' ;\n  GC$Olive     Varchar2(15) := '107,113,99' ;  \n  GC$Purple    Varchar2(15) := '123,113,140' ;        \n  GC$Blaf      Varchar2(15) := '247,247,231' ;\n\n  -- Current colorscheme --\n  GC$CurScheme Varchar2(15) := '' ;\n\n\n  PROCEDURE    Init_Slider\n  (\n     PC$Name       IN VARCHAR2,\n     PN$Num        IN PLS_INTEGER,\n     PC$Bounds     IN VARCHAR2\n  ) ;\n\n  PROCEDURE Set_Value\n  (\n     PC$Name       IN VARCHAR2,\n     PN$Num        IN PLS_INTEGER,\n     PN$Value      IN NUMBER\n  ) ;\n \n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0013/COLOR_SLIDER/metadata.json",
    "content": "{\n  \"alerts\": [],\n  \"blocks\": [\n    {\n      \"name\": \"BL1\",\n      \"items\": [\n        \"R\",\n        \"G\",\n        \"B\",\n        \"COLOR\",\n        \"VR\",\n        \"VG\",\n        \"VB\"\n      ]\n    }\n  ],\n  \"lovs\": []\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0014/ACCORDION/ACCORDION/WHEN-NEW-FORM-INSTANCE.tgg",
    "content": "BEGIN\nGO_BLOCK('DEPARTMENTS');\nEXECUTE_QUERY;\nGO_BLOCK('EMPLOYEES');\nEXECUTE_QUERY;\n\nPK_TREE.PR_FILL_TREE;\n\n\nDECLARE\n  lAccordionList PK_ACCORDION.tAccordionList;\n  \n  rAccordion     PK_ACCORDION.tAccordion;\n  \nBEGIN\n  rAccordion.vcCanvas:='CV';\n  rAccordion.vcButton:='B.B';\n  rAccordion.vcExpandedImage:=PK_ACCORDION.VCC_DEFAULT_EXPANDED_IMAGE;\n  rAccordion.vcCollapsedImage:=PK_ACCORDION.VCC_DEFAULT_COLLAPSED_IMAGE;\n  rAccordion.bOpened:=TRUE;\n  lAccordionList(1):=rAccordion;\n\n  rAccordion.vcCanvas:='CV2';\n  rAccordion.vcButton:='B.B2';\n  rAccordion.vcExpandedImage:=PK_ACCORDION.VCC_DEFAULT_EXPANDED_IMAGE;\n  rAccordion.vcCollapsedImage:=PK_ACCORDION.VCC_DEFAULT_COLLAPSED_IMAGE;\n  rAccordion.bOpened:=FALSE;\n  lAccordionList(2):=rAccordion;\n\n  rAccordion.vcCanvas:='CV3';\n  rAccordion.vcButton:='B.B3';\n  rAccordion.vcExpandedImage:=PK_ACCORDION.VCC_DEFAULT_EXPANDED_IMAGE;\n  rAccordion.vcCollapsedImage:=PK_ACCORDION.VCC_DEFAULT_COLLAPSED_IMAGE;\n  rAccordion.bOpened:=FALSE;\n  lAccordionList(3):=rAccordion;\n  \n  rAccordion.vcCanvas:='CV4';\n  rAccordion.vcButton:='B.B4';\n  rAccordion.vcExpandedImage:=PK_ACCORDION.VCC_DEFAULT_EXPANDED_IMAGE;\n  rAccordion.vcCollapsedImage:=PK_ACCORDION.VCC_DEFAULT_COLLAPSED_IMAGE;\n  rAccordion.bOpened:=FALSE;\n  lAccordionList(4):=rAccordion;\n  \n  PK_ACCORDION.PR_INIT_ACCORDION('MAIN', lAccordionList);\nEND;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0014/ACCORDION/B/B__B2__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nPR_INIT_BY_DEPT;\nGO_ITEM('B.B2');\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0014/ACCORDION/B/B__B3__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nPR_INIT_BY_SAL;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0014/ACCORDION/B/B__B4__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nPR_INIT_BY_OTHERS;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0014/ACCORDION/B/B__B__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nPR_INIT_BY_TREE;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0014/ACCORDION/BL_TREE/BL_TREE__IT_TREE__WHEN-TREE-NODE-EXPANDED.tgg",
    "content": "BEGIN\nPK_TREE.PR_WTNE(:SYSTEM.TRIGGER_NODE);\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0014/ACCORDION/BL_TREE/BL_TREE__IT_TREE__WHEN-TREE-NODE-SELECTED.tgg",
    "content": "BEGIN\nPK_TREE.PR_WTNS(:SYSTEM.TRIGGER_NODE);\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0014/ACCORDION/DEPARTMENTS/DEPARTMENTS__WHEN-NEW-RECORD-INSTANCE.tgg",
    "content": "BEGIN\nPR_INIT_BY_DEPT;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0014/ACCORDION/OTHRS/OTHRS__EMAIL__WHEN-CHECKBOX-CHANGED.tgg",
    "content": "BEGIN\nPR_INIT_BY_OTHERS;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0014/ACCORDION/PK_ACCORDION.pkb",
    "content": "PACKAGE BODY PK_ACCORDION IS\n\n  TYPE tList IS TABLE OF tAccordionList INDEX BY VARCHAR2(30);\n  lList tList;\n\n  -- --------------------------------------------------------------------------------------\n \n  PROCEDURE PR_INIT_ACCORDION(i_vcAccordionGroup IN VARCHAR2, i_lAccordionList IN tAccordionList) IS\n    vcPrior VARCHAR2(4000);\n    vcNext  VARCHAR2(4000);\n  BEGIN\n    lList(i_vcAccordionGroup):=i_lAccordionList;\n    FOR i IN 1..i_lAccordionList.COUNT LOOP\n      -- prior Accordion-entry\n      IF i>1 THEN\n        vcPrior:=i_lAccordionList(i-1).vcButton;\n      ELSE\n        vcPrior:='.';\n      END IF;\n      -- following Accordion-entries\n      IF i<i_lAccordionList.COUNT THEN\n        vcNext:=i_lAccordionList(i+1).vcButton;\n      ELSE\n        vcNext:='.';\n      END IF;\n      SET_CUSTOM_ITEM_PROPERTY(i_lAccordionList(i).vcButton, 'INIT_ACCORDION', i_lAccordionList(i).vcButton || '|' ||\n                                                                               CASE WHEN i_lAccordionList(i).bOpened THEN \n                                                                                 'J'\n                                                                               ELSE\n                                                                                 'N'\n                                                                               END     || '|' ||  \n                                                                               vcPrior || '|' ||  \n                                                                               vcNext  || '|' ||\n                                                                               NVL(i_lAccordionList(i).vcExpandedImage, '.')  || '|' ||\n                                                                               NVL(i_lAccordionList(i).vcCollapsedImage, '.') || '|'\n                              );\n    END LOOP;\n    SYNCHRONIZE;\n    -- Make first item scale, it will delegate to others\n    SET_CUSTOM_ITEM_PROPERTY(i_lAccordionList(1).vcButton, 'SCALE_ACCORDION', ' ');\n  END;\n \n  -- --------------------------------------------------------------------------------------\n \n  PROCEDURE PR_ACTIVATE(i_vcAccordionGroup IN VARCHAR2, i_vcCanvas IN VARCHAR2) IS\n    lAccordionList tAccordionList;\n  BEGIN\n    IF lList.EXISTS(i_vcAccordionGroup) THEN\n      lAccordionList:=lList(i_vcAccordionGroup);\n      FOR i IN 1..lAccordionList.COUNT LOOP\n        IF lAccordionList(i).vcCanvas=i_vcCanvas THEN\n          SET_CUSTOM_ITEM_PROPERTY(lAccordionList(i).vcButton, 'ACTIVATE', ' ');\n          EXIT;\n        END IF;\n      END LOOP;\n    END IF;\n  END;\n    \n  -- --------------------------------------------------------------------------------------\n \n  PROCEDURE PR_GO_ITEM(i_vcItem IN VARCHAR2) IS\n    lAccordionList tAccordionList;\n    vcCanvas       VARCHAR2(100);\n    vcGroup        VARCHAR2(30);\n    itId           ITEM;\n  BEGIN\n    -- find the item canvas --\n    itId:=FIND_ITEM(i_vcItem);\n    IF NOT ID_NULL(itId) THEN\n      vcCanvas:=GET_ITEM_PROPERTY(itId, ITEM_CANVAS ) ;\n      -- find the accordion group --\n      vcGroup:=lList.FIRST ;\n      LOOP\n        EXIT WHEN vcGroup IS NULL;\n        lAccordionList:=lList(vcGroup); \n        FOR i IN 1..lAccordionList.COUNT LOOP\n          IF UPPER(lAccordionList(i).vcCanvas) = vcCanvas THEN\n            PR_ACTIVATE(vcGroup, vcCanvas);\n            GO_ITEM(i_vcItem);\n            RETURN;\n          END IF;\n        END LOOP;\n        vcGroup:=lList.NEXT(vcGroup) ;\n      END LOOP;\n    END IF;\n  END;\n   \n  -- --------------------------------------------------------------------------------------\n \n  PROCEDURE PR_GO_BLOCK(i_vcBlock IN VARCHAR2) IS\n    lAccordionList tAccordionList;\n    vcCanvas       VARCHAR2(100);\n    vcGroup        VARCHAR2(30);\n    vcItem         VARCHAR2(61);\n    blId           BLOCK;\n    bOk            BOOLEAN:= FALSE ;\n  BEGIN\n    -- find the canvas --\n    blId := FIND_BLOCK(i_vcBlock);\n    IF NOT ID_NULL(blId) THEN\n      vcItem:= GET_BLOCK_PROPERTY(blId, FIRST_ITEM);\n      LOOP\n        vcCanvas:= GET_ITEM_PROPERTY(vcItem, ITEM_CANVAS ) ;\n        IF vcCanvas IS NOT NULL THEN\n          bOk:=TRUE;\n          EXIT;\n        END IF ; \n        vcItem:= GET_ITEM_PROPERTY(vcItem, NEXTITEM ) ;\n        EXIT WHEN vcItem IS NULL;\n      END LOOP;\n      IF bOk THEN\n        -- find the accordion group --\n        vcGroup:=lList.FIRST;\n        LOOP\n          EXIT WHEN vcGroup IS NULL;\n          lAccordionList:=lList(vcGroup); \n          FOR i IN 1..lAccordionList.COUNT LOOP\n            If UPPER(lAccordionList(i).vcCanvas)=vcCanvas THEN\n              PR_ACTIVATE(vcGroup, vcCanvas);\n              GO_BLOCK(i_vcBlock);\n              RETURN;\n            END IF;\n          END LOOP;\n          vcGroup:=lList.NEXT(vcGroup);\n        END LOOP; \n      END IF;\n    END IF ;\n  END PR_GO_BLOCK;  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0014/ACCORDION/PK_ACCORDION.pks",
    "content": "PACKAGE PK_ACCORDION IS\n/** \n    \n    This is just sample code, its free to use.\n    It is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n    The code relies on the internal structure of forms when rendering stacked canvases\n    It is tested against Forms 10.1.2.0.2, but may stop working with any patch or future version of forms\n\n    Sample code for a forms-Side Package for the Accordion Java-Bean\n\n    To build up an accordion, follow these steps\n    \n    -Create as many stacked canvases as you want to have accordion-canvases\n    -Create a Button on each canvas at position 0,0 with the full width of the canvas and\n     set the Implementation class for that buttons to forms.AccordionButton\n    -Arrange these canvases on one content canvas, so that all canvases are placed beneath each other\n     +The viewport for one canvas should be so that the canvas is fully shown\n     +The viewport for all other canvases should be so that just the button is visible.\n     \n    -Initialize the Accordion in the WHEN-NEW-FORM-INSTANCE-trigger with code lik\n    \n      DECLARE\n        lAccordionList PK_ACCORDION.tAccordionList;\n        rAccordion     PK_ACCORDION.tAccordion;\n      BEGIN\n        rAccordion.vcCanvas:='CANVAS1';\n        rAccordion.vcButton:='BLOCK.BUTTON1';\n        rAccordion.vcExpandedImage:=PK_ACCORDION.VCC_DEFAULT_EXPANDED_IMAGE;\n        rAccordion.vcCollapsedImage:=PK_ACCORDION.VCC_DEFAULT_COLLAPSED_IMAGE;\n        rAccordion.bOpened:=TRUE;\n        lAccordionList(1):=rAccordion;\n  \n        rAccordion.vcCanvas:='CANVAS2';\n        rAccordion.vcButton:='BLOCK.BUTTON2';\n        rAccordion.vcExpandedImage:=PK_ACCORDION.VCC_DEFAULT_EXPANDED_IMAGE;\n        rAccordion.vcCollapsedImage:=PK_ACCORDION.VCC_DEFAULT_COLLAPSED_IMAGE;\n        rAccordion.bOpened:=FALSE;\n        lAccordionList(2):=rAccordion;\n  \n        PK_ACCORDION.PR_INIT_ACCORDION('MAIN', lAccordionList);\n      END;\n    \n    -make sure the jar is on the archive or achive_jini-tag    \n    \n*/\n  -- constants used for Default-Images conatined in the jar-file\n  VCC_DEFAULT_EXPANDED_IMAGE  CONSTANT VARCHAR2(30):='DEFAULT_EXPANDED';\n  VCC_DEFAULT_COLLAPSED_IMAGE CONSTANT VARCHAR2(30):='DEFAULT_COLLAPSED';\n  \n  -- Type which describes one Accordion\n  TYPE tAccordion IS RECORD (\n    vcCanvas         VARCHAR2(30), -- the Canvas which represents the Accordion-area\n    vcButton         VARCHAR2(61), -- the \"Activation\"-button on that canvas which is used to activate the Accordion\n    vcExpandedImage  VARCHAR2(255),-- image-name for Expanded-state, image must be accessible by forms\n    vcCollapsedImage VARCHAR2(255),-- image-name for Collapsed-state, image must be accessible by forms\n    bOpened          BOOLEAN       -- Flag, if this accordion is the one that is displayed at startup\n                                      -- Must match the canvas. The canvases area beneath the button is taken\n                                      -- as the area which is given to other accordions when opened\n  );\n  \n  -- Table-Type of Accordion-records\n  TYPE tAccordionList IS TABLE OF tAccordion INDEX BY BINARY_INTEGER;\n  \n  /** Initialization-method for an accordion group\n      i_vcAccordionGroup indicates a logical name. It gives the capability of having several Accordion-groups inside one form.\n      i_lAccordionList   is a list of the Accordion-entries which belong to the accordion-group\n  */    \n  PROCEDURE PR_INIT_ACCORDION(i_vcAccordionGroup IN VARCHAR2, i_lAccordionList IN tAccordionList);\n  \n  /** method to activate a specific accordion programmatically\n      i_vcAccordionGroup indicates a logical name. Must be a name which has been initialized via PR_INIT_ACCORDION before\n      i_vcCanvas         is the name of the canvas in one of the accordion-entries in the group\n  */    \n  PROCEDURE PR_ACTIVATE(i_vcAccordionGroup IN VARCHAR2, i_vcCanvas IN VARCHAR2);\n\n  /** method to go to an item placed on an accordion-canvas.\n      i_vcItem Name of the item which should get the focus\n      \n      Thanks to Francois Degrelle for supplying the code\n  */    \n  PROCEDURE PR_GO_ITEM(i_vcItem IN VARCHAR2);\n\n  /** method to go to a block the first item of which is placed on an accordion-canvas.\n      i_vcBlock Name of the block which should get the focus\n      \n      Thanks to Francois Degrelle for supplying the code\n  */    \n  PROCEDURE PR_GO_BLOCK(i_vcBlock IN VARCHAR2);\n \n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0014/ACCORDION/PK_TREE.pkb",
    "content": "PACKAGE BODY PK_TREE IS\n \n  itTree ITEM:=FIND_ITEM('BL_TREE.IT_TREE');\n \n  FUNCTION FK_ADD_NODE(i_ndMaster IN FTree.NODE,\n                       i_vcValue  IN VARCHAR2,\n                       i_vcLabel  IN VARCHAR2,\n                       i_vcIcon   IN VARCHAR2 DEFAULT NULL,\n                       i_nState   IN NUMBER DEFAULT Ftree.EXPANDED_NODE\n                      )\n  RETURN Ftree.NODE IS\n  BEGIN\n    RETURN Ftree.Add_Tree_Node(itTree,\n                               i_ndMaster,\n                               Ftree.PARENT_OFFSET,\n                               Ftree.LAST_CHILD,\n                               i_nState,\n                               i_vcLabel,\n                               i_vcIcon,\n                               i_vcValue);\n  END;\n \n  PROCEDURE PR_QUERY_DETAILS(i_ndMaster   IN Ftree.NODE,\n                             i_nManagerId IN NUMBER) IS\n    CURSOR crDetails IS\n      SELECT EMPLOYEE_ID VALUE,\n             LAST_NAME || ', ' ||FIRST_NAME LABEL\n        FROM EMPLOYEES\n       WHERE MANAGER_ID=i_nManagerId\n       ORDER BY LAST_NAME;\n    nd FTree.NODE;\n  BEGIN\n    FOR rec IN crDetails LOOP\n      -- add the node with a negative id\n      nd:=FK_ADD_NODE(i_ndMaster, -rec.VALUE , rec.LABEL);\n      -- don't add details here\n    END LOOP;\n  END;\n \n \n  PROCEDURE PR_FILL_TREE IS\n    CURSOR crTop IS\n      SELECT EMPLOYEE_ID VALUE,\n             LAST_NAME || ', ' ||FIRST_NAME LABEL\n        FROM EMPLOYEES\n       WHERE MANAGER_ID IS NULL\n       ORDER BY LAST_NAME;\n    nd FTree.NODE;\n  BEGIN\n    Ftree.DELETE_TREE_NODE(itTree, FTree.ROOT_NODE);\n    FOR rec IN crTop LOOP\n      -- add the node with a negative id\n      nd:=FK_ADD_NODE(Ftree.ROOT_NODE, -rec.VALUE , rec.LABEL, NULL, FTree.COLLAPSED_NODE);\n      -- don't add details here\n    END LOOP;\n  END;\n \n  PROCEDURE PR_WTNE(i_ndNode IN Ftree.NODE) IS\n    nValue   NUMBER;\n    ndDetail FTree.NODE;\n  BEGIN\n    -- Get the value of the node to be expanded\n    nValue:=FTree.GET_TREE_NODE_PROPERTY(itTree, i_ndNode, Ftree.NODE_VALUE);\n    IF nValue<0 THEN\n      -- value is negative, then we have to read the details\n      PR_QUERY_DETAILS(i_ndNode, ABS(nValue));\n      -- Now set the value of the node to positive, so that at next expansion we won't re-read the details\n      FTree.SET_TREE_NODE_PROPERTY(itTree, i_ndNode, Ftree.NODE_VALUE, ABS(nValue));\n      ndDetail:=FTree.FIND_TREE_NODE(itTree,'',FTREE.FIND_NEXT, FTREE.NODE_LABEL,i_ndNode,i_ndNode);  \n      -- if there we're no details, set node as lead,\n      IF Ftree.ID_NULL(ndDetail) THEN\n        FTree.SET_TREE_NODE_PROPERTY(itTree, i_ndNode, Ftree.NODE_STATE, FTree.EXPANDED_NODE);    \n      ELSE\n        -- otherwise set node to expanded\n        FTree.SET_TREE_NODE_PROPERTY(itTree, i_ndNode, Ftree.NODE_STATE, FTree.EXPANDED_NODE);    \n      END IF;\n    END IF; \n  END;\n\n  PROCEDURE PR_WTNS(i_ndNode IN Ftree.NODE) IS\n    nValue NUMBER;  \n  BEGIN\n    IF :SYSTEM.TRIGGER_NODE_SELECTED='TRUE' THEN\n      -- Get the Employee-id, remeber that we made it negative\n      nValue:=ABS(FTree.GET_TREE_NODE_PROPERTY(itTree, i_ndNode, Ftree.NODE_VALUE));\n      IF nValue IS NOT NULL THEN\n        :OTHRS.TREE_WHERE:='MANAGER_ID=' || TO_CHAR(nValue);\n      ELSE               \n        :OTHRS.TREE_WHERE:=NULL;\n      END IF;\n      PR_INIT_BY_TREE;\n    END IF;\n  END;\n \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0014/ACCORDION/PK_TREE.pks",
    "content": "PACKAGE PK_TREE IS\n  \n  PROCEDURE PR_FILL_TREE;\n  \n  PROCEDURE PR_WTNS(i_ndNode IN Ftree.NODE);\n  \n  PROCEDURE PR_WTNE(i_ndNode IN Ftree.NODE);\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0014/ACCORDION/PR_INIT_BY_DEPT.pcd",
    "content": "PROCEDURE PR_INIT_BY_DEPT IS\nBEGIN\n  SET_BLOCK_PROPERTY('EMPLOYEES', ONETIME_WHERE, 'DEPARTMENT_ID=' || :DEPARTMENTS.DEPARTMENT_ID);\n  GO_BLOCK('EMPLOYEES');\n  EXECUTE_QUERY;\n  GO_BLOCK('DEPARTMENTS');\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0014/ACCORDION/PR_INIT_BY_OTHERS.pcd",
    "content": "PROCEDURE PR_INIT_BY_OTHERS IS\nBEGIN\n  SET_BLOCK_PROPERTY('EMPLOYEES', ONETIME_WHERE, :OTHRS.EMAIL);\n  GO_BLOCK('EMPLOYEES');\n  EXECUTE_QUERY;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0014/ACCORDION/PR_INIT_BY_SAL.pcd",
    "content": "PROCEDURE PR_INIT_BY_SAL IS\nBEGIN\n  SET_BLOCK_PROPERTY('EMPLOYEES', ONETIME_WHERE, :SAL.SAL);\n  GO_BLOCK('EMPLOYEES');\n  EXECUTE_QUERY;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0014/ACCORDION/PR_INIT_BY_TREE.pcd",
    "content": "PROCEDURE PR_INIT_BY_TREE IS\nBEGIN\n  SET_BLOCK_PROPERTY('EMPLOYEES', ONETIME_WHERE, :OTHRS.TREE_WHERE);\n  GO_BLOCK('EMPLOYEES');\n  EXECUTE_QUERY;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0014/ACCORDION/SAL/SAL__SAL__WHEN-RADIO-CHANGED.tgg",
    "content": "BEGIN\nPR_INIT_BY_SAL;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0014/ACCORDION/metadata.json",
    "content": "{\n  \"alerts\": [],\n  \"blocks\": [\n    {\n      \"name\": \"EMPLOYEES\",\n      \"items\": [\n        \"EMPLOYEE_ID\",\n        \"FIRST_NAME\",\n        \"LAST_NAME\",\n        \"EMAIL\",\n        \"JOB_ID\",\n        \"SALARY\",\n        \"COMMISSION_PCT\",\n        \"DEPARTMENT_ID\"\n      ]\n    },\n    {\n      \"name\": \"DEPARTMENTS\",\n      \"items\": [\n        \"DEPARTMENT_ID\",\n        \"DEPARTMENT_NAME\"\n      ]\n    },\n    {\n      \"name\": \"BL_TREE\",\n      \"items\": [\n        \"IT_TREE\"\n      ]\n    },\n    {\n      \"name\": \"B\",\n      \"items\": [\n        \"B\",\n        \"B2\",\n        \"B3\",\n        \"B4\"\n      ]\n    },\n    {\n      \"name\": \"SAL\",\n      \"items\": [\n        \"SAL\"\n      ]\n    },\n    {\n      \"name\": \"OTHRS\",\n      \"items\": [\n        \"TREE_WHERE\",\n        \"EMAIL\"\n      ]\n    }\n  ],\n  \"lovs\": []\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0014/ACCORDION2/ACCORDION2/WHEN-NEW-FORM-INSTANCE.tgg",
    "content": "BEGIN\nDECLARE\n  lAccordionList PK_ACCORDION.tAccordionList;\n  \n  rAccordion     PK_ACCORDION.tAccordion;\n  \nBEGIN\n  rAccordion.vcCanvas:='CV1';\n  rAccordion.vcButton:='B.BT1';\n  rAccordion.vcExpandedImage:='down.png';\n  rAccordion.vcCollapsedImage:='toright.png';\n  rAccordion.bOpened:=TRUE;\n  lAccordionList(1):=rAccordion;\n\n  rAccordion.vcCanvas:='CV2';\n  rAccordion.vcButton:='B.BT2';\n  rAccordion.vcExpandedImage:='down.png';\n  rAccordion.vcCollapsedImage:='toright.png';\n  rAccordion.bOpened:=FALSE;\n  lAccordionList(2):=rAccordion;\n\n  rAccordion.vcCanvas:='CV3';\n  rAccordion.vcButton:='B.BT3';\n  rAccordion.vcExpandedImage:='down.png';\n  rAccordion.vcCollapsedImage:='toright.png';\n  rAccordion.bOpened:=FALSE;\n  lAccordionList(3):=rAccordion;\n  \n  PK_ACCORDION.PR_INIT_ACCORDION('LEFT', lAccordionList);\n\n  rAccordion.vcCanvas:='CV4';\n  rAccordion.vcButton:='B.BT4';\n  rAccordion.vcExpandedImage:='down.png';\n  rAccordion.vcCollapsedImage:='toright.png';\n  rAccordion.bOpened:=TRUE;\n  lAccordionList(1):=rAccordion;\n\n  rAccordion.vcCanvas:='CV5';\n  rAccordion.vcButton:='B.BT5';\n  rAccordion.vcExpandedImage:='down.png';\n  rAccordion.vcCollapsedImage:='toright.png';\n  rAccordion.bOpened:=FALSE;\n  lAccordionList(2):=rAccordion;\n\n  rAccordion.vcCanvas:='CV6';\n  rAccordion.vcButton:='B.BT6';\n  rAccordion.vcExpandedImage:='down.png';\n  rAccordion.vcCollapsedImage:='toright.png';\n  rAccordion.bOpened:=FALSE;\n  lAccordionList(3):=rAccordion;\n  \n  PK_ACCORDION.PR_INIT_ACCORDION('MIDDLE', lAccordionList);\n\n  rAccordion.vcCanvas:='CV7';\n  rAccordion.vcButton:='B.BT7';\n  rAccordion.vcExpandedImage:='down.png';\n  rAccordion.vcCollapsedImage:='toright.png';\n  rAccordion.bOpened:=TRUE;\n  lAccordionList(1):=rAccordion;\n\n  rAccordion.vcCanvas:='CV8';\n  rAccordion.vcButton:='B.BT8';\n  rAccordion.vcExpandedImage:='down.png';\n  rAccordion.vcCollapsedImage:='toright.png';\n  rAccordion.bOpened:=FALSE;\n  lAccordionList(2):=rAccordion;\n\n  rAccordion.vcCanvas:='CV9';\n  rAccordion.vcButton:='B.BT9';\n  rAccordion.vcExpandedImage:='down.png';\n  rAccordion.vcCollapsedImage:='toright.png';\n  rAccordion.bOpened:=FALSE;\n  lAccordionList(3):=rAccordion;\n  \n  PK_ACCORDION.PR_INIT_ACCORDION('RIGHT', lAccordionList);\n\nEND;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0014/ACCORDION2/PK_ACCORDION.pkb",
    "content": "PACKAGE BODY PK_ACCORDION IS\n\n  TYPE tList IS TABLE OF tAccordionList INDEX BY VARCHAR2(30);\n  lList tList;\n\n  -- --------------------------------------------------------------------------------------\n \n  PROCEDURE PR_INIT_ACCORDION(i_vcAccordionGroup IN VARCHAR2, i_lAccordionList IN tAccordionList) IS\n    vcPrior VARCHAR2(4000);\n    vcNext  VARCHAR2(4000);\n  BEGIN\n    lList(i_vcAccordionGroup):=i_lAccordionList;\n    FOR i IN 1..i_lAccordionList.COUNT LOOP\n      -- prior Accordion-entry\n      IF i>1 THEN\n        vcPrior:=i_lAccordionList(i-1).vcButton;\n      ELSE\n        vcPrior:='.';\n      END IF;\n      -- following Accordion-entries\n      IF i<i_lAccordionList.COUNT THEN\n        vcNext:=i_lAccordionList(i+1).vcButton;\n      ELSE\n        vcNext:='.';\n      END IF;\n      SET_CUSTOM_ITEM_PROPERTY(i_lAccordionList(i).vcButton, 'INIT_ACCORDION', i_lAccordionList(i).vcButton || '|' ||\n                                                                               CASE WHEN i_lAccordionList(i).bOpened THEN \n                                                                                 'J'\n                                                                               ELSE\n                                                                                 'N'\n                                                                               END     || '|' ||  \n                                                                               vcPrior || '|' ||  \n                                                                               vcNext  || '|' ||\n                                                                               NVL(i_lAccordionList(i).vcExpandedImage, '.')  || '|' ||\n                                                                               NVL(i_lAccordionList(i).vcCollapsedImage, '.') || '|'\n                              );\n    END LOOP;\n    SYNCHRONIZE;\n    -- Make first item scale, it will delegate to others\n    SET_CUSTOM_ITEM_PROPERTY(i_lAccordionList(1).vcButton, 'SCALE_ACCORDION', ' ');\n  END;\n \n  -- --------------------------------------------------------------------------------------\n \n  PROCEDURE PR_ACTIVATE(i_vcAccordionGroup IN VARCHAR2, i_vcCanvas IN VARCHAR2) IS\n    lAccordionList tAccordionList;\n  BEGIN\n    IF lList.EXISTS(i_vcAccordionGroup) THEN\n      lAccordionList:=lList(i_vcAccordionGroup);\n      FOR i IN 1..lAccordionList.COUNT LOOP\n        IF lAccordionList(i).vcCanvas=i_vcCanvas THEN\n          SET_CUSTOM_ITEM_PROPERTY(lAccordionList(i).vcButton, 'ACTIVATE', ' ');\n          EXIT;\n        END IF;\n      END LOOP;\n    END IF;\n  END;\n    \n  -- --------------------------------------------------------------------------------------\n \n  PROCEDURE PR_GO_ITEM(i_vcItem IN VARCHAR2) IS\n    lAccordionList tAccordionList;\n    vcCanvas       VARCHAR2(100);\n    vcGroup        VARCHAR2(30);\n    itId           ITEM;\n  BEGIN\n    -- find the item canvas --\n    itId:=FIND_ITEM(i_vcItem);\n    IF NOT ID_NULL(itId) THEN\n      vcCanvas:=GET_ITEM_PROPERTY(itId, ITEM_CANVAS ) ;\n      -- find the accordion group --\n      vcGroup:=lList.FIRST ;\n      LOOP\n        EXIT WHEN vcGroup IS NULL;\n        lAccordionList:=lList(vcGroup); \n        FOR i IN 1..lAccordionList.COUNT LOOP\n          IF UPPER(lAccordionList(i).vcCanvas) = vcCanvas THEN\n            PR_ACTIVATE(vcGroup, vcCanvas);\n            GO_ITEM(i_vcItem);\n            RETURN;\n          END IF;\n        END LOOP;\n        vcGroup:=lList.NEXT(vcGroup) ;\n      END LOOP;\n    END IF;\n  END;\n   \n  -- --------------------------------------------------------------------------------------\n \n  PROCEDURE PR_GO_BLOCK(i_vcBlock IN VARCHAR2) IS\n    lAccordionList tAccordionList;\n    vcCanvas       VARCHAR2(100);\n    vcGroup        VARCHAR2(30);\n    vcItem         VARCHAR2(61);\n    blId           BLOCK;\n    bOk            BOOLEAN:= FALSE ;\n  BEGIN\n    -- find the canvas --\n    blId := FIND_BLOCK(i_vcBlock);\n    IF NOT ID_NULL(blId) THEN\n      vcItem:= GET_BLOCK_PROPERTY(blId, FIRST_ITEM);\n      LOOP\n        vcCanvas:= GET_ITEM_PROPERTY(vcItem, ITEM_CANVAS ) ;\n        IF vcCanvas IS NOT NULL THEN\n          bOk:=TRUE;\n          EXIT;\n        END IF ; \n        vcItem:= GET_ITEM_PROPERTY(vcItem, NEXTITEM ) ;\n        EXIT WHEN vcItem IS NULL;\n      END LOOP;\n      IF bOk THEN\n        -- find the accordion group --\n        vcGroup:=lList.FIRST;\n        LOOP\n          EXIT WHEN vcGroup IS NULL;\n          lAccordionList:=lList(vcGroup); \n          FOR i IN 1..lAccordionList.COUNT LOOP\n            If UPPER(lAccordionList(i).vcCanvas)=vcCanvas THEN\n              PR_ACTIVATE(vcGroup, vcCanvas);\n              GO_BLOCK(i_vcBlock);\n              RETURN;\n            END IF;\n          END LOOP;\n          vcGroup:=lList.NEXT(vcGroup);\n        END LOOP; \n      END IF;\n    END IF ;\n  END PR_GO_BLOCK;  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0014/ACCORDION2/PK_ACCORDION.pks",
    "content": "PACKAGE PK_ACCORDION IS\n/** \n    \n    This is just sample code, its free to use.\n    It is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n    The code relies on the internal structure of forms when rendering stacked canvases\n    It is tested against Forms 10.1.2.0.2, but may stop working with any patch or future version of forms\n\n    Sample code for a forms-Side Package for the Accordion Java-Bean\n\n    To build up an accordion, follow these steps\n    \n    -Create as many stacked canvases as you want to have accordion-canvases\n    -Create a Button on each canvas at position 0,0 with the full width of the canvas and\n     set the Implementation class for that buttons to forms.AccordionButton\n    -Arrange these canvases on one content canvas, so that all canvases are placed beneath each other\n     +The viewport for one canvas should be so that the canvas is fully shown\n     +The viewport for all other canvases should be so that just the button is visible.\n     \n    -Initialize the Accordion in the WHEN-NEW-FORM-INSTANCE-trigger with code lik\n    \n      DECLARE\n        lAccordionList PK_ACCORDION.tAccordionList;\n        rAccordion     PK_ACCORDION.tAccordion;\n      BEGIN\n        rAccordion.vcCanvas:='CANVAS1';\n        rAccordion.vcButton:='BLOCK.BUTTON1';\n        rAccordion.vcExpandedImage:=PK_ACCORDION.VCC_DEFAULT_EXPANDED_IMAGE;\n        rAccordion.vcCollapsedImage:=PK_ACCORDION.VCC_DEFAULT_COLLAPSED_IMAGE;\n        rAccordion.bOpened:=TRUE;\n        lAccordionList(1):=rAccordion;\n  \n        rAccordion.vcCanvas:='CANVAS2';\n        rAccordion.vcButton:='BLOCK.BUTTON2';\n        rAccordion.vcExpandedImage:=PK_ACCORDION.VCC_DEFAULT_EXPANDED_IMAGE;\n        rAccordion.vcCollapsedImage:=PK_ACCORDION.VCC_DEFAULT_COLLAPSED_IMAGE;\n        rAccordion.bOpened:=FALSE;\n        lAccordionList(2):=rAccordion;\n  \n        PK_ACCORDION.PR_INIT_ACCORDION('MAIN', lAccordionList);\n      END;\n    \n    -make sure the jar is on the archive or achive_jini-tag    \n    \n*/\n  -- constants used for Default-Images conatined in the jar-file\n  VCC_DEFAULT_EXPANDED_IMAGE  CONSTANT VARCHAR2(30):='DEFAULT_EXPANDED';\n  VCC_DEFAULT_COLLAPSED_IMAGE CONSTANT VARCHAR2(30):='DEFAULT_COLLAPSED';\n  \n  -- Type which describes one Accordion\n  TYPE tAccordion IS RECORD (\n    vcCanvas         VARCHAR2(30), -- the Canvas which represents the Accordion-area\n    vcButton         VARCHAR2(61), -- the \"Activation\"-button on that canvas which is used to activate the Accordion\n    vcExpandedImage  VARCHAR2(255),-- image-name for Expanded-state, image must be accessible by forms\n    vcCollapsedImage VARCHAR2(255),-- image-name for Collapsed-state, image must be accessible by forms\n    bOpened          BOOLEAN       -- Flag, if this accordion is the one that is displayed at startup\n                                      -- Must match the canvas. The canvases area beneath the button is taken\n                                      -- as the area which is given to other accordions when opened\n  );\n  \n  -- Table-Type of Accordion-records\n  TYPE tAccordionList IS TABLE OF tAccordion INDEX BY BINARY_INTEGER;\n  \n  /** Initialization-method for an accordion group\n      i_vcAccordionGroup indicates a logical name. It gives the capability of having several Accordion-groups inside one form.\n      i_lAccordionList   is a list of the Accordion-entries which belong to the accordion-group\n  */    \n  PROCEDURE PR_INIT_ACCORDION(i_vcAccordionGroup IN VARCHAR2, i_lAccordionList IN tAccordionList);\n  \n  /** method to activate a specific accordion programmatically\n      i_vcAccordionGroup indicates a logical name. Must be a name which has been initialized via PR_INIT_ACCORDION before\n      i_vcCanvas         is the name of the canvas in one of the accordion-entries in the group\n  */    \n  PROCEDURE PR_ACTIVATE(i_vcAccordionGroup IN VARCHAR2, i_vcCanvas IN VARCHAR2);\n\n  /** method to go to an item placed on an accordion-canvas.\n      i_vcItem Name of the item which should get the focus\n      \n      Thanks to Francois Degrelle for supplying the code\n  */    \n  PROCEDURE PR_GO_ITEM(i_vcItem IN VARCHAR2);\n\n  /** method to go to a block the first item of which is placed on an accordion-canvas.\n      i_vcBlock Name of the block which should get the focus\n      \n      Thanks to Francois Degrelle for supplying the code\n  */    \n  PROCEDURE PR_GO_BLOCK(i_vcBlock IN VARCHAR2);\n \n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0014/ACCORDION2/metadata.json",
    "content": "{\n  \"alerts\": [],\n  \"blocks\": [\n    {\n      \"name\": \"B\",\n      \"items\": [\n        \"BT1\",\n        \"BT2\",\n        \"BT3\",\n        \"BT4\",\n        \"BT5\",\n        \"BT6\",\n        \"BT7\",\n        \"BT8\",\n        \"BT9\"\n      ]\n    }\n  ],\n  \"lovs\": []\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0015/MODERNIZE/CONTROL/CONTROL__CHECK_BOX_BACK_COLOR__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nif get_item_property('CONTROL.CHECK_BOX_1',BACKGROUND_COLOR) = 'r251g230b174' then\n  set_item_property('CONTROL.CHECK_BOX_1',BACKGROUND_COLOR,'automatic');\n  set_item_property('CONTROL.CHECK_BOX_2',BACKGROUND_COLOR,'automatic');\nelse\n  set_item_property('CONTROL.CHECK_BOX_1',BACKGROUND_COLOR,'r251g230b174');\n  set_item_property('CONTROL.CHECK_BOX_2',BACKGROUND_COLOR,'r251g230b174');\nend if;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0015/MODERNIZE/CONTROL/CONTROL__ERROR_STACK__WHEN-CUSTOM-ITEM-EVENT.tgg",
    "content": "BEGIN\nDECLARE\n  ev  VARCHAR2(20);\n  pl  ParamList;\n  ty  number;\n  id  varchar2(40);\n  btn number;\n  alt alert;\nBEGIN\n  ev := :SYSTEM.Custom_Item_Event;\n  case ev\n  when 'Clicked' then\n    btn := show_alert('CLICKED');\n  when 'ButtonClicked' then\n    pl := get_parameter_list(:SYSTEM.Custom_Item_Event_Parameters);\n    get_parameter_attr(pl, 'ErrorId', ty, id);\n    alt := find_alert('BTN_CLICKED');\n    SET_ALERT_PROPERTY(alt, alert_message_text, 'You clicked the icon button for id ' || id); \n    btn := show_alert(alt);\n  else\n    null;\n  end case;\nend;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0015/MODERNIZE/CONTROL/CONTROL__RADIO_BACK_COLOR__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nif get_item_property('CONTROL.RADIO_BUTTON_1',BACKGROUND_COLOR) = 'r251g230b174' then\n  set_item_property('CONTROL.RADIO_BUTTON_1',BACKGROUND_COLOR,'automatic');\nelse\n  set_item_property('CONTROL.RADIO_BUTTON_1',BACKGROUND_COLOR,'r251g230b174');\nend if;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0015/MODERNIZE/CONTROL/CONTROL__SHOW_ERROR__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nset_custom_property('ERROR_STACK',all_rows,'ShowError','20:ERR-00020:This is the text of error 20...');\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0015/MODERNIZE/CONTROL/CONTROL__SHOW_INFO__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nset_custom_property('ERROR_STACK',all_rows,'ShowInfo','30:INF-00030:This is the text of info 30...');\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0015/MODERNIZE/CONTROL/CONTROL__SHOW_WARNING__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nset_custom_property('ERROR_STACK',all_rows,'ShowWarning','21:WAR-00021:This is the text of warning 21...');\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0015/MODERNIZE/CONTROL/CONTROL__TEXT_FIELD_BACK_COLOR__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nif get_item_property('CONTROL.TEXT_FIELD_1',BACKGROUND_COLOR) = 'r251g230b174' then\n  set_item_property('CONTROL.TEXT_FIELD_1',BACKGROUND_COLOR,'automatic');\n  set_item_property('CONTROL.TEXT_FIELD_2',BACKGROUND_COLOR,'automatic');\n  set_item_property('CONTROL.DATE_FIELD',BACKGROUND_COLOR,'automatic');\n  set_item_property('CONTROL.DATE_TIME_FIELD',BACKGROUND_COLOR,'automatic');\nelse\n  set_item_property('CONTROL.TEXT_FIELD_1',BACKGROUND_COLOR,'r251g230b174');\n  set_item_property('CONTROL.TEXT_FIELD_2',BACKGROUND_COLOR,'r251g230b174');\n  set_item_property('CONTROL.DATE_FIELD',BACKGROUND_COLOR,'r251g230b174');\n  set_item_property('CONTROL.DATE_TIME_FIELD',BACKGROUND_COLOR,'r251g230b174');\nend if;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0015/MODERNIZE/CONTROL/CONTROL__TEXT_FIELD_ENABLE__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nif get_item_property('CONTROL.TEXT_FIELD_1',ENABLED) = 'TRUE' then\n  set_item_property('CONTROL.TEXT_FIELD_1',ENABLED,PROPERTY_FALSE);\n  set_item_property('CONTROL.TEXT_FIELD_2',ENABLED,PROPERTY_FALSE);\n  set_item_property('CONTROL.DATE_FIELD',ENABLED,PROPERTY_FALSE);\n  set_item_property('CONTROL.DATE_TIME_FIELD',ENABLED,PROPERTY_FALSE);\n  set_item_property('CONTROL.TEXT_FIELD_ENABLE',LABEL,'Enable fields');\nelse\n  set_item_property('CONTROL.TEXT_FIELD_1',ENABLED,PROPERTY_TRUE);\n  set_item_property('CONTROL.TEXT_FIELD_2',ENABLED,PROPERTY_TRUE);\n  set_item_property('CONTROL.DATE_FIELD',ENABLED,PROPERTY_TRUE);\n  set_item_property('CONTROL.DATE_TIME_FIELD',ENABLED,PROPERTY_TRUE);\n  set_item_property('CONTROL.TEXT_FIELD_ENABLE',LABEL,'Disable fields');\nend if;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0015/MODERNIZE/CONTROL/CONTROL__WHEN-NEW-RECORD-INSTANCE.tgg",
    "content": "BEGIN\nset_custom_property('HTML_FIELD',all_rows,'SetText',\n'<h1>HTML Ipsum Presents</h1>\n\n<p><strong>Pellentesque habitant morbi tristique</strong> senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. <em>Aenean ultricies mi vitae est.</em> Mauris placerat eleifend leo. Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, <code>commodo vitae</code>, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros ipsum rutrum orci, sagittis tempus lacus enim ac dui. <a href=\"#\">Donec non enim</a> in turpis pulvinar facilisis. Ut felis.</p>\n\n<h2>Header Level 2</h2>\n\n<ol>\n   <li>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</li>\n   <li>Aliquam tincidunt mauris eu risus.</li>\n</ol>\n\n<blockquote><p>Lorem ipsum dolor sit amet, <font style=\"color:red\">consectetur adipiscing elit</font>. Vivamus magna. Cras in mi at felis aliquet congue. Ut a est eget ligula molestie gravida. Curabitur massa. Donec eleifend, libero at sagittis mollis, tellus est malesuada tellus, at luctus turpis elit sit amet quam. Vivamus pretium ornare est.</p></blockquote>\n\n<h3>Header Level 3</h3>\n\n<ul>\n   <li>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</li>\n   <li>Aliquam tincidunt mauris eu risus.</li>\n</ul>\n\n<pre><code>\n#header h1 a {\n  display: block;\n  width: 300px;\n  height: 80px;\n}\n</code></pre>'\n);\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0015/MODERNIZE/MODERNIZE/WHEN-WINDOW-CLOSED.tgg",
    "content": "BEGIN\nexit_form;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0015/MODERNIZE/RecordGroups/LOV9.sql",
    "content": "select 'A' key,'Item A' value from dual\nunion all\nselect 'B','Item B' from dual\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0015/MODERNIZE/metadata.json",
    "content": "{\n  \"alerts\": [\n    \"CLICKED\",\n    \"BTN_CLICKED\"\n  ],\n  \"blocks\": [\n    {\n      \"name\": \"CONTROL\",\n      \"items\": [\n        \"ERROR_STACK\",\n        \"TEXT_FIELD_1\",\n        \"TEXT_FIELD_2\",\n        \"DATE_FIELD\",\n        \"DATE_TIME_FIELD\",\n        \"TEXT_FIELD_BACK_COLOR\",\n        \"TEXT_FIELD_ENABLE\",\n        \"CHECK_BOX_1\",\n        \"CHECK_BOX_2\",\n        \"CHECK_BOX_BACK_COLOR\",\n        \"RADIO_BUTTON_1\",\n        \"RADIO_BACK_COLOR\",\n        \"SHOW_ERROR\",\n        \"SHOW_WARNING\",\n        \"SHOW_INFO\",\n        \"HTML_FIELD\"\n      ]\n    }\n  ],\n  \"lovs\": [\n    \"LOV9\"\n  ]\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0016/CHK_CBOX3/C/C__CBOX__KEY-NEXT-ITEM.tgg",
    "content": "BEGIN\ndeclare\n\nBEGIN\n  \n   synchronize;\n  \n   if get_view_property('CBX',VISIBLE) = 'TRUE' \n     and length(:label) > 0 \n     and upper (:label) <> upper (:cbox)\n   then\n     go_item('label');\n     set_item_property('c.cbox',enabled,property_false);\n   else\n     pkg_CBOX.prc_kni;\n   end if;  \n   \n  \nEND;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0016/CHK_CBOX3/C/C__CBOX__POST-CHANGE.tgg",
    "content": "BEGIN\ndeclare\nmytimer timer;\nbegin\n\nif :parameter.par1 is not null\n  then\n    if get_view_property('CBX',VISIBLE) = 'TRUE' \n       and not abs(length(:cbox) - length(:dummy))= 1\n      then\n        :cbox := :parameter.par1;\n        :parameter.par1 := null;\n        mytimer := create_timer('xxx',1,NO_REPEAT);\n      else\n        :parameter.par1 := null;\n    end if;    \nend if;   \nend;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0016/CHK_CBOX3/C/C__CBOX__WHEN-LIST-CHANGED.tgg",
    "content": "BEGIN\ndeclare pre_dummy varchar2(30) := :dummy;\n\nBEGIN\n   pkg_CBOX.prc_wlc('C.CBOX');\n\n   if get_view_property('CBX',VISIBLE) = 'TRUE' \n     and length(:label) > 0 \n     and upper (:label) <> upper (:cbox)\n   then\n     :dummy := :cbox;\n     if nvl(pre_dummy,' ') <> :dummy \n       then\n         :parameter.par1 := :dummy;\n      else\n         :parameter.par1 := null;\n       end if;  \n       \n   end if;\n  \nEND;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0016/CHK_CBOX3/C/C__DUMMY__KEY-NEXT-ITEM.tgg",
    "content": "BEGIN\ngo_item('C.CBOX');\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0016/CHK_CBOX3/C/C__DUMMY__KEY-PREV-ITEM.tgg",
    "content": "BEGIN\ngo_item('C.CBOX');\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0016/CHK_CBOX3/CBX/CBX__LABEL__KEY-NEXT-ITEM.tgg",
    "content": "BEGIN\n\nBEGIN\n  \n   set_item_property('c.cbox',enabled,property_true);\n   pkg_CBOX.prc_kni;\n  \nEND;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0016/CHK_CBOX3/CBX/CBX__LABEL__KEY-PREV-ITEM.tgg",
    "content": "BEGIN\nset_item_property('c.cbox',enabled,property_true);\n:cbox := null;\ngo_item('C.CBOX');\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0016/CHK_CBOX3/CBX/CBX__LABEL__WHEN-MOUSE-CLICK.tgg",
    "content": "BEGIN\n\nBEGIN\n   \n    set_item_property('c.cbox',enabled,property_true);\n    pkg_Cbox.prc_labelclick;\n    \nEND;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0016/CHK_CBOX3/CBX/CBX__ON-ERROR.tgg",
    "content": "BEGIN\nBEGIN\n  \n  -- ignore --\n  NULL;\n  \nEND;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0016/CHK_CBOX3/CHK_CBOX3/WHEN-NEW-BLOCK-INSTANCE.tgg",
    "content": "BEGIN\n/*\n * Quasi AutoComplete ComboBox with native PL/SQL.\n * 29.01.2018 - Friedhold.Matz@yahoo.com\n *\n */\nBEGIN\n  \n   set_window_property('WINDOW1', TITLE, 'Autocomplete Combo Box - PoC [chk_cbox3 v03.01.20180129]');\n                       \n   pkg_CBOX.populate_auto_cbox('CBOX','select name,name from europecities order by 1');\n\nEND;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0016/CHK_CBOX3/CHK_CBOX3/WHEN-TIMER-EXPIRED.tgg",
    "content": "BEGIN\ngo_item('label');\nset_item_property('c.cbox',enabled,property_false);\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0016/CHK_CBOX3/PKG_CBOX.pkb",
    "content": "PACKAGE BODY pkg_cbox IS\n  /*\n   * Author:   Friedhold Matz : http://friedhold-matz.blogspot.com/\n   * Created:  05.08.2007\n   * Modified: 16.09.2007\n   * Modified: 29.01.2018\n   *\n   */\n   \n  -- Module variables --\n  m_CBOX    VARCHAR2(100);\n  m_nxtitem VARCHAR2(100);\n--------------------------------------------------------------------------------\n  PROCEDURE prc_show(p_s VARCHAR2) IS\n    al_button PLS_INTEGER;\n    al_id     Alert;\n  BEGIN\n     al_id:= FIND_ALERT('INFO'); \n    SET_ALERT_PROPERTY(al_id, ALERT_MESSAGE_TEXT, p_s ); \n    al_button := SHOW_ALERT( al_id ); \n  END prc_show;\n--------------------------------------------------------------------------------\n  PROCEDURE populate_auto_cbox (p_list_item varchar2, p_sql_stat varchar2)IS\n     rgid recordgroup;\n     rcnt number;\n     rgname constant varchar2(30):= get_item_property(p_list_item,item_name);\n     l_x number(10);\n     l_y number(10);\n  BEGIN\n    -- fix setting : 29.01.2018 - CBOX . --\n    m_CBOX   := 'C.CBOX';\n    m_nxtitem:= 'C.DUMMY';\n    rgid:=find_group(rgname);\n    IF id_null(rgid) THEN\n        rgid:= create_group_from_query (rgname, p_sql_stat); \n    end if;\n    rcnt:=populate_group(rgid);\n    IF rcnt=0 THEN \n        populate_list(p_list_item,rgid);\n        --copy(get_list_element_value(list_item,1),list_item);\n    END IF;\n    --delete_group(rgid);\n    hide_view('CBX');\n    EXCEPTION WHEN others THEN\n        prc_show('$$$ Module pkg_Cbox.populate_auto_cbox: '||sqlerrm);\n  END populate_auto_cbox;\n--------------------------------------------------------------------------------\n  PROCEDURE prc_wlc(p_cbox varchar2) IS\n     list_id        ITEM;\n     list_count    NUMBER;\n     current_value  VARCHAR2(250);\n     l_found       BOOLEAN := FALSE;\n     rgid2         RECORDGROUP;\n     gcid2         GROUPCOLUMN; \n  BEGIN\n  -- set active CBOX --\n  IF pkg_CBOX.m_cbox IS NULL then\n     IF p_cbox<>:SYSTEM.cursor_item THEN\n        prc_show('$$$ Error in pkg_cbox.prc_wlc: Definition of CBOX.'||sqlerrm);\n      END IF;\n      pkg_CBOX.m_cbox:= :SYSTEM.cursor_item;  \n  END IF;\n  --prc_show(pkg_CBOX.g_cbox);  \n  IF length(name_in(pkg_CBOX.m_cbox))>1 THEN\n     go_item('LABEL');\n     -- prc_show(name_in(pkg_CBOX.m_cbox));\n  END IF;\n  IF name_in(pkg_CBOX.m_cbox) IS NULL THEN\n     hide_view('CBX');\n     RETURN;\n  END IF;\n    \n  list_id:=FIND_ITEM(pkg_CBOX.m_cbox);\n  list_count := GET_LIST_ELEMENT_COUNT(list_id);\n \n  go_block('CBX');\n  clear_block;\n    \n  FOR i IN 1..list_count LOOP\n    current_value := GET_LIST_ELEMENT_VALUE(list_id, i); \n    IF UPPER(:CBOX)= UPPER(substr(current_value,1,length(name_in(pkg_CBOX.m_cbox)))) then    \n       l_found:= TRUE;   \n       :CBX.LABEL:= current_value;\n       next_record;    \n    END IF;   \n  END LOOP;\n  \n  go_item(pkg_CBOX.m_cbox);\n\n  -- fill \n  IF l_found THEN     \n     go_item('CBX.LABEL');\n     show_view('CBX');\n     go_record(1); \n     :CBOX_SAVE:=:CBOX;  \n     IF name_in(pkg_CBOX.m_cbox)=:CBX.LABEL THEN\n         go_item(pkg_CBOX.m_nxtitem);\n        hide_view('CBX');\n        copy(Name_IN(pkg_CBOX.m_cbox), pkg_CBOX.m_nxtitem);\n     END IF;\n  ELSE\n     -- 29.01.2018 - F.Matz --\n     -- not defined value: wait-finish(<TAB>|<ENTER>) --\n     --prc_show('Value not found.');\n     RETURN;  \n  END IF;  \n  \n  go_item(pkg_CBOX.m_cbox);\n  \n  EXCEPTION\n  WHEN OTHERS THEN \n      prc_show('$$$ Module pkg_Cbox.prc_wlc: '|| sqlerrm);\n  END prc_wlc;\n-------------------------------------------------------------------------------- \n  PROCEDURE prc_kni IS\n  BEGIN\n     IF :CBX.LABEL IS NOT NULL THEN\n         copy(:CBX.LABEL, pkg_CBOX.m_cbox);\n         copy(Name_IN(pkg_CBOX.m_cbox), pkg_CBOX.m_nxtitem);\n      END IF;\n     go_item(pkg_CBOX.m_nxtitem);\n     hide_view('CBX'); \n      -- copy into next_item --\n     copy(Name_IN(pkg_CBOX.m_cbox), pkg_CBOX.m_nxtitem);\n  END prc_kni;\n--------------------------------------------------------------------------------\n  PROCEDURE prc_labelclick IS\n  BEGIN\n     :CBOX:= :CBX.LABEL;\n     go_item(pkg_CBOX.m_CBOX);\n     hide_view('CBX');\n     -- copy into nex_item --\n     copy(Name_IN(pkg_CBOX.m_cbox), pkg_CBOX.m_nxtitem);\n  END prc_labelclick;\n--------------------------------------------------------------------------------\n\n BEGIN\n     NULL;\n    \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0016/CHK_CBOX3/PKG_CBOX.pks",
    "content": "PACKAGE pkg_cbox IS\n  \n  PROCEDURE prc_show(p_s varchar2);\n  PROCEDURE populate_auto_cbox (p_list_item varchar2, p_sql_stat varchar2);\n  PROCEDURE prc_wlc(p_cbox varchar2);\n  PROCEDURE prc_kni;\n  PROCEDURE prc_labelclick;\n  \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0016/CHK_CBOX3/metadata.json",
    "content": "{\n  \"alerts\": [\n    \"INFO\"\n  ],\n  \"blocks\": [\n    {\n      \"name\": \"C\",\n      \"items\": [\n        \"CBOX\",\n        \"DUMMY\"\n      ]\n    },\n    {\n      \"name\": \"CBX\",\n      \"items\": [\n        \"LABEL\",\n        \"ELEMENT\",\n        \"CBOX_SAVE\"\n      ]\n    }\n  ],\n  \"lovs\": []\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0017/POC_ACCOUNT/BLK_ACCOUNT/BLK_ACCOUNT__ANSWER__WHEN-NEW-ITEM-INSTANCE.tgg",
    "content": "BEGIN\n\nBEGIN\n  \n  pkg_item.prc_Enter;\n\nEND W_N_I_INSTANCE;\n \n \n\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0017/POC_ACCOUNT/BLK_ACCOUNT/BLK_ACCOUNT__ANSWER__WHEN-VALIDATE-ITEM.tgg",
    "content": "BEGIN\n\nBEGIN\n  \n  pkg_item.prc_Leave;\n\nEND W_V_ITEM;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0017/POC_ACCOUNT/BLK_ACCOUNT/BLK_ACCOUNT__BT_COMMIT__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\nDECLARE\n  l_res VARCHAR2(256);\nBEGIN\n  \n  SYNCHRONIZE;\n  \n  l_res:= pkg_Item.fnc_final_check;\n  IF l_res='OK' THEN\n     prc_info(' User account is completed. ');\n  ELSE\n     prc_info(' User account is not completed. '||chr(10)||l_res);\n  END IF;\n  \nEND;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0017/POC_ACCOUNT/BLK_ACCOUNT/BLK_ACCOUNT__CLOSE__WHEN-MOUSE-CLICK.tgg",
    "content": "BEGIN\n\nBEGIN\n  \n   DO_KEY('EXIT');\n    \nEND;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0017/POC_ACCOUNT/BLK_ACCOUNT/BLK_ACCOUNT__EMAIL2__WHEN-NEW-ITEM-INSTANCE.tgg",
    "content": "BEGIN\n\nBEGIN\n  \n  pkg_item.prc_Enter;\n\nEND W_N_I_INSTANCE;\n \n \n\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0017/POC_ACCOUNT/BLK_ACCOUNT/BLK_ACCOUNT__EMAIL2__WHEN-VALIDATE-ITEM.tgg",
    "content": "BEGIN\n\nBEGIN\n  \n  pkg_item.prc_Leave;\n\nEND W_V_ITEM;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0017/POC_ACCOUNT/BLK_ACCOUNT/BLK_ACCOUNT__EMAIL__WHEN-NEW-ITEM-INSTANCE.tgg",
    "content": "BEGIN\n\nBEGIN\n  \n  pkg_item.prc_Enter;\n\nEND W_N_I_INSTANCE;\n \n \n\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0017/POC_ACCOUNT/BLK_ACCOUNT/BLK_ACCOUNT__EMAIL__WHEN-VALIDATE-ITEM.tgg",
    "content": "BEGIN\n\nBEGIN\n  \n  pkg_item.prc_Leave;\n\nEND W_V_ITEM;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0017/POC_ACCOUNT/BLK_ACCOUNT/BLK_ACCOUNT__FULLNAME__WHEN-NEW-ITEM-INSTANCE.tgg",
    "content": "BEGIN\n\nBEGIN\n  \n  pkg_item.prc_Enter;\n\nEND W_N_I_INSTANCE;\n \n \n\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0017/POC_ACCOUNT/BLK_ACCOUNT/BLK_ACCOUNT__FULLNAME__WHEN-VALIDATE-ITEM.tgg",
    "content": "BEGIN\n\nBEGIN\n  \n  pkg_item.prc_Leave;\n\nEND W_V_ITEM;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0017/POC_ACCOUNT/BLK_ACCOUNT/BLK_ACCOUNT__PASSWORD_RETRY__WHEN-NEW-ITEM-INSTANCE.tgg",
    "content": "BEGIN\n\nBEGIN\n  \n  pkg_item.prc_Enter;\n\nEND W_N_I_INSTANCE;\n \n \n\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0017/POC_ACCOUNT/BLK_ACCOUNT/BLK_ACCOUNT__PASSWORD_RETRY__WHEN-VALIDATE-ITEM.tgg",
    "content": "BEGIN\n\nBEGIN\n  \n  pkg_item.prc_Leave;\n\nEND W_V_ITEM;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0017/POC_ACCOUNT/BLK_ACCOUNT/BLK_ACCOUNT__PASSWORD__WHEN-NEW-ITEM-INSTANCE.tgg",
    "content": "BEGIN\n\nBEGIN\n  \n  pkg_item.prc_Enter;\n\nEND W_N_I_INSTANCE;\n \n \n\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0017/POC_ACCOUNT/BLK_ACCOUNT/BLK_ACCOUNT__PASSWORD__WHEN-VALIDATE-ITEM.tgg",
    "content": "BEGIN\n\nBEGIN\n  \n  pkg_item.prc_Leave;\n\nEND W_V_ITEM;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0017/POC_ACCOUNT/BLK_ACCOUNT/BLK_ACCOUNT__QUERY__WHEN-NEW-ITEM-INSTANCE.tgg",
    "content": "BEGIN\n\nBEGIN\n  \n  pkg_item.prc_Enter;\n\nEND W_N_I_INSTANCE;\n \n \n\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0017/POC_ACCOUNT/BLK_ACCOUNT/BLK_ACCOUNT__QUERY__WHEN-VALIDATE-ITEM.tgg",
    "content": "BEGIN\n\nBEGIN\n  \n  pkg_item.prc_Leave;\n\nEND W_V_ITEM;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0017/POC_ACCOUNT/BLK_ACCOUNT/BLK_ACCOUNT__START_DEMO__WHEN-MOUSE-CLICK.tgg",
    "content": "BEGIN\n\nBEGIN\n    prc_chk_item_sequence;\n  \nEND;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0017/POC_ACCOUNT/BLK_ACCOUNT/BLK_ACCOUNT__USERNAME__WHEN-NEW-ITEM-INSTANCE.tgg",
    "content": "BEGIN\nBEGIN\n  pkg_item.prc_Enter;\nEND W_N_I_INSTANCE;\n\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0017/POC_ACCOUNT/BLK_ACCOUNT/BLK_ACCOUNT__USERNAME__WHEN-VALIDATE-ITEM.tgg",
    "content": "BEGIN\nBEGIN\n  pkg_item.prc_Leave;\nEND W_V_ITEM;\n\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0017/POC_ACCOUNT/FNC_MSG_QUERY.fun",
    "content": "FUNCTION fnc_msg_query(p_msg VARCHAR2) RETURN VARCHAR2 IS\n   l_button PLS_INTEGER;\n   l_id     Alert;\n   l_res VARCHAR2(32);\nBEGIN\n   l_id:= FIND_ALERT('QUERY'); \n    SET_ALERT_PROPERTY(l_id, ALERT_MESSAGE_TEXT, p_msg ); \n   l_button := SHOW_ALERT( l_id ); \n   IF l_button = ALERT_BUTTON1 THEN\n         l_res := 'YES';\n      ELSIF l_button = ALERT_BUTTON2 THEN\n         l_res := 'NO';\n      ELSE\n         l_res := 'CANCEL';\n   END IF;\n      \n   RETURN(l_res);\n  \nEND fnc_msg_query;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0017/POC_ACCOUNT/FNC_VALIDATE.fun",
    "content": "FUNCTION fnc_validate (p_item VARCHAR2) RETURN VARCHAR2 IS\n\n  -- Friedhold Matz - 2018-FEB\n  \n  l_vres VARCHAR2(256);\nBEGIN  \n  IF p_item='EMAIL' THEN\n     IF regexp_like(:BLK_ACCOUNT.EMAIL, \n        '([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})')\n        THEN\n         RETURN('OK');\n     ELSE\n          RETURN('$$$ Error: '|| pkg_Item.item_name('EMAIL').msg ||' $$$');\n     END IF;\n  ELSIF p_item='EMAIL2' THEN\n     IF LOWER(:BLK_ACCOUNT.EMAIL)=LOWER(:BLK_ACCOUNT.EMAIL2) THEN\n         RETURN('$$$ Error: eMail2 is the same as eMail ! $$$');\n     END IF;\n     IF regexp_like(:BLK_ACCOUNT.EMAIL2, \n        '([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})')\n       THEN\n         RETURN('OK');\n     ELSE\n          RETURN('$$$ Error: '|| pkg_Item.item_name('EMAIL2').msg ||' $$$');\n     END IF;\n  ELSIF p_item='PASSWORD' THEN\n     IF :BLK_ACCOUNT.PASSWORD<>pkg_Item.item_name('PASSWORD').text THEN\n        l_vres:=v#r#fy_pw$001(:BLK_ACCOUNT.USERNAME,:BLK_ACCOUNT.PASSWORD);\n        IF l_vres='OK' THEN\n            RETURN('OK');\n        ELSE\n           RETURN(l_vres);\n        END IF;\n     ELSE\n        RETURN('$$$ Error: Username and Password are not completed ! $$$');\n     END IF;\n  ELSIF p_item='PASSWORD_RETRY' THEN\n     IF :PASSWORD<>:PASSWORD_RETRY THEN\n         RETURN('$$$ Error: Passwords are not identical ! $$$');\n     END IF;\n  END IF;\n  \n  RETURN('OK');\n  \nEXCEPTION WHEN OTHERS THEN\n  RETURN('$$$ EXCEPTION in fnc_validate) - item: '||p_item||' : '||sqlerrm);\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0017/POC_ACCOUNT/PKG_ITEM.pkb",
    "content": "PACKAGE BODY pkg_Item IS\n\n-- Friedhold Matz - 2018-FEB\n  \n-----------------------------------------------------------------------------------\n-- private procs / funcs --\n-----------------------------------------------------------------------------------\nPROCEDURE prc_enable_item (p_item VARCHAR2) IS\nBEGIN\n   -- display items only ! --\n   Set_Item_Property(p_item , VISIBLE, PROPERTY_TRUE); \n   -- Set_Item_Property(p_item , ENABLED, PROPERTY_TRUE);  \n   \nEND prc_enable_item;\n-----------------------------------------------------------------------------------\nPROCEDURE sleep (p_x NUMBER) IS\n   x NUMBER;\nBEGIN\n   --FOR i IN 1..p_x LOOP\n   --    x:= POWER(2, 100);\n   --    SYNCHRONIZE;\n   --END LOOP;\n   -- FHOFFMANN Changed because the server calculates to slow.\n   dbms_lock.sleep(1);\n   synchronize;\nEND sleep;\n-----------------------------------------------------------------------------------\nFUNCTION fnc_get_txtnnullc (p_bit VARCHAR2, p_txt VARCHAR2)RETURN VARCHAR2 IS\nBEGIN\n   IF pkg_Item.item_name(p_bit).notnull='YES' THEN\n       RETURN(p_txt||' *');\n   ELSE\n       RETURN(p_txt);\n   END IF;\nEND fnc_get_txtnnullc;\n-----------------------------------------------------------------------------------\nFUNCTION fnc_sign_msg (p_txt VARCHAR2) RETURN VARCHAR2 IS\nBEGIN\n   CASE p_txt \n       WHEN 'LIGHT'  THEN RETURN('VA_TXT_LIGHT_MSG'); \n       WHEN 'MEDIUM' THEN RETURN('VA_TXT_MEDIUM_MSG'); \n       WHEN 'STRONG' THEN RETURN('VA_TXT_STRONG_MSG'); \n   ELSE\n      RETURN('VA_TXT_ERROR_MSG');\n   END CASE; \n\nEND fnc_sign_msg;\n-----------------------------------------------------------------------------------\n\n-----------------------------------------------------------------------------------\n-- global procs / funcs --\n-----------------------------------------------------------------------------------\nPROCEDURE prc_Enter IS\n   l_blk    VARCHAR2(32);\n   l_fit     VARCHAR2(32);\n   l_bit     VARCHAR2(32);\nBEGIN      \n   l_fit:= :SYSTEM.CURSOR_ITEM;  \n   -- get blank item name --\n   l_bit:= substr(l_fit, instr(l_fit,'.')+1, length(l_fit)-instr(l_fit,'.'));  \n   l_blk:= pkg_Item.item_name(l_bit).block;\n   -- clear item --\n   COPY(NULL, l_fit); \n   -- clear msg  --\n   COPY(NULL, l_blk||'.'||'MSG_'||l_bit);\n   -- activate underline      --\n   Set_Item_Property(l_blk||'.'||'UNDER_'||l_bit, VISUAL_ATTRIBUTE, 'VA_UL_ACTIVE');  \n   -- activate label          --\n   prc_enable_item(l_blk||'.'||'LABEL_'||l_bit);\n   Set_Item_Property(l_blk||'.'||'LABEL_'||l_bit, VISUAL_ATTRIBUTE, 'VA_TXT_LABEL_ACTIVE');   \n   -- deactivate msg --\n   Set_Item_Property(l_blk||'.'||'MSG_'||l_bit , VISIBLE, PROPERTY_FALSE);  \n   -- activate input property --  \n   Set_Item_Property(l_fit , VISUAL_ATTRIBUTE, 'VA_TEXT');   \n   --\n   IF pkg_Item.item_name(l_bit).type='SECURE' THEN\n      -- hide text --\n      Set_item_Property(l_blk||'.'||l_bit, ECHO, PROPERTY_FALSE);        \n   END IF; \n   \n  EXCEPTION WHEN OTHERS THEN\n     prc_info('$$$ EXCEPTION in pkg_Item.prc_Enter: '||sqlerrm);    \nEND prc_Enter;\n-----------------------------------------------------------------------------------\nPROCEDURE prc_Leave IS\n  l_blk      VARCHAR2(32);\n  l_fit      VARCHAR2(32);\n  l_bit      VARCHAR2(32);\n  l_it_value VARCHAR2(64);\n  l_vres     VARCHAR2(512);  \nBEGIN    \n  l_fit      := :SYSTEM.CURSOR_ITEM; \n  l_it_value := NAME_IN(l_fit); \n  l_bit      := substr(l_fit, instr(l_fit,'.')+1, length(l_fit)-instr(l_fit,'.'));  \n  l_blk      := pkg_Item.item_name(l_bit).block;\n  \n  IF l_it_value IS NULL OR l_it_value=pkg_Item.item_name(l_bit).text THEN      \n     COPY(pkg_Item.item_name(l_bit).text, l_fit);\n     COPY(pkg_Item.item_name(l_bit).label, l_blk||'.'||'LABEL_'||l_fit);  \n     -- underline to empty  --\n      Set_Item_Property(l_blk||'.'||'UNDER_'||l_bit , VISUAL_ATTRIBUTE, 'VA_UL_EMPTY');        \n     -- deactivate label    --\n     Set_Item_Property(l_blk||'.'||'LABEL_'||l_bit , VISIBLE, PROPERTY_FALSE);  \n     --\n     IF pkg_Item.item_name(l_bit).type='SECURE' THEN\n        -- hide text --\n        Set_item_Property(l_blk||'.'||l_bit, ECHO, PROPERTY_TRUE);        \n     END IF;    \n     -- activate insert property --  \n     Set_Item_Property(l_fit , VISUAL_ATTRIBUTE, 'VA_TEXT_INSERT');     \n     \n   ELSE\n     l_vres:= fnc_validate(l_bit);\n     IF substr(l_vres,1,3)<>'$$$' THEN\n         IF l_vres NOT IN ('OK', 'LIGHT', 'MEDIUM', 'STRONG') THEN\n            Set_Item_Property(l_blk||'.'||'LABEL_'||l_bit , VISUAL_ATTRIBUTE, 'VA_TXT_LABEL_ERROR');  \n            -- underline to error full  --\n            prc_enable_item(l_blk||'.'||'UNDER_'||l_bit);\n             Set_Item_Property(l_blk||'.'||'UNDER_'||l_bit, VISUAL_ATTRIBUTE, 'VA_UL_ERROR'); \n            COPY(l_vres, l_blk||'.'||'MSG_'||l_bit);\n            -- Set_Item_Property(pkg_Item.item_name(l_bit).block||'.'||'MSG_'||l_bit , VISUAL_ATTRIBUTE, fnc_sign_msg(l_vres));\n            prc_enable_item(l_blk||'.'||'MSG_'||l_bit);\n         ELSE\n            Set_Item_Property(l_blk||'.'||'LABEL_'||l_bit , VISUAL_ATTRIBUTE, 'VA_TXT_LABEL_OK');\n            prc_enable_item(l_blk||'.'||'UNDER_'||l_bit);\n             Set_Item_Property(l_blk||'.'||'UNDER_'||l_bit , VISUAL_ATTRIBUTE, 'VA_UL_FULL'); \n             IF l_vres<>'OK' THEN\n                prc_enable_item(l_blk||'.'||'MSG_'||l_bit);\n                Set_Item_Property(l_blk||'.'||'MSG_'||l_bit , VISUAL_ATTRIBUTE, fnc_sign_msg(l_vres));\n                COPY(l_vres, l_blk||'.'||'MSG_'||l_bit);\n             END IF;\n         END IF;\n      ELSE\n         prc_enable_item(l_blk||'.'||'LABEL_'||l_bit);   \n         Set_Item_Property(l_blk||'.'||'LABEL_'||l_bit , VISUAL_ATTRIBUTE, 'VA_TXT_LABEL_ERROR');\n        -- underline to error full  --\n         prc_enable_item(l_blk||'.'||'UNDER_'||l_bit);\n         Set_Item_Property(l_blk||'.'||'UNDER_'||l_bit, VISUAL_ATTRIBUTE, 'VA_UL_ERROR'); \n         -- error msg -- \n        COPY(l_vres, l_blk||'.'||'MSG_'||l_bit);\n        prc_enable_item(l_blk||'.'||'MSG_'||l_bit);  \n        Set_Item_Property(l_blk||'.'||'MSG_'||l_bit , VISUAL_ATTRIBUTE, 'VA_TXT_ERROR_MSG');         \n     END IF;    \n  END IF; \n  \n  EXCEPTION WHEN OTHERS THEN\n     prc_info('$$$ EXCEPTION in pkg_Item.prc_Leave: '||sqlerrm);   \nEND prc_Leave;\n-----------------------------------------------------------------------------------\nFUNCTION fnc_final_check RETURN VARCHAR2 IS\n   l_value VARCHAR2(64);\nBEGIN\n   FOR i IN 1.. pkg_Item.item_ix.count LOOP\n        l_value:= NAME_IN(pkg_Item.item_ix(i).name);\n       IF (l_value IS NULL AND pkg_Item.item_ix(i).notnull='YES') OR \n           -- item label text ? --\n           (l_value=pkg_Item.item_ix(i).text AND pkg_Item.item_ix(i).notnull='YES') OR\n           -- item error message ? --\n           substr(NAME_IN(pkg_Item.item_name(pkg_Item.item_ix(i).name).block||'.'||\n                          'MSG_'||pkg_Item.item_ix(i).name),1,3)='$$$' THEN          \n           RETURN('Item: '|| pkg_Item.item_ix(i).name);\n       END IF;      \n   END LOOP;\n   \n   RETURN('OK'); \n\n EXCEPTION WHEN OTHERS THEN\n     prc_info('$$$ EXCEPTION in pkg_Item.fnc_final_check: '||sqlerrm);      \nEND fnc_final_check;\n-----------------------------------------------------------------------------------\nPROCEDURE prc_chk_item (p_block VARCHAR2, p_item VARCHAR2, p_value VARCHAR2, p_result VARCHAR2 DEFAULT NULL ) IS\n   l_res VARCHAR2(16);  \nBEGIN  \n   go_item(p_block||'.'||p_item);\n   IF  p_value='GO' THEN \n       RETURN;\n   ELSIF p_value='PRESS' THEN\n        Execute_Trigger('WHEN-BUTTON-PRESSED');  \n        sleep(100);\n   ELSE \n        -- setter & getter item values --\n       Execute_Trigger('WHEN-NEW-ITEM-INSTANCE');  \n       Copy(p_value, p_block||'.'||p_item);\n       Execute_Trigger('WHEN-VALIDATE-ITEM');     \n       sleep(150);      \n          \n       -- check expected/real result -- \n       l_res:='OK';\n       IF (substr(NAME_IN(pkg_Item.item_name(p_item).block||'.'||'MSG_'||p_item) ,1,3)='$$$') THEN\n           l_res:='NOK';\n       END IF;\n       IF (l_res='NOK' AND p_result='OK') OR\n          ( (Name_In('MSG_'||p_item) IS NULL OR l_res='OK') AND p_result='NOK' )\n          THEN\n            prc_info('$$$ Error in automatic test sequence :: '||chr(10)||\n                     'Item: '||p_item||chr(10)||\n                     'Value:'||p_value||chr(10)||\n                     'Result expected: '||p_result||chr(10)||\n                     'Result real: '||l_res||chr(10)||' $$$');\n          RETURN;\n       END IF;       \n       -- compare values : setter=getter ? --\n       IF Name_In(pkg_Item.item_name(p_item).block||'.'||p_item)<>p_value THEN\n           prc_info('$$$ Error in automatic test sequence :: '||chr(10)||\n                    'Item: '||p_item||chr(10)||\n                    'Value expected: '||p_value||chr(10)||\n                    'Value real: '||Name_In(pkg_Item.item_name(p_item).block||'.'||p_item)||chr(10)||' $$$');\n       END IF;   \n   END IF; \n\n  EXCEPTION WHEN OTHERS THEN\n     prc_info('$$$ Exception in pkg_Item.prc_chk_Item: '||sqlerrm); \nEND prc_chk_item;\n-----------------------------------------------------------------------------------\n-- !!! Used prc_Set_Items - defined from USER external procedure !!! --\n-----------------------------------------------------------------------------------\nPROCEDURE prc_rec (p_ix PLS_INTEGER, p_block VARCHAR2, p_name VARCHAR2, p_label VARCHAR2, p_text VARCHAR2, \n                   p_messg VARCHAR2 DEFAULT NULL, p_notnull VARCHAR2 DEFAULT 'YES', p_type VARCHAR2 DEFAULT 'NORMAL') IS\n    l_label VARCHAR2(64);\n    l_text  VARCHAR2(64);\nBEGIN    \n   IF p_notnull='YES' THEN\n      l_label:= p_label||' *';\n      l_text := p_text||' *';\n   ELSE\n      l_label:= p_label;\n      l_text := p_text;\n   END IF;\n   -- 1. set name sorted tab --\n   pkg_Item.item_name(p_name).id      := p_ix;\n   pkg_Item.item_name(p_name).block   := p_block;\n   pkg_Item.item_name(p_name).name    := p_name;\n   pkg_Item.item_name(p_name).label   := l_label;\n   pkg_Item.item_name(p_name).text    := l_text;\n   pkg_Item.item_name(p_name).msg     := p_messg;  \n   pkg_Item.item_name(p_name).notnull := p_notnull;   \n   pkg_Item.item_name(p_name).type     := p_type;\n            \n   -- 2. set ix sorted tab --\n    pkg_Item.item_ix(p_ix).id          := p_ix;\n   pkg_Item.item_ix(p_ix).block       := p_block;\n   pkg_Item.item_ix(p_ix).name        := p_name;\n    pkg_Item.item_ix(p_ix).label       := l_label;\n   pkg_Item.item_ix(p_ix).text        := l_text;\n   pkg_Item.item_ix(p_ix).msg         := p_messg;\n   pkg_Item.item_ix(p_ix).notnull     := p_notnull;\n   pkg_Item.item_ix(p_ix).type        := p_type;  \n                 \n  EXCEPTION WHEN OTHERS THEN\n     prc_info('$$$ Exception in pkg_Item.prc_init(rec): '||sqlerrm); \nEND prc_rec;\n\nPROCEDURE prc_init_Items IS \n  l_name VARCHAR2(32);\n BEGIN   \n    -- USER DEFINED - external !!! --\n    prc_Set_Items;\n    \n   FOR i IN 1.. pkg_Item.item_ix.count LOOP\n       l_name:= pkg_Item.item_ix(i).name;          \n       COPY(pkg_Item.item_ix(i).text,  l_name);  \n       COPY(pkg_Item.item_ix(i).label, 'LABEL_'||l_name);   \n       -- specials --\n       IF pkg_Item.item_ix(i).type='SECURE' THEN\n          -- shows text --\n          Set_item_Property(pkg_Item.item_ix(i).block||'.'||l_name, ECHO, PROPERTY_TRUE);        \n       END IF;     \n       Set_item_Property(pkg_Item.item_ix(i).block||'.UNDER_'||l_name, VISUAL_ATTRIBUTE, 'VA_UL_EMPTY');                \n   END LOOP;\n  \n EXCEPTION WHEN OTHERS THEN\n    prc_info('$$$ EXCEPTION pkg_Item.prc_init: '||sqlerrm);  \n END prc_init_Items;\n\n-----------------------------------------------------------------------------------\n\nEND pkg_Item;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0017/POC_ACCOUNT/PKG_ITEM.pks",
    "content": "PACKAGE pkg_Item IS\n\n  -- Friedhold Matz - 2018-FEB\n  \n  gLastItem VARCHAR2(128);\n  \n  C_BlockName CONSTANT VARCHAR2(32):= 'BLK_ACCOUNT';\n     \n  TYPE rec_def_t IS RECORD (id       NUMBER(4),    \n                            block    VARCHAR2(32),\n                            name     VARCHAR2(32), \n                            label    VARCHAR2(64), \n                            text      VARCHAR2(64), \n                            msg      VARCHAR2(64),\n                            notnull VARCHAR2(8),\n                            type     VARCHAR2(32)\n                           );\n                           \n\n  TYPE rec_item_name_t IS TABLE OF rec_def_t INDEX BY VARCHAR2(32);   -- order by code\n  TYPE rec_item_ix_t   IS TABLE OF rec_def_t INDEX BY PLS_INTEGER;   -- order by index\n\n  item_name   rec_item_name_t;  \n  item_ix     rec_item_name_t;\n\n-- WHEN-NEW-INSTANCE-ITEM trigger --\nPROCEDURE prc_Enter;\n\n-- WHEN-VALIDATE-ITEM trigger --\nPROCEDURE prc_Leave;\n\n-- e.g. KEX-EXIT trigger --\nFUNCTION fnc_final_check RETURN VARCHAR2;\n\n-- automated checks a item --\nPROCEDURE prc_chk_item (p_block VARCHAR2, p_item VARCHAR2, p_value VARCHAR2, p_result VARCHAR2 DEFAULT NULL);\n\nPROCEDURE prc_rec (p_ix PLS_INTEGER, p_block VARCHAR2, p_name VARCHAR2, p_label VARCHAR2, p_text VARCHAR2, \n                 p_messg VARCHAR2 DEFAULT NULL, p_notnull VARCHAR2 DEFAULT 'YES', p_type VARCHAR2 DEFAULT 'NORMAL');\n\nPROCEDURE prc_init_Items;\n                \nEND pkg_Item;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0017/POC_ACCOUNT/POC_ACCOUNT/KEY-EXIT.tgg",
    "content": "BEGIN\n\n-- Friedhold Matz - 2018-FEB\n\nDECLARE\n  l_res VARCHAR2(256);\nBEGIN\n  l_res:= pkg_Item.fnc_final_check;  \n  IF l_res<>'OK' THEN\n     IF fnc_msg_query(' User uccount is not completed ! '||chr(10)||\n                       l_res ||chr(10)||\n                       'Do you want to exit ?')='YES' THEN\n        EXIT_FORM(NO_VALIDATE);\n     ELSE\n         Raise Form_trigger_Failure;\n     END IF;\n  END IF;\n  \n  -- permanent storage function here ... --\n  prc_info('User account is completed .');\n  \n  EXIT_FORM;\n  \nEND KEY_EXIT;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0017/POC_ACCOUNT/POC_ACCOUNT/ON-ERROR.tgg",
    "content": "BEGIN\n\nBEGIN\n  \n  IF ERROR_CODE IN (42100) THEN\n     NULL;\n  ELSE\n     prc_info('ERR::'||ERROR_CODE||'/'||ERROR_TEXT);\n  END IF;\n\nEND ON_ERROR;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0017/POC_ACCOUNT/POC_ACCOUNT/ON-MESSAGE.tgg",
    "content": "BEGIN\n\nBEGIN\n\n   prc_info('ON-MESSAGE::'||MESSAGE_CODE);\n\nEND ON_MESSAGE;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0017/POC_ACCOUNT/POC_ACCOUNT/WHEN-NEW-FORM-INSTANCE.tgg",
    "content": "BEGIN\n/*\n * Created by Friedhold.Matz@yahoo.com - Jan-2018\n * This PoC Demo demonstrates the Oracle Forms power \n * of Forms Items modernizing as \"Materialized Items\":\n *\n * - Low Native PL/SQL Forms code\n * - using simple four Items for one: \n *   o LABEL_Item\n *   o Item\n *   o UNDER_Item\n *   o MSG_Item .\n * - D_% items: Not used, only as separators.\n * - demonstrate a low code automated self check of this items.\n *\n * Basic features:\n * - Materialized items\n * - Verification of Oracle password incl. special characters\n * - Final check procedure of all defined items\n * - Automatic test sequence for expected results and item values.\n * ---------------------------------------------------------------\n *\n * NOT's: \n * ------\n * - no using for production (only at own risk)\n * - no generic solution (yet)\n * - no maintainability\n * - no guarantee.\n *\n * Hope you can accept & enjoy it.\n *\n */\n\nBEGIN\n  \n  set_window_property('WIN_MAIN', TITLE, 'User Account (Layout PoC) [poc_account v'||:PARAMETER.P_VERSION||']');\n  \n  pkg_Item.prc_Init_Items;\n  \n  go_item('DUMMY');\n   \nEND W_N_F_I;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0017/POC_ACCOUNT/POP_CHECK/CHECK_ALL/POP_CHECK__CHECK_ALL.sql",
    "content": "BEGIN\n\nBEGIN\n  \n  -- Yoho, that's Forms ! --\n  prc_chk_item_sequence;\n  \nEND;\n\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0017/POC_ACCOUNT/PRC_CHK_ITEM_SEQUENCE.pcd",
    "content": "PROCEDURE prc_chk_item_sequence IS\n\n   -- Friedhold Matz - 2018-FEB --\n   -- Automated self check sequence definition . --\nBEGIN\n\n   --                     block          item                 value          expected result( DEFAULT:OK | NOK )\n   pkg_Item.prc_chk_item('BLK_ACCOUNT', 'USERNAME',         'Tester'                         );\n   pkg_Item.prc_chk_item('BLK_ACCOUNT', 'FULLNAME',         'Friedhold Matz'                 );\n   pkg_Item.prc_chk_item('BLK_ACCOUNT', 'EMAIL',            'fx@xx.'                       ,'NOK'); --'OK'  ); -- <<< 'OK' => FALSE !\n   pkg_Item.prc_chk_item('BLK_ACCOUNT', 'EMAIL',            'fx@xx.com'                      );\n   pkg_Item.prc_chk_item('BLK_ACCOUNT', 'EMAIL2',            'fx@xx.com'                    ,'NOK');\n   pkg_Item.prc_chk_item('BLK_ACCOUNT', 'EMAIL2',            'fy@xx.com'                       );\n   pkg_Item.prc_chk_item('BLK_ACCOUNT', 'QUERY',            'What''s the name of your cat ?'  );\n   pkg_Item.prc_chk_item('BLK_ACCOUNT', 'ANSWER',           'Susi'                           );\n   \n   pkg_Item.prc_chk_item('BLK_ACCOUNT', 'PASSWORD',         '13aaaPPP+#-'                 ,'NOK');\n   pkg_Item.prc_chk_item('BLK_ACCOUNT', 'PASSWORD',         '1333aaPPP+#-'                ,'NOK');  \n   \n   pkg_Item.prc_chk_item('BLK_ACCOUNT', 'PASSWORD',         'testeraaPPP+#-123456'        ,'NOK');\n   pkg_Item.prc_chk_item('BLK_ACCOUNT', 'PASSWORD',         'aaPPPtester+#-123456'        ,'NOK');\n   pkg_Item.prc_chk_item('BLK_ACCOUNT', 'PASSWORD',         '123aaaPPP+#-1TESTER'         ,'NOK');\n  \n   pkg_Item.prc_chk_item('BLK_ACCOUNT', 'PASSWORD',         '123aaaPPP+#-'                  );\n   pkg_Item.prc_chk_item('BLK_ACCOUNT', 'PASSWORD',         '123aaaPPP+#-123456'            );  \n   pkg_Item.prc_chk_item('BLK_ACCOUNT', 'PASSWORD',         '123aaaPPP+#-1234567890'        );\n   \n   pkg_Item.prc_chk_item('BLK_ACCOUNT', 'PASSWORD_RETRY',   '123aaaPPP+#-1234567891'        );\n   pkg_Item.prc_chk_item('BLK_ACCOUNT', 'PASSWORD_RETRY',   '123aaaPPP+#-1234567890'        );\n   pkg_Item.prc_chk_item('BLK_ACCOUNT', 'BT_COMMIT',          'PRESS'      );\n   \n   -- clear (reset) items --\n   pkg_Item.prc_chk_item('BLK_ACCOUNT', 'USERNAME',         ''      );\n   pkg_Item.prc_chk_item('BLK_ACCOUNT', 'FULLNAME',         ''      );\n   pkg_Item.prc_chk_item('BLK_ACCOUNT', 'EMAIL',            ''      ); \n   pkg_Item.prc_chk_item('BLK_ACCOUNT', 'EMAIL2',            ''      ); \n   pkg_Item.prc_chk_item('BLK_ACCOUNT', 'QUERY',            ''      );\n   pkg_Item.prc_chk_item('BLK_ACCOUNT', 'ANSWER',           ''      );\n   pkg_Item.prc_chk_item('BLK_ACCOUNT', 'PASSWORD',         ''      );\n   pkg_Item.prc_chk_item('BLK_ACCOUNT', 'PASSWORD_RETRY',   ''      );\n   \n   pkg_Item.prc_chk_item('BLK_ACCOUNT', 'BT_COMMIT',         'GO'    );\n   \nEND prc_chk_item_sequence;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0017/POC_ACCOUNT/PRC_INFO.pcd",
    "content": "PROCEDURE prc_info(s VARCHAR2) IS\n  al_button PLS_INTEGER;\n  al_id     Alert;\nBEGIN\n  -- ${open} --\n  al_id:= FIND_ALERT('INFO'); \n  SET_ALERT_PROPERTY(al_id, ALERT_MESSAGE_TEXT, s ); \n  al_button := SHOW_ALERT( al_id ); \nEND prc_info;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0017/POC_ACCOUNT/PRC_SET_ITEMS.pcd",
    "content": "PROCEDURE prc_Set_Items IS\n\n   -- Friedhold Matz - 2018-FEB --\n   -- item value definitions --\nBEGIN\n   -- place your item definitions here . ! --\n     pkg_Item.prc_rec(1 , 'BLK_ACCOUNT', 'USERNAME',         'User name',              \n             'Enter your user name',                          'Must begin with .. followed .. #_$');\n             \n     pkg_Item.prc_rec(2 , 'BLK_ACCOUNT', 'FULLNAME',          'Full name',           \n             'Enter your full name',                          'Must begin with .. followed .. #_$');\n             \n     pkg_Item.prc_rec(3 , 'BLK_ACCOUNT', 'EMAIL',             'Email address',         \n             'Enter your first email address',               'Not a valid email format !');\n             \n      pkg_Item.prc_rec(4 , 'BLK_ACCOUNT', 'EMAIL2',            'Second email address',  \n              'Enter your second email address',              'Not a valid email format !', 'NO');\n              \n     pkg_Item.prc_rec(5 , 'BLK_ACCOUNT', 'QUERY',           'Users query',                                         \n             'Enter your query (e.g. \"Name of my Cat\")',    'Must begin with .. followed .. #_$');\n             \n     pkg_Item.prc_rec(6 , 'BLK_ACCOUNT', 'ANSWER',            'Users answer',                                        \n              'Enter the answer of your query',              '.. ', 'YES', 'SECURE');\n              \n     pkg_Item.prc_rec(7 , 'BLK_ACCOUNT', 'PASSWORD',          'Password (3 lowers,3 uppers,3 numbers,3 specials)',   \n              'Enter the password (min. 12 characters)',     '.. Error message comes from intern ..', 'YES', 'SECURE');\n              \n     pkg_Item.prc_rec(8 , 'BLK_ACCOUNT', 'PASSWORD_RETRY',  'Retry password', \n              'Re-enter the password',                       '.. Error message comes from intern ..', 'YES', 'SECURE');   \n                       \n  EXCEPTION WHEN OTHERS THEN\n     prc_info(' EXCEPTION prc_Set_Items: '||sqlerrm);\nEND prc_Set_Items;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0017/POC_ACCOUNT/V#R#FY_PW$001.fun",
    "content": "FUNCTION v#r#fy_pw$001 (    \n    p_username      varchar2,\n    p_password      varchar2\n) RETURN VARCHAR2 IS\n\n /* \n  * This password check enabled some special characters using with \"my :-} password.§$\"\n  * and get the password strength in Oracle Forms for the Oracle DB password setting.\n  * That's a maximal password variant; remember that you can use ANY characters\n  * in Oracle DB enclosed in double quotes e.g. \" . - # ~ 12 ..\"\n  * OUTPUT: substr(v#r#fy_pw$001,1,3)<>'$$$' => {LIGHT|MEDIUM|STRONG} :: 'OK'\n  *         substr(v#r#fy_pw$001,1,3)= '$$$' => '$$$ Error .. $$$' .\n  *\n  * Friedhold Matz - 2018-FEB\n  *\n **/\n   -- password strength definition --\n   C_MINPWLEN    CONSTANT NUMBER(3) :=12;\n   C_MINDIGIT    CONSTANT NUMBER(3) :=3;\n   C_MINCHARLOW  CONSTANT NUMBER(3) :=3;\n   C_MINCHARUPP  CONSTANT NUMBER(3) :=3;\n   C_MINSPECIAL  CONSTANT NUMBER(3) :=3;\n   C_MEDIUM      CONSTANT NUMBER(2) :=17;\n   C_STRONG      CONSTANT NUMBER(2) :=20;\n   \n   l_lenpw        NUMBER(2);\n   l_restype      VARCHAR2(32);\n   l_cnt_charlow  NUMBER(3) :=0;\n   l_cnt_charupp  NUMBER(3) :=0;\n   l_cnt_digit    NUMBER(3) :=0;\n   l_cnt_special  NUMBER(3) :=0;\n   l_cnt_NO       NUMBER(3) :=0;\n   l_1un          CHAR(1);\n   l_lenun        NUMBER(2);\n   l_char         CHAR(1);\n\nBEGIN \n   -- Check for the minimum length of the password --\n   l_lenpw := length(p_password);\n   IF l_lenpw < C_MINPWLEN THEN\n      RETURN('$$$ Error: Password length less than '||C_MINPWLEN||' characters. $$$');\n   END IF;\n   -- Check if the password is same as the username or username(1-100)\n   IF LOWER(password) = LOWER(p_username) THEN\n     RETURN('$$$ Error: Password same as or similar to user $$$');\n   END IF;\n   l_lenun := length(p_username);\n   l_1un   := substr(p_username,1,1);\n   ------------------------------------------------------------------------------\n   --- Friedhold Matz : 14.10.2013 / 14.12.2017 / 09.02.2018                       ---\n   ------------------------------------------------------------------------------\n   FOR i IN 1..l_lenpw LOOP \n       l_char := substr(p_password, i ,1);      \n       IF l_char BETWEEN 'a' AND 'z' THEN    \n          l_cnt_charlow:= l_cnt_charlow+1;\n       ELSIF l_char BETWEEN 'A' and 'Z' THEN\n          l_cnt_charupp:= l_cnt_charupp+1;         \n       ELSIF l_char BETWEEN '0' AND '9' THEN\n          l_cnt_digit:= l_cnt_digit+1;    \n       ELSIF l_char IN( '#', '_', '$', '!', '\"', '§', '%', '&', '/', '(', ')', '=', '?', '\\', '{', '>', '<', '`',  '°',\n                         '[', ']', '}', '~', '+', '*', '#', '-', ';', ',', ':', '.', ':', ' ', '´', ' ', '|', '''', '^' ) THEN\n          l_cnt_special:= l_cnt_special+1;         \n       ELSE\n          l_cnt_NO := l_cnt_NO+1;\n       END IF;\n       IF LOWER(l_char)=LOWER(l_1un) THEN\n           IF LOWER(p_username)=LOWER(substr(p_password,i,l_lenun)) THEN\n              RETURN('$$$ Error: Username is included in Password ! $$$');\n           END IF;\n       END IF;\n   END LOOP;   \n   IF l_cnt_charlow<C_MINCHARLOW THEN\n      RETURN('$$$ Error: Password does not incl. min. '||C_MINCHARLOW||' lower case characters. $$$ ');\n   END IF;\n   IF l_cnt_charupp<C_MINCHARUPP THEN\n      RETURN('$$$ Error: Password does not incl. min. '||C_MINCHARUPP||' upper case characters. $$$ ');\n   END IF;\n   IF l_cnt_digit<C_MINDIGIT THEN\n      RETURN('$$$ Error: Password does not incl. min. '||C_MINDIGIT||' digit characters. $$$ ');\n   END IF;\n   IF l_cnt_special<C_MINSPECIAL THEN\n      RETURN('$$$ Error: Password does not incl. min. '||C_MINSPECIAL||' special characters. $$$ ');\n   END IF;   \n   IF l_cnt_NO>0 THEN\n      RETURN('$$$ Error: Password contains invalid characters. $$$');\n   END IF;\n   ------------------------------------------------------------------------------  \n   --- Everything is fine, get the strength now. ---  \n   l_restype:='LIGHT';\n   IF l_lenpw BETWEEN C_MEDIUM AND C_STRONG THEN\n       l_restype:='MEDIUM';\n   ELSIF l_lenpw > C_STRONG THEN\n       l_restype:='STRONG';\n   END IF;\n   \n   RETURN (l_restype);\n\nEXCEPTION WHEN OTHERS THEN\n   RETURN ('$$$ : '||l_lenpw||' / '||sqlerrm);  \nEND  v#r#fy_pw$001;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0017/POC_ACCOUNT/metadata.json",
    "content": "{\n  \"alerts\": [\n    \"INFO\",\n    \"QUERY\"\n  ],\n  \"blocks\": [\n    {\n      \"name\": \"BLK_ACCOUNT\",\n      \"items\": [\n        \"DUMMY\",\n        \"LABEL_USERNAME\",\n        \"USERNAME\",\n        \"UNDER_USERNAME\",\n        \"MSG_USERNAME\",\n        \"D_\",\n        \"LABEL_FULLNAME\",\n        \"FULLNAME\",\n        \"UNDER_FULLNAME\",\n        \"MSG_FULLNAME\",\n        \"D__\",\n        \"LABEL_EMAIL\",\n        \"EMAIL\",\n        \"UNDER_EMAIL\",\n        \"MSG_EMAIL\",\n        \"D___\",\n        \"LABEL_EMAIL2\",\n        \"EMAIL2\",\n        \"UNDER_EMAIL2\",\n        \"MSG_EMAIL2\",\n        \"D____\",\n        \"LABEL_QUERY\",\n        \"QUERY\",\n        \"UNDER_QUERY\",\n        \"MSG_QUERY\",\n        \"D_____\",\n        \"LABEL_ANSWER\",\n        \"ANSWER\",\n        \"UNDER_ANSWER\",\n        \"MSG_ANSWER\",\n        \"D______\",\n        \"LABEL_PASSWORD\",\n        \"PASSWORD\",\n        \"UNDER_PASSWORD\",\n        \"MSG_PASSWORD\",\n        \"D_______\",\n        \"LABEL_PASSWORD_RETRY\",\n        \"PASSWORD_RETRY\",\n        \"UNDER_PASSWORD_RETRY\",\n        \"MSG_PASSWORD_RETRY\",\n        \"D________\",\n        \"BT_COMMIT\",\n        \"CLOSE\",\n        \"START_DEMO\"\n      ]\n    }\n  ],\n  \"lovs\": []\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0018/TEST/TEST/TEST__BUTTON1__WHEN-BUTTON-PRESSED.tgg",
    "content": "BEGIN\ngo_item('TEST');\ndo_key('EDIT_TEXTITEM');\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0018/TEST/TEST/WHEN-NEW-FORM-INSTANCE.tgg",
    "content": "BEGIN\nexecute_query;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/Doag-Forms-extracted/demo0018/TEST/metadata.json",
    "content": "{\n  \"alerts\": [],\n  \"blocks\": [\n    {\n      \"name\": \"TEST\",\n      \"items\": [\n        \"TEST\",\n        \"BUTTON1\"\n      ]\n    }\n  ],\n  \"lovs\": []\n}"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/README.md",
    "content": "These files were copied from https://github.com/antlr/grammars-v4/tree/086ca965a5fcff502e338879e50a0013b072683d/sql/plsql\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/administer_key_management.sql",
    "content": "ADMINISTER KEY MANAGEMENT MOVE KEYS \nTO NEW KEYSTORE '$ORACLE_BASE/admin/orcl/wallet'\nIDENTIFIED BY \"pass\"\nFROM FORCE KEYSTORE \nIDENTIFIED BY \"pass\"\nWITH IDENTIFIER IN \n(SELECT KEY_ID FROM V$ENCRYPTION_KEYS WHERE ROWNUM < 2);\n\nADMINISTER KEY MANAGEMENT\n    SWITCHOVER TO LIBRARY 'updated_fully_qualified_file_name_of_library' FOR ALL CONTAINERS;\n\nADMINISTER KEY MANAGEMENT\n  CREATE KEYSTORE '/etc/ORACLE/WALLETS/orcl'\n  IDENTIFIED BY \"pass\";\n\nADMINISTER KEY MANAGEMENT\n  CREATE AUTO_LOGIN KEYSTORE FROM KEYSTORE '/etc/ORACLE/WALLETS/orcl'\n  IDENTIFIED BY \"pass\";\n\nADMINISTER KEY MANAGEMENT\nSET KEYSTORE OPEN\n  IDENTIFIED BY \"pass\";\n\nADMINISTER KEY MANAGEMENT\nSET KEYSTORE OPEN\n  IDENTIFIED BY \"pass\"\n  CONTAINER = CURRENT;\n\nADMINISTER KEY MANAGEMENT\nSET KEYSTORE OPEN\n  IDENTIFIED BY \"user_id:password\";\n\nADMINISTER KEY MANAGEMENT\nSET KEYSTORE OPEN\n  IDENTIFIED BY EXTERNAL STORE;\n\nADMINISTER KEY MANAGEMENT\nSET KEYSTORE CLOSE\n  IDENTIFIED BY \"pass\";\n\nADMINISTER KEY MANAGEMENT\nSET KEYSTORE CLOSE;\n\nADMINISTER KEY MANAGEMENT\nSET KEYSTORE CLOSE\n  IDENTIFIED BY \"user_id:password\";\n\nADMINISTER KEY MANAGEMENT\nSET KEYSTORE CLOSE\n  IDENTIFIED BY EXTERNAL STORE;\n\nADMINISTER KEY MANAGEMENT\n  BACKUP KEYSTORE USING 'hr.emp_keystore'\n  IDENTIFIED BY \"password\"\n  TO '/etc/ORACLE/KEYSTORE/DB1/';\n\nADMINISTER KEY MANAGEMENT\n  ALTER KEYSTORE PASSWORD IDENTIFIED BY \"old_password\"\nSET \"new_password\" WITH BACKUP USING 'pwd_change';\n\nADMINISTER KEY MANAGEMENT\nMERGE KEYSTORE '/etc/ORACLE/KEYSTORE/DB1'\n    AND KEYSTORE '/etc/ORACLE/KEYSTORE/DB2'\n    IDENTIFIED BY \"old-pass\"\nINTO NEW KEYSTORE '/etc/ORACLE/KEYSTORE/DB3'\n    IDENTIFIED BY \"new-pass\";\n\nADMINISTER KEY MANAGEMENT\nMERGE KEYSTORE '/etc/ORACLE/KEYSTORE/DB1'\nINTO EXISTING KEYSTORE '/etc/ORACLE/KEYSTORE/DB2'\n    IDENTIFIED BY \"pass\"\nWITH BACKUP;\n\nADMINISTER KEY MANAGEMENT\nSET KEY USING ALGORITHM 'SEED128'\n  IDENTIFIED BY \"pass\"\nWITH BACKUP;\n\nADMINISTER KEY MANAGEMENT\n  CREATE KEY USING TAG 'mykey1'\n  IDENTIFIED BY \"pass\"\nWITH BACKUP;\n\nADMINISTER KEY MANAGEMENT\nUSE KEY 'ARgEtzPxpE/Nv8WdPu8LJJUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'\n  IDENTIFIED BY \"pass\"\nWITH BACKUP;\n\nADMINISTER KEY MANAGEMENT\nSET TAG 'mykey2' FOR 'ARgEtzPxpE/Nv8WdPu8LJJUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'\n  FORCE KEYSTORE\n  IDENTIFIED BY \"pass\"\nWITH BACKUP;\n\nADMINISTER KEY MANAGEMENT\n  EXPORT KEYS WITH SECRET \"my_secret\"\n                  TO '/etc/TDE/export.exp'\n                  IDENTIFIED BY \"password\"\nWITH IDENTIFIER IN 'AdoxnJ0uH08cv7xkz83ovwsAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',\n    'AW5z3CoyKE/yv3cNT5CWCXUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA';\n\nADMINISTER KEY MANAGEMENT\n  EXPORT KEYS WITH SECRET \"my_secret\"\n                  TO '/etc/TDE/export.exp'\n                  IDENTIFIED BY \"pass\"\nWITH IDENTIFIER IN\n(SELECT KEY_ID FROM V$ENCRYPTION_KEYS WHERE TAG IN ('mytag1', 'mytag2'));\n\nADMINISTER KEY MANAGEMENT\n  EXPORT KEYS WITH SECRET \"my_secret\"\n                  TO '/etc/TDE/export.exp'\n                  IDENTIFIED BY \"pass\";\n\nADMINISTER KEY MANAGEMENT\n  IMPORT KEYS WITH SECRET \"my_secret\"\n              FROM '/etc/TDE/export.exp'\n                  IDENTIFIED BY \"pass\"\nWITH BACKUP;\n\nADMINISTER KEY MANAGEMENT\nSET ENCRYPTION KEY IDENTIFIED BY \"software_keystore_password\"\n  REVERSE MIGRATE USING \"user_id:password\";\n\nADMINISTER KEY MANAGEMENT\n  ADD SECRET 'secret1' FOR CLIENT 'client1'\n  USING TAG 'My first secret'\n  IDENTIFIED BY \"pass\"\nWITH BACKUP;\n\nADMINISTER KEY MANAGEMENT\n  ADD SECRET 'secret2' FOR CLIENT 'client2'\n  USING TAG 'My second secret'\n  IDENTIFIED BY \"user_id:password\";\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/aggregate_functions.sql",
    "content": "select collect(emp.ldap_login order by emp.last_name, emp.first_name)\n  from employee emp\n where emp.dept = 'HR';\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/alter_analytic_view.sql",
    "content": "ALTER ANALYTIC VIEW sales_av RENAME TO mysales_av;\n\nALTER ANALYTIC VIEW TKHCSGL308_UNITS_AVIEW_CACHE ADD CACHE\n    MEASURE GROUP (sales, units, cost)\n    LEVELS (TIME.FISCAL.FISCAL_QUARTER, WAREHOUSE);\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/alter_attribute_dimension.sql",
    "content": "ALTER ATTRIBUTE DIMENSION product_attr_dim RENAME TO my_product_attr_dim;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/alter_audit_policy.sql",
    "content": "ALTER AUDIT POLICY hr_audit_policy ADD ONLY TOPLEVEL;\nALTER AUDIT POLICY hr_audit_policy DROP ONLY TOPLEVEL;\nALTER AUDIT POLICY dml_pol\n  ADD PRIVILEGES CREATE ANY TABLE, DROP ANY TABLE;\nALTER AUDIT POLICY java_pol\n  ADD ACTIONS CREATE JAVA, ALTER JAVA, DROP JAVA;\nALTER AUDIT POLICY table_pol\n  ADD ROLES dba;\nALTER AUDIT POLICY security_pol\n  ADD PRIVILEGES CREATE ANY LIBRARY, DROP ANY LIBRARY\n      ACTIONS DELETE on hr.employees,\nINSERT on hr.employees,\nUPDATE on hr.employees,\n    ALL on hr.departments\n    ROLES dba, connect;\nALTER AUDIT POLICY table_pol\n  DROP PRIVILEGES CREATE ANY TABLE;\nALTER AUDIT POLICY dml_pol\n  DROP ACTIONS INSERT on hr.employees,\nUPDATE on hr.employees;\nALTER AUDIT POLICY java_pol\n  DROP ROLES java_deploy;\nALTER AUDIT POLICY hr_admin_pol\n  DROP PRIVILEGES CREATE ANY TABLE\n       ACTIONS LOCK TABLE\n       ROLES audit_viewer;\nALTER AUDIT POLICY dp_actions_pol\n  ADD ACTIONS COMPONENT = datapump EXPORT\n  DROP ACTIONS COMPONENT = datapump IMPORT;\nALTER AUDIT POLICY order_updates_pol\n  CONDITION DROP;\nALTER AUDIT POLICY emp_updates_pol\n  CONDITION 'UID = 102'\n  EVALUATE PER STATEMENT;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/alter_database.sql",
    "content": "ALTER DATABASE testdb \n   DATAFILE '+dgroup_01/testdb/datafile/system.261.1' ONLINE;\nALTER DATABASE OPEN READ ONLY;\nALTER DATABASE\n   RECOVER TABLESPACE tbs_03\n   PARALLEL;\nALTER DATABASE\n  ADD LOGFILE GROUP 3 \n    ('diska:log3.log' ,  \n     'diskb:log3.log') SIZE 50K; \nALTER DATABASE  \n    ADD LOGFILE THREAD 5 GROUP 4  \n        ('diska:log4.log', \n         'diskb:log4:log'); \nALTER DATABASE   \n   ADD LOGFILE MEMBER 'diskc:log3.log'  \n   TO GROUP 3; \nALTER DATABASE\n    DROP LOGFILE MEMBER 'diskb:log3.log'; \nALTER DATABASE DROP LOGFILE GROUP 3;\nALTER DATABASE   \n    RENAME FILE 'diskc:log3.log' TO 'diskb:log3.log'; \nALTER DATABASE\n    SET DEFAULT BIGFILE TABLESPACE;\nALTER DATABASE \n   DEFAULT TEMPORARY TABLESPACE tbs_05;\nALTER DATABASE TEMPFILE 'temp02.dbf' OFFLINE;\nALTER DATABASE RENAME FILE 'temp02.dbf' TO 'temp03.dbf';\nALTER DATABASE  \n    RENAME GLOBAL_NAME TO demo.world.oracle.com; \nALTER DATABASE\n  ENABLE BLOCK CHANGE TRACKING\n    USING FILE 'tracking_file' REUSE;\nALTER DATABASE\n  DISABLE BLOCK CHANGE TRACKING;\nALTER DATABASE  \n    DATAFILE 'diskb:tbs_f5.dat' RESIZE 10 M;\nALTER DATABASE  \n    CLEAR LOGFILE 'diskc:log3.log';\nALTER DATABASE \n  RECOVER AUTOMATIC DATABASE;\nALTER DATABASE \n    RECOVER LOGFILE 'diskc:log3.log'; \n--TODO: fix grammar\n--ALTER DATABASE  \n--   RECOVER STANDBY DATAFILE '/finance/stbs_21.f' \n--   UNTIL CONTROLFILE;\nALTER DATABASE \n   RECOVER MANAGED STANDBY DATABASE;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/alter_dimension.sql",
    "content": "ALTER DIMENSION customers_dim DROP ATTRIBUTE country;\n\nALTER DIMENSION customers_dim\n    ADD LEVEL zone IS customers.cust_postal_code\n    ADD ATTRIBUTE zone DETERMINES (cust_city);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/alter_diskgroup.sql",
    "content": "ALTER DISKGROUP hmdg ADD FILEGROUP fgtem TEMPLATE SET 'datafile.redundancy'='unprotected';\n\nALTER DISKGROUP hmdg ADD FILEGROUP fgdb DATABASE NONE FROM TEMPLATE fgtem;\n\nALTER DISKGROUP hmdg ADD FILEGROUP fgtem2 TEMPLATE FROM TEMPLATE fgtem;\n\nALTER DISKGROUP dgroup_01\n  ADD DISK '/devices/disks/d100';\n\nALTER DISKGROUP dgroup_01\n  DROP DISK dgroup_01_0000;\n\nALTER DISKGROUP dgroup_01\nUNDROP DISKS;\n\nALTER DISKGROUP dgroup_01\n  RESIZE ALL\n  SIZE 36G;\n\nALTER DISKGROUP dgroup_01\n  REBALANCE POWER 11 WAIT;\n\nALTER DISKGROUP dgroup_01\n  CHECK ALL\n  REPAIR;\n\nALTER DISKGROUP dgroup_01\n  ADD TEMPLATE template_01\n    ATTRIBUTES (UNPROTECTED COARSE);\n\nALTER DISKGROUP dgroup_01\n  MODIFY TEMPLATE template_01\n    ATTRIBUTES (FINE);\n\nALTER DISKGROUP dgroup_01\n  DROP TEMPLATE template_01;\n\nALTER DISKGROUP dgroup_01\n  ADD DIRECTORY '+dgroup_01/alias_dir';\n\nALTER DISKGROUP dgroup_01\n  ADD ALIAS '+dgroup_01/alias_dir/datafile.dbf'\n    FOR '+dgroup_01.261.1';\n\nALTER DISKGROUP dgroup_01\n  SCRUB REPAIR WAIT;\n\nALTER DISKGROUP dgroup_01\n  DISMOUNT FORCE;\n\nALTER DISKGROUP dgroup_01\n  MOUNT;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/alter_flashback_archive.sql",
    "content": "ALTER FLASHBACK ARCHIVE test_archive1\n   MODIFY RETENTION 1 MONTH;\n\nALTER TABLE oe.customers\n    FLASHBACK ARCHIVE;\n\nALTER TABLE oe.orders\n    FLASHBACK ARCHIVE test_archive2;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/alter_function.sql",
    "content": "ALTER FUNCTION my_schema.my_fun EDITIONABLE;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/alter_hierarchy.sql",
    "content": "ALTER HIERARCHY product_hier RENAME TO myproduct_hier;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/alter_inmemory_join_group.sql",
    "content": "ALTER INMEMORY JOIN GROUP prod_id1\n  ADD(product_descriptions(product_id));\n\nALTER INMEMORY JOIN GROUP prod_id1\nREMOVE(product_descriptions(product_id));\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/alter_java.sql",
    "content": "ALTER JAVA CLASS \"Agent\"\n   RESOLVER ((\"/usr/bin/bfile_dir/*\" pm)(* public))\n   RESOLVE;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/alter_library.sql",
    "content": "ALTER LIBRARY hr.my_ext_lib COMPILE;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/alter_lockdown_profile.sql",
    "content": "ALTER LOCKDOWN PROFILE hr_prof\n  DISABLE FEATURE = ('NETWORK_ACCESS');\n\nALTER LOCKDOWN PROFILE hr_prof\n  DISABLE FEATURE = ('LOB_FILE_ACCESS', 'TRACE_VIEW_ACCESS');\nALTER LOCKDOWN PROFILE hr_prof\n  DISABLE FEATURE ALL EXCEPT = ('COMMON_USER_LOCAL_SCHEMA_ACCESS', 'LOCAL_USER_COMMON_SCHEMA_ACCESS');\nALTER LOCKDOWN PROFILE hr_prof\n  DISABLE FEATURE ALL;\n    ALTER LOCKDOWN PROFILE hr_prof\n  ENABLE FEATURE = ('UTL_HTTP', 'UTL_SMTP', 'OS_ACCESS');\nALTER LOCKDOWN PROFILE hr_prof\n  ENABLE FEATURE ALL EXCEPT = ('AQ_PROTOCOLS', 'CTX_PROTOCOLS');\n    ALTER LOCKDOWN PROFILE hr_prof\n  ENABLE FEATURE ALL;\nALTER LOCKDOWN PROFILE hr_prof\n  DISABLE OPTION = ('DATABASE QUEUING');\nALTER LOCKDOWN PROFILE hr_prof\n  DISABLE OPTION = ('PARTITIONING');\nALTER LOCKDOWN PROFILE hr_prof\n  ENABLE OPTION = ('DATABASE QUEUING');\nALTER LOCKDOWN PROFILE hr_prof\n  ENABLE OPTION ALL;\nALTER LOCKDOWN PROFILE hr_prof\n  DISABLE STATEMENT = ('ALTER DATABASE');\nALTER LOCKDOWN PROFILE hr_prof\n  DISABLE STATEMENT = ('ALTER SYSTEM')\n          CLAUSE = ('SUSPEND', 'RESUME');\nALTER LOCKDOWN PROFILE hr_prof\n  DISABLE STATEMENT = ('ALTER PLUGGABLE DATABASE')\n          CLAUSE ALL EXCEPT = ('DEFAULT TABLESPACE', 'DEFAULT TEMPORARY TABLESPACE');\nALTER LOCKDOWN PROFILE hr_prof\n  DISABLE STATEMENT = ('ALTER SESSION')\n          CLAUSE = ('SET')\n          OPTION = ('COMMIT_WAIT', 'CURSOR_SHARING');\nALTER LOCKDOWN PROFILE hr_prof\n  DISABLE STATEMENT = ('ALTER SYSTEM')\n          CLAUSE = ('SET')\n          OPTION = ('PDB_FILE_NAME_CONVERT')\n          VALUE = ('cdb1_pdb0', 'cdb1_pdb1');\nALTER LOCKDOWN PROFILE hr_prof\n  DISABLE STATEMENT = ('ALTER SYSTEM')\n          CLAUSE = ('SET')\n          OPTION = ('CPU_COUNT')\n          MINVALUE = '8';\nALTER LOCKDOWN PROFILE hr_prof\n  DISABLE STATEMENT = ('ALTER SYSTEM')\n          CLAUSE = ('SET')\n          OPTION = ('CPU_COUNT')\n          MAXVALUE = '2';\nALTER LOCKDOWN PROFILE hr_prof\n  DISABLE STATEMENT = ('ALTER SYSTEM')\n          CLAUSE = ('SET')\n          OPTION = ('CPU_COUNT')\n          MINVALUE = '2'\n          MAXVALUE = '6';\nALTER LOCKDOWN PROFILE hr_prof\n  ENABLE STATEMENT ALL EXCEPT = ('ALTER DATABASE');\nALTER LOCKDOWN PROFILE hr_prof\n  ENABLE STATEMENT = ('ALTER DATABASE')\n          CLAUSE = ('MOUNT', 'OPEN');\nALTER LOCKDOWN PROFILE hr_prof\n  ENABLE STATEMENT = ('ALTER PLUGGABLE DATABASE')\n         CLAUSE ALL EXCEPT = ('DEFAULT TABLESPACE', 'DEFAULT TEMPORARY TABLESPACE');\nALTER LOCKDOWN PROFILE hr_prof\n  ENABLE STATEMENT = ('ALTER SESSION')\n         CLAUSE = ('SET')\n         OPTION = ('COMMIT_WAIT', 'CURSOR_SHARING');\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/alter_materialized_zonemap.sql",
    "content": "ALTER MATERIALIZED ZONEMAP sales_zmap PCTFREE 20 PCTUSED 50 NOCACHE;\nALTER MATERIALIZED ZONEMAP sales_zmap REFRESH FAST ON COMMIT;\nALTER MATERIALIZED ZONEMAP sales_zmap DISABLE PRUNING;\nALTER MATERIALIZED ZONEMAP sales_zmap COMPILE;\nALTER MATERIALIZED ZONEMAP sales_zmap REBUILD;\nALTER MATERIALIZED ZONEMAP sales_zmap UNUSABLE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/alter_mv.sql",
    "content": "ALTER MATERIALIZED VIEW sales_by_month_by_state\n   REFRESH FAST; \n\nALTER MATERIALIZED VIEW sales_by_month_by_state\n   REFRESH NEXT SYSDATE+7;\nALTER MATERIALIZED VIEW sales_by_month_by_state CONSIDER FRESH;\n\nALTER MATERIALIZED VIEW emp_data\n   REFRESH COMPLETE\n   START WITH TRUNC(SYSDATE+1) + 9/24\n   NEXT SYSDATE+7;\nALTER MATERIALIZED VIEW emp_data\n   ENABLE QUERY REWRITE;\nALTER MATERIALIZED VIEW order_data\n   REFRESH WITH PRIMARY KEY;\nALTER MATERIALIZED VIEW order_data COMPILE;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/alter_mv_log.sql",
    "content": "ALTER MATERIALIZED VIEW LOG ON order_items ADD ROWID;\n\nALTER MATERIALIZED VIEW LOG ON employees\n   ADD (commission_pct)\n   EXCLUDING NEW VALUES;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/alter_operator.sql",
    "content": "ALTER OPERATOR eq_op COMPILE;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/alter_outline.sql",
    "content": "ALTER OUTLINE salaries REBUILD;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/alter_pmem_filestore.sql",
    "content": "ALTER PMEM FILESTORE cloud_db_1 RESIZE 5T;\n\nALTER  PMEM FILESTORE cloud_db_1 MOUNT  MOUNTPOINT '/corp/db/cloud_db_1'\n    BACKINGFILE '/var/pmem/foo_1';\n\nALTER PMEM FILESTORE cloud_db_1 DISMOUNT;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/alter_resource_cost.sql",
    "content": "ALTER RESOURCE COST\nCPU_PER_SESSION 100\nCONNECT_TIME 1;\n\nALTER RESOURCE COST\nLOGICAL_READS_PER_SESSION 2\nCONNECT_TIME 0;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/alter_role.sql",
    "content": "alter role TEST_ROLE_AAA NOT IDENTIFIED;\n\nalter role TEST_ROLE_AAA  IDENTIFIED BY data;\n\nalter role TEST_ROLE_AAA  IDENTIFIED EXTERNALLY;\n\nALTER ROLE TEST_ROLE_AAA IDENTIFIED USING hr.admin;\n\nalter role TEST_ROLE_AAA  IDENTIFIED GLOBALLY;\n\n\nALTER ROLE dw_manager IDENTIFIED GLOBALLY AS 'domain_name_of_directory_group' ;\nALTER ROLE warehouse_user NOT IDENTIFIED CONTAINER = CURRENT;\nALTER ROLE warehouse_user NOT IDENTIFIED CONTAINER = ALL;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/alter_rollback_segment.sql",
    "content": "ALTER ROLLBACK SEGMENT rbs_one ONLINE;\nALTER ROLLBACK SEGMENT rbs_one SHRINK TO 100M;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/alter_session.sql",
    "content": "ALTER SESSION\n    SET QUERY_REWRITE_ENABLED = TRUE;\n\nALTER SESSION\n    SET NLS_SORT = XSpanish;\n\nALTER SESSION\n    SET NLS_LANGUAGE = FRENCH;\n\nALTER SESSION SET NLS_CURRENCY = 'FF';\n\nALTER SESSION\n    ADVISE COMMIT;\n\nALTER SESSION ENABLE PARALLEL DML;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/alter_synonym01.sql",
    "content": "alter synonym emp compile;\nalter public synonym emp compile;\nalter public synonym emp noneditionable;\nalter public synonym sch.emp editionable;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/alter_table.sql",
    "content": "alter table hr.employees\n  add constraint emp_fk foreign key (department_id) \n  references hr.departments (department_id) \n  on delete cascade;\n\nalter table hr.employees\n  add foreign key (department_id) \n  references hr.departments (department_id) \n  on delete set null;\n\nalter table hr.employees\n  add constraint emp_fk foreign key (department_id, employee_id) \n  references hr.some_table (department_id, employee_id);\n\nalter table employees\n  add primary key (employee_id);\n\nalter table hr.employees\n  add constraint emp_complex_pk primary key (employee_id, department_id);\n\nalter table hr.employees\n  add constraint emp_uq unique (employee_id, email);\n\nalter table employees\n  add unique (employee_id);\n\nALTER TABLE suppliers\nADD CONSTRAINT check_supplier_name\n  CHECK (supplier_name IN ('IBM', 'Microsoft', 'NVIDIA'));\n  \nALTER TABLE suppliers\n  DROP CONSTRAINT check_supplier_id;\n\nALTER TABLE suppliers\n  ENABLE CONSTRAINT check_supplier_id;\n\nALTER TABLE suppliers\n  DISABLE CONSTRAINT check_supplier_id;\n\nALTER TABLE customers\n   PARALLEL;\n\nALTER TABLE employees\n    DEALLOCATE UNUSED;\n\nALTER TABLE countries_demo INITRANS 4;\n\nALTER TABLE employees \n   PCTFREE 30\n   PCTUSED 60; \n\nALTER TABLE employees\n  ALLOCATE EXTENT (SIZE 5K INSTANCE 4);\n\nALTER TABLE customers\n   ADD (online_acct_pw VARCHAR2(8) ENCRYPT 'NOMAC' NO SALT );\n\nALTER TABLE employees ADD (resume CLOB)\n  LOB (resume) STORE AS resume_seg (TABLESPACE example);\n\nALTER TABLE employees ADD (resume CLOB)\nLOB (resume) STORE AS SECUREFILE resume_seg (TABLESPACE auto_seg_ts);\n\nALTER TABLE employees ADD (skills number)\n    NESTED TABLE skills STORE AS nested_skill_table;\n\nALTER TABLE employees\n   ENABLE VALIDATE CONSTRAINT emp_manager_fk\n   EXCEPTIONS INTO exceptions;\n\nALTER TABLE print_media MODIFY NESTED TABLE ad_textdocs_ntab\n   RETURN AS VALUE; \n\nALTER TABLE employees\n   ENABLE NOVALIDATE PRIMARY KEY\n   ENABLE NOVALIDATE CONSTRAINT emp_last_name_nn;\n\nALTER TABLE locations\n   MODIFY PRIMARY KEY DISABLE CASCADE;\n\nALTER TABLE employees ADD CONSTRAINT check_comp\n   CHECK (salary + (commission_pct*salary) <= 5000)\n   DISABLE;\n\nALTER TABLE employees\n   ENABLE ALL TRIGGERS;\n\nALTER TABLE employees\n    DEALLOCATE UNUSED;\n\nALTER TABLE customers\n   RENAME COLUMN credit_limit TO credit_amount;\n\nALTER TABLE t1 DROP (pk) CASCADE CONSTRAINTS;\n\nALTER TABLE t1 DROP (pk, fk, c1);\nALTER TABLE customers\n   MODIFY (online_acct_pw DECRYPT);\n\nALTER TABLE departments\n    DROP PRIMARY KEY CASCADE; \n\nALTER TABLE employees\n    DROP UNIQUE (email);\n\nALTER TABLE employees MODIFY LOB (resume) (CACHE);\n\nALTER TABLE employees MODIFY LOB (resume) (NOCACHE);\n\nALTER TABLE employees MODIFY LOB (resume) (NOCACHE);\n\nalter TABLE employee add ( constraint employee_pk UNique ( a , b ) ) ;\n\nalter table employee add (\n    constraint emp_fk foreign key (col1, col2) references other,\n    constraint emp_fk2 foreign key (col1, col2) references another\n);\n\nalter table employee\n    add constraint emp_fk foreign key (col1, col2) references other;\n\nalter table employee\n    add constraint emp_fk foreign key (col1, col2) references other on delete set null;\n\nalter table employee\n    add constraint emp_fk foreign key (col1, col2) references other on delete cascade;\n\nALTER TABLE TABLE_A\n    ADD TABLE_B_ID NUMBER(5)\n    ADD FOREIGN KEY (TABLE_B_ID) REFERENCES TABLE_B (ID);\n\nALTER TABLE S.PRODUCTS\n    DROP PARTITION\n    FOR 101;\n\nALTER TABLE S.PRODUCTS\n    DROP PARTITION p0\n    UPDATE GLOBAL INDEXES;\n\nALTER TABLE S.PRODUCTS\n    DROP PARTITION p0\n    INVALIDATE GLOBAL INDEXES;\n\nALTER TABLE S.PRODUCTS\n    DROP PARTITION p0\n    UPDATE INDEXES;\n\nALTER TABLE S.PRODUCTS\n    DROP PARTITION p0, p1\n    UPDATE INDEXES;\n\nALTER TABLE S.PRODUCTS\n    DROP PARTITION p0\n    UPDATE GLOBAL INDEXES NOPARALLEL;\n\nALTER TABLE S.PRODUCTS\n    DROP PARTITION p0\n    INVALIDATE GLOBAL INDEXES NOPARALLEL;\n\nALTER TABLE S.PRODUCTS\n    DROP PARTITION p0\n    UPDATE INDEXES NOPARALLEL;\n\nALTER TABLE B.EXCHANGE_LOG\n    DROP PARTITION\n    FOR (TIMESTAMP '2022-01-28 00:00:00')\n    UPDATE GLOBAL INDEXES ;\n\nALTER TABLE mesg_perf_stat\n    TRUNCATE PARTITION SYS_P1221396\n    DROP STORAGE CASCADE UPDATE INDEXES;\n\nALTER TABLE employees MEMOPTIMIZE FOR READ\n    ENABLE VALIDATE CONSTRAINT emp_manager_fk\n    EXCEPTIONS INTO exceptions;\n\nALTER TABLE employees NO MEMOPTIMIZE FOR READ\n    ENABLE VALIDATE CONSTRAINT emp_manager_fk\n    EXCEPTIONS INTO exceptions;\n\nALTER TABLE employees MEMOPTIMIZE FOR WRITE\n    ENABLE VALIDATE CONSTRAINT emp_manager_fk\n    EXCEPTIONS INTO exceptions;\n\nALTER TABLE employees NO MEMOPTIMIZE FOR WRITE\n    ENABLE VALIDATE CONSTRAINT emp_manager_fk\n    EXCEPTIONS INTO exceptions;\n\nALTER TABLE employees\n    MODIFY LAST_UPDATE_DATE invisible;\n\nALTER TABLE employees\n    MODIFY LAST_UPDATE_DATE visible;\n\nALTER TABLE employees\n    ADD XMLTYPE;\n\nALTER TABLE PTY_PD_IVSM_MAGR_INFO\n    DROP CONSTRAINT PK_PTY_PD_IVSM_MAGR_INFO\n    CASCADE DROP INDEX;\n\nALTER TABLE TABLE_NAME\nSPLIT PARTITION TABLE_NAME_CURRENT AT (TO_DATE('20240116040241', 'YYYYMMDDHH24MISS'))\nINTO (PARTITION TABLE_NAME_20240116040241, PARTITION TABLE_NAME_CURRENT)\nUPDATE INDEXES;\n\nALTER TABLE TABLE_NAME\nSPLIT PARTITION TABLE_NAME_CURRENT AT (TO_DATE('20240116040241', 'YYYYMMDDHH24MISS'))\nINTO (PARTITION TABLE_NAME_20240116040241, PARTITION TABLE_NAME_CURRENT)\nUPDATE INDEXES (COST_IX (PARTITION C_P1 TABLESPACE TBS_02, PARTITION C_P2 TABLESPACE TBS_03));\n\nALTER TABLE \"AB01\".\"SMOSTAMM\" ADD CONSTRAINT \"CC_SMOSTAMM_KRAB\" CHECK ((KRAB >= 0. ) AND (KRAB <= 100. )) ENABLE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/alter_table_inmemory.sql",
    "content": "-- inmemory_table_clause\nALTER TABLE customer INMEMORY;\n\nALTER TABLE customer NO INMEMORY;\n\n-- inmemory_memcompress\nALTER TABLE customer INMEMORY MEMCOMPRESS FOR DML;\n\nALTER TABLE customer INMEMORY MEMCOMPRESS FOR QUERY;\nALTER TABLE customer INMEMORY MEMCOMPRESS FOR QUERY LOW;\nALTER TABLE customer INMEMORY MEMCOMPRESS FOR QUERY HIGH;\n\nALTER TABLE customer INMEMORY MEMCOMPRESS FOR CAPACITY;\nALTER TABLE customer INMEMORY MEMCOMPRESS FOR CAPACITY LOW;\nALTER TABLE customer INMEMORY MEMCOMPRESS FOR CAPACITY HIGH;\n\nALTER TABLE customer INMEMORY NO MEMCOMPRESS;\n\n-- inmemory_priority\nALTER TABLE customer INMEMORY PRIORITY NONE;\nALTER TABLE customer INMEMORY PRIORITY LOW;\nALTER TABLE customer INMEMORY PRIORITY MEDIUM;\nALTER TABLE customer INMEMORY PRIORITY HIGH;\nALTER TABLE customer INMEMORY PRIORITY CRITICAL;\n\n-- inmemory_distribute\nALTER TABLE customer INMEMORY DISTRIBUTE;\nALTER TABLE customer INMEMORY DISTRIBUTE AUTO;\nALTER TABLE customer INMEMORY DISTRIBUTE BY ROWID RANGE;\nALTER TABLE customer INMEMORY DISTRIBUTE BY PARTITION;\nALTER TABLE customer INMEMORY DISTRIBUTE BY SUBPARTITION;\n\nALTER TABLE customer INMEMORY DISTRIBUTE FOR SERVICE DEFAULT;\nALTER TABLE customer INMEMORY DISTRIBUTE FOR SERVICE ALL;\nALTER TABLE customer INMEMORY DISTRIBUTE FOR SERVICE some_service;\nALTER TABLE customer INMEMORY DISTRIBUTE FOR SERVICE NONE;\n\nALTER TABLE customer INMEMORY DISTRIBUTE BY ROWID RANGE FOR SERVICE DEFAULT;\n\n-- inmemory_duplicate\nALTER TABLE customer INMEMORY DUPLICATE;\nALTER TABLE customer INMEMORY DUPLICATE ALL;\nALTER TABLE customer INMEMORY NO DUPLICATE;\n\n-- inmemory_column_clause\nALTER TABLE customer INMEMORY INMEMORY (customer_name);\nALTER TABLE customer INMEMORY (customer_name, customer_id);\nALTER TABLE customer INMEMORY (name) INMEMORY (customer_id);\nALTER TABLE customer INMEMORY (name) NO INMEMORY (customer_id);\nALTER TABLE customer INMEMORY MEMCOMPRESS FOR QUERY LOW (name) NO INMEMORY (customer_id);\n\n-- verify usage of ... as regular id\nCREATE TABLE vendor (SERVICE VARCHAR2(100));\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/alter_table_modify_partition_by_range.sql",
    "content": "ALTER TABLE table_name\n    MODIFY\n        PARTITION BY RANGE (date_column)\n            INTERVAL ( NUMTODSINTERVAL (1, 'DAY') )\n            (\n                PARTITION\n                    VALUES LESS THAN\n                        (TO_DATE('2024-01-01', 'YYYY-MM-DD'))\n            );\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/alter_table_modify_partition_shrink.sql",
    "content": "ALTER TABLE tft_tsm.t_act_trade_detail MODIFY PARTITION  SYS_P41089 SHRINK SPACE;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/alter_tablespace_set.sql",
    "content": "ALTER TABLESPACE SET ts1\n    FORCE LOGGING;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/alter_tablespaces.sql",
    "content": "ALTER TABLESPACE tbs_01 \n    BEGIN BACKUP; \nALTER TABLESPACE tbs_01\n   END BACKUP;\n\nALTER TABLESPACE tbs_02 OFFLINE NORMAL;\n\nALTER TABLESPACE tbs_02\n  RENAME DATAFILE 'diskb:tbs_f5.dbf'\n  TO              'diska:tbs_f5.dbf';\n\nALTER TABLESPACE tbs_02 ONLINE;\n\nALTER TABLESPACE tbs_03\n    ADD DATAFILE 'tbs_f04.dbf'\n    SIZE 100K\n    AUTOEXTEND ON\n    NEXT 10K\n    MAXSIZE 100K;\n\nALTER TABLESPACE tbs_03\n    DROP DATAFILE 'tbs_f04.dbf';\n\nALTER TABLESPACE temp_demo ADD TEMPFILE 'temp05.dbf' SIZE 5 AUTOEXTEND ON;\n\nALTER TABLESPACE temp_demo DROP TEMPFILE 'temp05.dbf';\n\nALTER TABLESPACE temp_demo SHRINK SPACE;\n\nALTER TABLESPACE omf_ts1 ADD DATAFILE;\n\nALTER TABLESPACE tbs_03 NOLOGGING;\nALTER TABLESPACE undots1\n  RETENTION NOGUARANTEE;\nALTER TABLESPACE undots1\n  RETENTION GUARANTEE;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/alter_view.sql",
    "content": "ALTER VIEW customer_ro\n    COMPILE; \nALTER VIEW customer_ro\n    EDITIONABLE;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/analytic_query.sql",
    "content": "select time_id, product\n   , last_value(quantity ignore nulls) over (partition by product order by time_id) quantity\n   , last_value(quantity respect nulls) over (partition by product order by time_id) quantity\n   from ( select times.time_id, product, quantity \n             from inventory partition by  (product) \n                right outer join times on (times.time_id = inventory.time_id) \n   where times.time_id between to_date('01/04/01', 'dd/mm/yy') \n      and to_date('06/04/01', 'dd/mm/yy')) \n   order by  2,1;\n\nselect times.time_id, product, quantity from inventory \n   partition by  (product) \n   right outer join times on (times.time_id = inventory.time_id) \n   where times.time_id between to_date('01/04/01', 'dd/mm/yy') \n      and to_date('06/04/01', 'dd/mm/yy') \n   order by  2,1;\n\nselect deptno\n   , ename\n   , hiredate\n   , listagg(ename, ',') within group (order by hiredate) over (partition by deptno) as employees\nfrom emp;\n\nselect deptno\n   , ename\n   , hiredate\n   , listagg(ename, ',' ON OVERFLOW ERROR) within group (order by hiredate) over (partition by deptno) as employees\nfrom emp;\n\nselect deptno\n     , ename\n     , hiredate\n     , listagg(ename, ',' ON OVERFLOW TRUNCATE) within group (order by hiredate) over (partition by deptno) as employees\nfrom emp;\n\nselect deptno\n     , ename\n     , hiredate\n     , listagg(UNIQUE ename, ',' ON OVERFLOW TRUNCATE) within group (order by hiredate) over (partition by deptno) as employees\n     , listagg(UNIQUE edepartment, ',' ON OVERFLOW TRUNCATE) within group (order by hiredate) over (partition by deptno) as edepartments\nfrom emp;\n\nselect deptno\n     , ename\n     , hiredate\n     , listagg(UNIQUE ename, (',') || TO_CHAR(13) ON OVERFLOW TRUNCATE) within group (order by hiredate) over (partition by deptno) as employees\nfrom emp;\n\nselect deptno\n     , ename\n     , hiredate\n     , listagg(UNIQUE ename, d ON OVERFLOW TRUNCATE) within group (order by hiredate) over (partition by deptno) as employees\nfrom emp;\n\n select metric_id ,bsln_guid ,timegroup ,obs_value as obs_value \n , cume_dist () over (partition by metric_id, bsln_guid, timegroup order by obs_value ) as cume_dist \n , count(1) over (partition by metric_id, bsln_guid, timegroup ) as n \n , row_number () over (partition by metric_id, bsln_guid, timegroup order by obs_value) as rrank \n , percentile_disc(:b7 ) within group (order by obs_value asc) over (partition by metric_id, bsln_guid, timegroup) as mid_tail_value \n , max(obs_value) over (partition by metric_id, bsln_guid, timegroup ) as max_val \n , min(obs_value) over (partition by metric_id, bsln_guid, timegroup ) as min_val \n , avg(obs_value) over (partition by metric_id, bsln_guid, timegroup ) as avg_val \n , stddev(obs_value) over (partition by metric_id, bsln_guid, timegroup ) as sdev_val \n , percentile_cont(0.25) within group (order by obs_value asc) over (partition by metric_id, bsln_guid, timegroup) as pctile_25 \n , percentile_cont(0.5)  within group (order by obs_value asc) over (partition by metric_id, bsln_guid, timegroup) as pctile_50 \n , percentile_cont(0.75) within group (order by obs_value asc) over (partition by metric_id, bsln_guid, timegroup) as pctile_75 \n , percentile_cont(0.90) within group (order by obs_value asc) over (partition by metric_id, bsln_guid, timegroup) as pctile_90 \n , percentile_cont(0.95) within group (order by obs_value asc) over (partition by metric_id, bsln_guid, timegroup) as pctile_95 \n , percentile_cont(0.99) within group (order by obs_value asc) over (partition by metric_id, bsln_guid, timegroup) as pctile_99\n from timegrouped_rawdata d;\n\nselect trim(both ' ' from '  a  ') from dual where trim(:a) is not null;\n\nwith\nclus_tab as (\nselect id,\na.attribute_name aname,\na.conditional_operator op,\nnvl(a.attribute_str_value,\nround(decode(a.attribute_name, n.col,\na.attribute_num_value * n.scale + n.shift,\na.attribute_num_value),4)) val,\na.attribute_support support,\na.attribute_confidence confidence\nfrom table(dbms_data_mining.get_model_details_km('km_sh_clus_sample')) t,\ntable(t.rule.antecedent) a,\nkm_sh_sample_norm n\nwhere a.attribute_name = n.col (+) and a.attribute_confidence > 0.55\n),\nclust as (\nselect id,\ncast(collect(cattr(aname, op, to_char(val), support, confidence)) as cattrs) cl_attrs\nfrom clus_tab\ngroup by id\n),\ncustclus as (\nselect t.cust_id, s.cluster_id, s.probability\nfrom (select\ncust_id\n, cluster_set(km_sh_clus_sample, null, 0.2 using *) pset\nfrom km_sh_sample_apply_prepared\nwhere cust_id = 101362) t,\ntable(t.pset) s\n)\nselect a.probability prob, a.cluster_id cl_id,\nb.attr, b.op, b.val, b.supp, b.conf\nfrom custclus a,\n(select t.id, c.*\nfrom clust t,\ntable(t.cl_attrs) c) b\nwhere a.cluster_id = b.id\norder by prob desc, cl_id asc, conf desc, attr asc, val asc;\n\nselect\n       row_number() over (partition by hc.id_ws order by hc.lastdate desc) rn1\n     , lag(ascii(hc.status)-32, 1, -1) ignore nulls over (partition by hc.id_ws order by hc.lastdate) lag_st\n     , lead(ascii(hc.status)-32, 1, -1) ignore nulls over (partition by hc.id_ws order by hc.lastdate) lead_st\n     , var_pop(hc.price) over (partition by hc.id_reg) pr_var\n     , wm_concat(hc.code) over (partition by hc.id_reg) reg_codes\n  from history_tbl hc\n where  hc.id_ws in  (select id_ws from ws_tbl where name like 'MX%');\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/analyze.sql",
    "content": "ANALYZE TABLE orders DELETE STATISTICS;\nANALYZE INDEX inv_product_ix VALIDATE STRUCTURE;\nANALYZE TABLE employees VALIDATE STRUCTURE CASCADE;\nANALYZE TABLE customers VALIDATE REF UPDATE;\nANALYZE TABLE customers VALIDATE STRUCTURE ONLINE;\nANALYZE CLUSTER personnel\n    VALIDATE STRUCTURE CASCADE;\nANALYZE TABLE orders\n   LIST CHAINED ROWS INTO chained_rows;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/associate_statistics.sql",
    "content": "ASSOCIATE STATISTICS WITH PACKAGES emp_mgmt DEFAULT SELECTIVITY 10;\nASSOCIATE STATISTICS WITH INDEXES salary_index DEFAULT COST (100,5,0);\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/audit.sql",
    "content": "AUDIT ROLE; \nAUDIT ROLE\n    WHENEVER SUCCESSFUL;\nAUDIT ROLE\n    WHENEVER NOT SUCCESSFUL;\nAUDIT SELECT TABLE, UPDATE TABLE;\nAUDIT SELECT TABLE, UPDATE TABLE\n    BY hr, oe;\nAUDIT DELETE ANY TABLE;\nAUDIT CREATE ANY DIRECTORY;\nAUDIT DIRECTORY;\nAUDIT READ ON DIRECTORY bfile_dir;\nAUDIT SELECT\n    ON hr.employees;\nAUDIT SELECT\n    ON hr.employees\n    WHENEVER SUCCESSFUL;\nAUDIT SELECT\n    ON hr.employees\n    WHENEVER NOT SUCCESSFUL;\nAUDIT INSERT, UPDATE\n    ON oe.customers;\nAUDIT ALL\n    ON hr.employees_seq;\nAUDIT ALTER, GRANT, INSERT, UPDATE, DELETE\n    ON DEFAULT;\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/bindvar01.sql",
    "content": "insert into p\n(\na1,\nb2,\nc3,\nd4,\ne5,\nf6,\ng7,\nh8\n)\nvalues\n( :b1, :b2, :b3, :b4, :5, :6, :7, :8)\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/bindvar02.sql",
    "content": "select *\nfrom a\nwhere a=:3\nand b= : 4\nand c= :5and :a = :b\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/bindvar03.sql",
    "content": "select  count(*), max(scn)\nfrom\n(\n\tselect sp.bo#, sp.pmoptype, sp.scn, sp.flags\n\tfrom sumpartlog$ sp, sumdep$ sd\n\twhere sd.sumobj# = :1 and sd.p_obj# = sp.bo#\n\tgroup by sp.bo#, sp.pmoptype, sp.scn, sp.flags\n\tminus\n\tselect sp.bo#, sp.pmoptype, sp.scn, sp.flags\n\tfrom sumpartlog$ sp\n\twhere sp.bo# not in\n\t(\n\t\tselect sk.detailobj# from sumkey$ sk where sk.sumobj# = :1 and sk.detailcolfunction in (2,3)\n\t)\n\tand bitand(sp.flags, 2) != 2 and sp.pmoptype in (2,3,5,7)\n\tgroup by sp.bo#, sp.pmoptype, sp.scn, sp.flags\n)\nwhere scn > : 2\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/bindvar04.sql",
    "content": "select *\nfrom \n(\n    select *\n    from \"rme\" \"rm\" \n    where \"rm\".a-interval:\"sys_b_07\" day(:\"sys_b_08\") to second(:\"sys_b_09\")\n)\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/bindvar05.sql",
    "content": "select object_name, object_id,\n decode(status, 'INVALID', 'TRUE', 'FALSE') invalid, \n 'TRUE' runnable,\n plsql_debug\nfrom sys.dba_objects o, dba_plsql_object_settings s\nwhere o.owner = :schema\nand s.owner = :schema\nand s.name = o.object_name\nand s.type = 'PACKAGE'\nand object_type = 'PACKAGE'\nand subobject_name is null\nand object_id not in ( select purge_object from recyclebin )\nand upper(object_name) in upper(:name)\n "
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/block01.sql",
    "content": "CREATE OR REPLACE PACKAGE TEST_PKG_LXD\nAS\n-- Package header\n\nPROCEDURE block_test;\n\nEND TEST_PKG_LXD;\n\nCREATE OR REPLACE PACKAGE BODY TEST_PKG_LXD\nAS\n-- Package body\n-- This test case compiles and runs fine on 'Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production'\n\n    PROCEDURE block_test\n    IS\n    BEGIN\n\n        DECLARE\n            v1 PLS_INTEGER := 1;\n        BEGIN\n            dbms_output.put_line('v1=' || v1);\n        END;\n\n        DECLARE\n        BEGIN\n            dbms_output.put_line('empty declare_spec is ok');\n        END;\n\n        BEGIN\n            dbms_output.put_line('no DECLARE no declare_spec is ok too');\n        END;\n\n        -- the block below is invalid\n        -- v2 PLS_INTEGER := 1;\n        -- BEGIN\n        --     dbms_output.put_line('');\n        -- END;\n\n    END block_test;\n\nEND TEST_PKG_LXD;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/block02.sql",
    "content": "-- anonymous block with undocumented NULL option in variable declaration\nDECLARE\n  i INTEGER NULL DEFAULT 0;\nBEGIN\n  dbms_output.put_line(i);\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/bulk_collect_fetch_clause01.sql",
    "content": "declare\n    cursor cur_div is\n        select rid, code from tmp_data_item_value_euro;\n    lvnCount number := 0;\n    type cCurDiv_t is table of cur_div%Rowtype;\n    lvaCurDiv cCurDiv_t;\nbegin\n    open cur_div;\n    \n    loop\n        fetch cur_div bulk collect into lvaCurDiv limit 100000;\n        exit when lvaCurDiv.count = 0;\n \n        forall i in lvaCurDiv.first .. lvaCurDiv.last\n            update data_item_value set unit_code = lvaCurDiv(i).code where rowid = lvaCurDiv(i).rid;      \n            \n        commit;\n    end loop;\n\tclose cur_div;\n    commit;\nend;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/call.sql",
    "content": "CALL my_procedure(arg1 => 3, arg2 => 4) ;\n\nCALL my_procedure(3, 4) ;\n\nCALL my_procedure(3, arg2 => 4) ;\n\nCALL emp_mgmt.remove_dept(162);\n\nCALL warehouse_typ(456, 'Warehouse 456', 2236).ret_name() INTO :x;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/case_when01.sql",
    "content": "select \nROOT,LEV,OBJ,LinK,PaTH,cycle,\n    case\n    when (LEV - LEaD(LEV) over (order by orD)) < 0 then 0\n    else 1\n    end is_LEaF\nfrom T\n\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/case_when02.sql",
    "content": "select\n\tSTaLENESS, OSIZE, OBJ#, TYPE#,\n\tcase\n\twhen STaLENESS > .5 then 128\n\twhen STaLENESS > .1 then 256\n\telse 0\n\tend + aFLaGS aFLaGS,\n\tSTaTUS,\n\tSID,\n\tSERIaL#,\n\tPaRT#,\n\tBO#\n\t,\n\tcase\n\twhen is_FULL_EVENTS_HisTorY = 1 then SRC.Bor_LasT_STaTUS_TIME\n\telse \n\t\tcase GREaTEST (NVL (WP.Bor_LasT_STaT_TIME, date '1900-01-01'), NVL (SRC.Bor_LasT_STaTUS_TIME, date '1900-01-01'))\n\t\twhen date '1900-01-01' then null\n\t\twhen WP.Bor_LasT_STaT_TIME then WP.Bor_LasT_STaT_TIME\n\t\twhen SRC.Bor_LasT_STaTUS_TIME then SRC.Bor_LasT_STaTUS_TIME\n\t\telse null\n\t\tend\n\tend\n\t,\n\tcase GREaTEST (NVL (WP.Bor_LasT_STaT_TIME, date '1900-01-01'), NVL (SRC.Bor_LasT_STaTUS_TIME, date '1900-01-01'))\n\twhen date '1900-01-01' then null\n\twhen WP.Bor_LasT_STaT_TIME then WP.Bor_LasT_STaT_TIME\n\twhen SRC.Bor_LasT_STaTUS_TIME then SRC.Bor_LasT_STaTUS_TIME\n\telse null\n\tend\t\nfrom X\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/case_when03.sql",
    "content": "select\ncase (STaTUS)\nwhen 'N' then 1\nwhen 'B' then 2\nwhen 'a' then 3\nend as STaTE\nfrom VaLUE\nwhere KID=:B2 and RID=:B1\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/case_when04.sql",
    "content": "select\ncase when row_number() over (partition by bo# order by staleness, osize, obj#) = 1 then 32 else 0 end + 64 aflags\nfrom f\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/case_when05.sql",
    "content": "select staleness\n, osize, obj#\n, type#\n, case when row_number() over (partition by bo# order by staleness, osize, obj#) = 1 then 64 else 0 end\n  +\n  case when row_number() over (partition by (select tcp0.bo# from tabcompart$ tcp0 where tcp0.obj#=st0.bo#) order by staleness, osize, obj#) = 1 then 32\n  else 0 end aflags\n, 0 status\n, :b3 sid\n, :b2 serial#\n, part#, bo#\nfrom st0"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/case_when06.sql",
    "content": "SELECT \ncase\n\twhen STaLENESS > .5 then 128\n\twhen STaLENESS > .1 then 256\n\telse 0\n\tend  aFLaGS\n\tFROM employees\n\t"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/case_when07.sql",
    "content": "SELECT h1.CRTYPE , \nCASE 'month'\n          WHEN 'week' THEN TO_CHAR(h1.DateFrom, 'YYYYIW') \n          ELSE to_char(h1.DateFrom,'YYYYMM') \nEND \nFROM CQ_CHANGEREQUESTS h1"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/case_when08.sql",
    "content": "select\n    case when doc is JSON then 'valid' else 'invalid' end\n    from persons p;\n\n       "
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/cast.sql",
    "content": "select\n\traw_value,\n\tcast(raw_value as date, 'YYYY-MM-DD'),\n\tcast(raw_value as date, 'YYYY-MM-DD', 'NLS_DATE_LANGUAGE = RUSSIAN'),\n\tcast(raw_value as number default null on conversion error),\n\tcast(raw_value as number default 9999 on conversion error),\n\tcast(raw_value as date default null on conversion error, 'YYYY-MM-DD'),\n\tcast(raw_value as date default null on conversion error, 'YYYY-MM-DD', 'NLS_DATE_LANGUAGE = RUSSIAN')\nfrom raw_values;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/cast_multiset01.sql",
    "content": "select t1.department_id, t2.* \n   from hr_info t1, table(cast(multiset(\n      select t3.last_name, t3.department_id, t3.salary \n         from people t3\n      where t3.department_id = t1.department_id)\n      as people_tab_typ)) t2\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/cast_multiset02.sql",
    "content": " select title \n from\n table(select courses from department where name = 'history')\n where name like '%etruscan%'\n\t\t\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/cast_multiset03.sql",
    "content": " select\n 1\n , cursor(select 1 from dual) c1\n , cursor(select 2, 3 from dual) as c2\n from\n table(select 1 from dual)\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/cast_multiset04.sql",
    "content": "select e1.last_name from employees e1\n where f( cursor(select e2.hire_date from employees e2 where e1.employee_id = e2.manager_id), e1.hire_date) = 1\norder by last_name"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/cast_multiset05.sql",
    "content": "select *\nfrom\n\ttable\n\t(\n\t\tfunction_name()\n\t)\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/cast_multiset06.sql",
    "content": "select\n\tcast(collect(cattr(aname, op, to_char(val), support, confidence)) as cattrs) cl_attrs\nfrom a\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/cast_multiset08.sql",
    "content": "select * from table (cast (f_int_date_varchar2() as table_int_date_varchar2))\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/cluster.sql",
    "content": "CREATE CLUSTER personnel\n   (department NUMBER(4))\nSIZE 512 \nSTORAGE (initial 100K next 50K);\n\nCREATE INDEX idx_personnel ON CLUSTER personnel;\n\nCREATE CLUSTER language (cust_language VARCHAR2(3))\n   SIZE 512 HASHKEYS 10\n   STORAGE (INITIAL 100k next 50k);\n\nCREATE CLUSTER address\n   (postal_code NUMBER, country_id CHAR(2))\n   HASHKEYS 20\n   HASH IS MOD(postal_code + country_id, 101);\n\nCREATE CLUSTER cust_orders (customer_id NUMBER(6))\n   SIZE 512 SINGLE TABLE HASHKEYS 100;\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/collection_method_invocation.sql",
    "content": "DECLARE\n   TYPE nums_list IS VARRAY(3) OF INTEGER;\n\n   ns nums_list := nums_list(1, 2, 3);\nBEGIN\n\n   DBMS_OUTPUT.PUT_LINE(ns.first);\n   DBMS_OUTPUT.PUT_LINE(ns.prior(3));\n   DBMS_OUTPUT.PUT_LINE(ns.last);\n\n\n   ns.delete;\n   DBMS_OUTPUT.PUT_LINE(ns.count);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/columns01.sql",
    "content": "select a, b,\na d,\nddd as ddd,\nddd as \"dfdf\",\nx as\nfrom dual\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/comment_on.sql",
    "content": "-- column\n\ncomment on column employees.employee_id is 'Primary key of employees table.';\n\ncomment on column hr.employees.employee_id is 'Multiline\ncomment on column.';\n\ncomment on column \"hr\".\"employees\".\"employee_id\" is 'Primary key of employees table.';\n\n\n-- add example: fix when comment on column with schema, the parser is report syntax error\ncomment on column s.a.c1 is 'comment';\n\n-- table\n\ncomment on table employees is 'employees table. Contains 107 rows.';\n\ncomment on table hr.employees is 'employees table. Contains 107 rows.';\n\ncomment on table \"hr\".\"employees\" is 'employees table. Contains 107 rows.';\n\ncomment on table \"my schema\".\"my table\" is 'Some demo table with space in its name\nand a multiline comment.';\n\nCOMMENT ON MATERIALIZED VIEW \"MONITOR\".\"SQL_ALERT_LOG_ERRORS\" IS\n'snapshot table for snapshot MONITOR.SQL_ALERT_LOG_ERRORS';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/comments.sql",
    "content": "-- com1\nselect * /*\ncom2 */\nfrom dual; -- com3\n\nRem  Copyright (c) All Rights Reserved.\n\nprompt . ## Hello world"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/commit.sql",
    "content": "COMMIT;\nCOMMIT WORK;\nCOMMIT WRITE BATCH;\nCOMMIT COMMENT 'TEST' WRITE NOWAIT IMMEDIATE;\nCOMMIT WORK COMMENT 'TEXT';\nCOMMIT FORCE '22.57.53';\nCOMMIT WORK FORCE '22.57.53';\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/concatenation-double_asterisk.sql",
    "content": "CREATE OR REPLACE PACKAGE TEST_PKG_LXD\nAS\n-- Package header\n\nPROCEDURE double_asterisk_test;\n\nEND TEST_PKG_LXD;\n\nCREATE OR REPLACE PACKAGE BODY TEST_PKG_LXD\nAS\n-- Package body\n-- This test case compiles and runs fine on 'Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production'\n\n    PROCEDURE double_asterisk_test\n    IS\n        value number(3);\n    BEGIN\n\n        value := 2 * 2 ** 3;\n        -- The expected output value is 16, and the actual output value is also 16\n        dbms_output.put_line('value=' || value);\n\n    END double_asterisk_test;\n\nEND TEST_PKG_LXD;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/concatenation-mod.sql",
    "content": "CREATE OR REPLACE PACKAGE TEST_PKG_LXD\nAS\n-- Package header\n\nPROCEDURE double_mod;\n\nEND TEST_PKG_LXD;\n\nCREATE OR REPLACE PACKAGE BODY TEST_PKG_LXD\nAS\n-- Package body\n-- This test case compiles and runs fine on 'Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production'\n\n    PROCEDURE double_mod\n    IS\n        value number(3);\n    BEGIN\n\n        value := 17 mod 3 ** 2;\n        -- The expected output value is 8, and the actual output value is also 8\n        dbms_output.put_line('value=' || value);\n\n    END double_mod;\n\nEND TEST_PKG_LXD;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/condition01.sql",
    "content": "select department_id, last_name, salary \n from employees x \n where salary > (select avg(salary) \n from employees \n where x.department_id = department_id) \n order by department_id\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/condition02.sql",
    "content": "select *\n from employees x \n where salary > (select avg(salary) from x)\n and 1 = 1\n and hiredate = sysdate\n and to_yminterval('01-00') < sysdate\n and to_yminterval('01-00') + x < sysdate\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/condition03.sql",
    "content": "select *\n from employees x \n where salary > (select avg(salary) from x)\n and 1 = 1\n and hiredate = sysdate\n and to_yminterval('01-00') < sysdate\n and to_yminterval('01-00') + x < sysdate\n or  a=b\n and d=e\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/condition04.sql",
    "content": "select *\nfrom t\nwhere\n(\n (\n  (\n   (\n    (\n     (\n      (\n       (\n        (\n \t (\n \t  (\n \t   (\n \t    (\n \t     (\n \t      (\n\t       ( type = '2' ) or ( type = '3' )\n  \t      ) and ( t.cde < 20 )\n  \t     ) and ( t.se = 'xxx' )\n  \t    ) and ( t.id = '000000000002' )\n  \t   ) and ( ( t.attr_1 is null ) or ( t.attr_1 = '*' ) )\n  \t  ) and ( ( t.attr_2 is null ) or ( t.attr_2 = '*' ) )\n  \t ) and ( ( t.attr_3 is null ) or ( t.attr_3 = '*' ) )\n     \t) and ( ( t.attr_4 is null ) or ( t.attr_4 = '*' ) )\n       ) and ( ( t.attr_5 is null ) or ( t.attr_5 = '*' ) )\n      ) and ( ( t.itype is null ) or ( t.itype = '*' ) )\n     ) and ( ( t.inbr is null ) or ( t.inbr = '*' ) )\n    ) and ( ( t.stat = '01' ) or ( t.stat = '*' ) )\n   ) and ( ( t.orgn is null ) or ( t.orgn = '*' ) )\n  ) and ( t.mbr = '0000000000001' )\n ) and ( t.nbr is null )\n)\n\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/condition05.sql",
    "content": "select *\nfrom t\nwhere\n ( t.type = '2' ) or ( t.type = '3' )\n and  t.cde < 20 \n and  t.se = 'xxx' \n and  t.id = '000000000002' \n and ( ( t.sku_attr_1 is null ) or ( t.sku_attr_1 = '*' ) )\n and ( ( t.sku_attr_2 is null ) or ( t.sku_attr_2 = '*' ) )\n and ( ( t.sku_attr_3 is null ) or ( t.sku_attr_3 = '*' ) )\n and ( ( t.sku_attr_4 is null ) or ( t.sku_attr_4 = '*' ) )\n and ( ( t.sku_attr_5 is null ) or ( t.sku_attr_5 = '*' ) )\n and ( ( t.itype is null ) or ( t.itype = '*' ) )\n and ( ( t.bnbr is null ) or ( t.bnbr = '*' ) )\n and ( ( t.stat = '01' ) or ( t.stat = '*' ) )\n and ( ( t.orgn is null ) or ( t.orgn = '*' ) )\n and ( t.mbr = '0000000000001' )\n and ( t.nbr is null )\n\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/condition06.sql",
    "content": " select *\nfrom  t1, t2\nwhere (trunc(t1.timestamp) between to_date('110226','yymmdd') and to_date('110326','yymmdd'))\nand t1.code(+) = 'cn'\nand t1.id(+)=t2.id\nand t1.cid=t2.cid\nand t1.mid = 1245714070376993504\nand t1.tmst >= to_date('110226','yymmdd')\n-- note: this is possible too \"column_spec outer_join_sign conditional_operator\nand shipper.alt_party_code(+) is null\nand t2.code(+) = 'sh'\nand t1.sid(+)=t2.sid\nand ( ( t1.scode like 'mmm'  and t2.scode like 'xax' ) )\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/condition07.sql",
    "content": "select *\nfrom append\nwhere\n-- note space between '>' and '='\n(length(w.numer) > = 8)\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/condition08.sql",
    "content": "select *\nfrom \"p\"\nwhere\n-- note there are no parens around 231092\t \n( ( \"p\".\"id\" in 231092 ) )    \n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/condition09.sql",
    "content": "select \n  sum(nvl(pl.qty,0)) \n  from \n  oline ol, \n  pline pl,\n  blocation bl\n  where \n  ol.id = pl.id\n  and pl.no = pl.no\n  and bl.id = pl.id\n  and\n  (\n  \t(select count(*) from la.sa where pl.id like sa.bid) > 0\n\tor\n\t(select count(*) from la.sa where bl.id like sa.id) > 0\n  )\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/condition10.sql",
    "content": "select department_id, last_name, salary \n from employees x \n where\n 1 = 1\n and\n (\n \t(\n\tHI\n\t)\n\t>\n\t(\n\t.1 * T.ROWCNT\n\t)\n )\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/condition11.sql",
    "content": "select distinct X\nfrom X,Y,Z\nwhere\n    X.id = Z.id (+) \nand nvl(X.cid, '^') = nvl(Y.clientid (+), '^') \nand 0 = Lib.SKU(X.sid, nvl(Z.cid, '^')) \n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/condition12.sql",
    "content": "select * from v.e\nwhere\n\tcid <> rid\n\tand  rid  not in\n\t(\n\t\t(select distinct  rid  from  v.s )\n\t\tunion\n\t\t(select distinct  rid  from v.p )\n\t)\n\tand  \"timestamp\"  <= 1298505600000\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/condition14.sql",
    "content": "select * from dual where trim(sxhnode_key) is not null\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/condition15.sql",
    "content": "select\n\t\"a3\".\"r_id\" \"r_id\"\nfrom\n\t\"pe\" \"a3\",\n\t\"me\" \"a2\"\nwhere\n\t \"a3\".\"m_id\"=\"a2\".\"m_id\"\n\t and \"a2\".\"mi_t\" =\n\t any\n\t (((\n\t\tselect \"a4\".\"sys$\".\"id\"\n\t\tfrom t \"a4\"\n\t)))\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/condition16.sql",
    "content": "select * from persons p\n       where value(p) is of type(only employee_t)\n       "
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/connect_by01.sql",
    "content": "with o as\n(\n\tselect 'a' obj, 'b' link from dual union all\n\tselect 'a', 'c' from dual union all\n\tselect      'c', 'd' from dual union all\n\tselect           'd', 'c' from dual union all\n\tselect           'd', 'e' from dual union all\n\tselect                'e', 'e' from dual\n)\nselect \n  connect_by_root obj root,\n  level,\n  obj,link,\n  sys_connect_by_path(obj||'->'||link,','),\n  connect_by_iscycle,\n  connect_by_isleaf\nfrom o\nconnect by nocycle obj=prior link\nstart with obj='a'\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/connect_by02.sql",
    "content": "select lpad(' ',2*(level-1)) || last_name org_chart, \nemployee_id, manager_id, job_id \n    from employees\n    start with job_id = 'ad_pres' \n    connect by prior employee_id = manager_id and level <= 2\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/connect_by03.sql",
    "content": "select lpad(' ',2*(level-1)) || last_name org_chart, \n        employee_id, manager_id, job_id\n    from employees\n    where job_id != 'fi_mgr'\n    start with job_id = 'ad_vp' \n    connect by prior employee_id = manager_id\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/connect_by04.sql",
    "content": "select lpad(' ',2*(level-1)) || last_name org_chart, \n        employee_id, manager_id, job_id\n    from employees\n    start with job_id = 'ad_vp' \n    connect by prior employee_id = manager_id\n\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/connect_by05.sql",
    "content": "with liste as (\n  select substr(:liste, instr(','||:liste||',', ',', 1, rn),\n  instr(','||:liste||',', ',', 1, rn+1) -\n  instr(','||:liste||',', ',', 1, rn)-1) valeur\nfrom (\n  select rownum rn from dual\n  connect by level<=length(:liste) - length(replace(:liste,',',''))+1))\nselect trim(valeur)\nfrom liste\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/context.sql",
    "content": "CREATE CONTEXT hr_context USING emp_mgmt;\n\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_analytic_view.sql",
    "content": "CREATE OR REPLACE ANALYTIC VIEW sales_av\nUSING sales_fact\nDIMENSION BY\n  (time_attr_dim                         -- An attribute dimension of time data\n    KEY month_id REFERENCES month_id\n    HIERARCHIES (\n      time_hier DEFAULT),\n   product_attr_dim                      -- An attribute dimension of product data\n    KEY category_id REFERENCES category_id\n    HIERARCHIES (\n      product_hier DEFAULT),\n   geography_attr_dim                    -- An attribute dimension of store data\n    KEY state_province_id\n    REFERENCES state_province_id HIERARCHIES (\n      geography_hier DEFAULT)\n   )\nMEASURES(\n    sales FACT sales,                      -- A base measure\n    units FACT units,                      -- A base measure\n    -- Calculated measures\n    sales_prior_period AS (LAG(sales) OVER (HIERARCHY time_hier OFFSET 1)),\n    sales_year_ago AS (LAG(sales) OVER (HIERARCHY time_hier OFFSET 1 ACROSS ANCESTOR AT LEVEL year)),\n    chg_sales_year_ago AS (LAG_DIFF(sales) OVER (HIERARCHY time_hier OFFSET 1 ACROSS ANCESTOR AT LEVEL year)),\n    pct_chg_sales_year_ago AS (LAG_DIFF_PERCENT(sales) OVER (HIERARCHY time_hier OFFSET 1 ACROSS ANCESTOR AT LEVEL year)),\n    sales_qtr_ago AS (LAG(sales) OVER (HIERARCHY time_hier OFFSET 1 ACROSS ANCESTOR AT LEVEL quarter)),\n    chg_sales_qtr_ago AS (LAG_DIFF(sales) OVER (HIERARCHY time_hier OFFSET 1 ACROSS ANCESTOR AT LEVEL quarter)),\n    pct_chg_sales_qtr_ago AS (LAG_DIFF_PERCENT(sales) OVER (HIERARCHY time_hier OFFSET 1 ACROSS ANCESTOR AT LEVEL quarter))\n)\nDEFAULT MEASURE SALES;\n\nCREATE OR REPLACE ANALYTIC VIEW sales_av\nUSING av.sales_fact\nDIMENSION BY\n  (time_attr_dim\n    KEY month_id REFERENCES month_id\n    HIERARCHIES (\n      time_hier DEFAULT),\n   product_attr_dim\n    KEY category_id REFERENCES category_id\n    HIERARCHIES (\n      product_hier DEFAULT),\n   geography_attr_dim\n    KEY state_province_id\n    REFERENCES state_province_id\n    HIERARCHIES (\n      geography_hier DEFAULT)\n   )\nMEASURES\n (sales FACT sales,\n  sales_year_ago AS (LAG(sales) OVER (HIERARCHY time_hier OFFSET 1 ACROSS ANCESTOR AT LEVEL year)),\n  sales_pct_chg_year_ago AS (ROUND(LAG_DIFF_PERCENT(sales) OVER (HIERARCHY time_hier OFFSET 1 ACROSS ANCESTOR AT LEVEL year),2)),\n  units FACT units\n  )\nDEFAULT MEASURE SALES;\n\nCREATE OR REPLACE ANALYTIC VIEW sales_av\nUSING av.sales_fact\nDIMENSION BY\n  (time_attr_dim\n    KEY month_id REFERENCES month_id\n    HIERARCHIES (\n      time_hier DEFAULT))\nMEASURES\n (sales FACT sales,\n  avg_sales FACT sales AGGREGATE BY AVG,\n  count_sales FACT sales AGGREGATE BY COUNT,\n  max_sales FACT sales AGGREGATE BY MAX,\n  min_sales FACT sales AGGREGATE BY MIN,\n  stddev_sales FACT sales AGGREGATE BY STDDEV,\n  variance_sales FACT sales AGGREGATE BY VARIANCE,\n  units FACT units,\n  avg_units FACT units AGGREGATE BY AVG\n  )\nDEFAULT MEASURE SALES\nDEFAULT AGGREGATE BY SUM;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_attribute_dimension.sql",
    "content": "CREATE OR REPLACE ATTRIBUTE DIMENSION time_attr_dim\nDIMENSION TYPE TIME\nUSING time_dim\nATTRIBUTES\n (year_id\n   CLASSIFICATION caption VALUE 'YEAR_ID'\n   CLASSIFICATION description VALUE 'YEAR ID',\n  year_name\n    CLASSIFICATION caption VALUE 'YEAR_NAME'\n    CLASSIFICATION description VALUE 'Year',\n  year_end_date\n    CLASSIFICATION caption VALUE 'YEAR_END_DATE'\n    CLASSIFICATION description VALUE 'Year End Date',\n  quarter_id\n    CLASSIFICATION caption VALUE 'QUARTER_ID'\n    CLASSIFICATION description VALUE 'QUARTER ID',\n  quarter_name\n    CLASSIFICATION caption VALUE 'QUARTER_NAME'\n    CLASSIFICATION description VALUE 'Quarter',\n  quarter_end_date\n    CLASSIFICATION caption VALUE 'QUARTER_END_DATE'\n    CLASSIFICATION description VALUE 'Quarter End Date',\n  quarter_of_year\n    CLASSIFICATION caption VALUE 'QUARTER_OF_YEAR'\n    CLASSIFICATION description VALUE 'Quarter of Year',\n  month_id\n    CLASSIFICATION caption VALUE 'MONTH_ID'\n    CLASSIFICATION description VALUE 'MONTH ID',\n  month_name\n    CLASSIFICATION caption VALUE 'MONTH_NAME'\n    CLASSIFICATION description VALUE 'Month',\n  month_long_name\n    CLASSIFICATION caption VALUE 'MONTH_LONG_NAME'\n    CLASSIFICATION description VALUE 'Month Long Name',\n  month_end_date\n    CLASSIFICATION caption VALUE 'MONTH_END_DATE'\n    CLASSIFICATION description VALUE 'Month End Date',\n  month_of_quarter\n    CLASSIFICATION caption VALUE 'MONTH_OF_QUARTER'\n    CLASSIFICATION description VALUE 'Month of Quarter',\n  month_of_year\n    CLASSIFICATION caption VALUE 'MONTH_OF_YEAR'\n    CLASSIFICATION description VALUE 'Month of Year',\n  season\n    CLASSIFICATION caption VALUE 'SEASON'\n    CLASSIFICATION description VALUE 'Season',\n  season_order\n    CLASSIFICATION caption VALUE 'SEASON_ORDER'\n    CLASSIFICATION description VALUE 'Season Order')\nLEVEL month\n  LEVEL TYPE MONTHS\n  CLASSIFICATION caption VALUE 'MONTH'\n  CLASSIFICATION description VALUE 'Month'\n  KEY month_id\n  MEMBER NAME month_name\n  MEMBER CAPTION month_name\n  MEMBER DESCRIPTION month_long_name\n  ORDER BY month_end_date\n  DETERMINES (month_end_date,\n    quarter_id,\n    season,\n    season_order,\n    month_of_year,\n    month_of_quarter)\nLEVEL quarter\n  LEVEL TYPE QUARTERS\n  CLASSIFICATION caption VALUE 'QUARTER'\n  CLASSIFICATION description VALUE 'Quarter'\n  KEY quarter_id\n  MEMBER NAME quarter_name\n  MEMBER CAPTION quarter_name\n  MEMBER DESCRIPTION quarter_name\n  ORDER BY quarter_end_date\n  DETERMINES (quarter_end_date,\n    quarter_of_year,\n    year_id)\nLEVEL year\n  LEVEL TYPE YEARS\n  CLASSIFICATION caption VALUE 'YEAR'\n  CLASSIFICATION description VALUE 'Year'\n  KEY year_id\n  MEMBER NAME year_name\n  MEMBER CAPTION year_name\n  MEMBER DESCRIPTION year_name\n  ORDER BY year_end_date\n  DETERMINES (year_end_date)\nLEVEL season\n  LEVEL TYPE QUARTERS\n  CLASSIFICATION caption VALUE 'SEASON'\n  CLASSIFICATION description VALUE 'Season'\n  KEY season\n  MEMBER NAME season\n  MEMBER CAPTION season\n  MEMBER DESCRIPTION season\nLEVEL month_of_quarter\n  LEVEL TYPE MONTHS\n  CLASSIFICATION caption VALUE 'MONTH_OF_QUARTER'\n  CLASSIFICATION description VALUE 'Month of Quarter'\n  KEY month_of_quarter;\n\nCREATE OR REPLACE ATTRIBUTE DIMENSION product_attr_dim\nUSING product_dim\nATTRIBUTES\n (department_id,\n  department_name,\n  category_id,\n  category_name)\nLEVEL DEPARTMENT\n  KEY department_id\n  ALTERNATE KEY department_name\n  MEMBER NAME department_name\n  MEMBER CAPTION department_name\n  ORDER BY department_name\nLEVEL CATEGORY\n  KEY category_id\n  ALTERNATE KEY category_name\n  MEMBER NAME category_name\n  MEMBER CAPTION category_name\n  ORDER BY category_name\n  DETERMINES(department_id)\nALL MEMBER NAME 'ALL PRODUCTS';\n\nCREATE OR REPLACE ATTRIBUTE DIMENSION geography_attr_dim\nUSING geography_dim\nATTRIBUTES\n (region_id,\n  region_name,\n  country_id,\n  country_name,\n  state_province_id,\n  state_province_name)\nLEVEL REGION\n  KEY region_id\n  ALTERNATE KEY region_name\n  MEMBER NAME region_name\n  MEMBER CAPTION region_name\n  ORDER BY region_name\nLEVEL COUNTRY\n  KEY country_id\n  ALTERNATE KEY country_name\n  MEMBER NAME country_name\n  MEMBER CAPTION country_name\n  ORDER BY country_name\n  DETERMINES(region_id)\nLEVEL STATE_PROVINCE\n  KEY state_province_id\n  ALTERNATE KEY state_province_name\n  MEMBER NAME state_province_name\n  MEMBER CAPTION state_province_name\n  ORDER BY state_province_name\n  DETERMINES(country_id)\nALL MEMBER NAME 'ALL CUSTOMERS';\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_audit_policy.sql",
    "content": "CREATE AUDIT POLICY table_pol\n  PRIVILEGES CREATE ANY TABLE, DROP ANY TABLE;\n\nCREATE AUDIT POLICY dml_pol\n  ACTIONS DELETE on hr.employees,\nINSERT on hr.employees,\nUPDATE on hr.employees,\n    ALL on hr.departments;\nCREATE AUDIT POLICY security_pol\n  ACTIONS ADMINISTER KEY MANAGEMENT;\n\nCREATE AUDIT POLICY dir_pol\n  ACTIONS READ DIRECTORY, WRITE DIRECTORY, EXECUTE DIRECTORY;\n\nCREATE AUDIT POLICY all_actions_pol\n  ACTIONS ALL;\n\nCREATE AUDIT POLICY dp_actions_pol\n  ACTIONS COMPONENT = datapump IMPORT;\n\nCREATE AUDIT POLICY java_pol\n  ROLES java_admin, java_deploy;\n\nCREATE AUDIT POLICY hr_admin_pol\n  PRIVILEGES CREATE ANY TABLE, DROP ANY TABLE\n  ACTIONS DELETE on hr.employees,\nINSERT on hr.employees,\nUPDATE on hr.employees,\n    ALL on hr.departments,\n    LOCK TABLE\n    ROLES audit_admin, audit_viewer;\n\nCREATE AUDIT POLICY order_updates_pol\n  ACTIONS UPDATE ON oe.orders\n                     WHEN 'SYS_CONTEXT(''USERENV'', ''IDENTIFICATION_TYPE'') = ''EXTERNAL'''\n                     EVALUATE PER SESSION;\n\nCREATE AUDIT POLICY emp_updates_pol\n  ACTIONS DELETE on hr.employees,\nINSERT on hr.employees,\nUPDATE on hr.employees\n    WHEN 'UID NOT IN (100, 105, 107)'\n    EVALUATE PER STATEMENT;\n\nCREATE AUDIT POLICY local_table_pol\n  PRIVILEGES CREATE ANY TABLE, DROP ANY TABLE\n  CONTAINER = CURRENT;\n\nCREATE AUDIT POLICY common_role1_pol\n  ROLES c##role1\n  CONTAINER = ALL;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_controlfile.sql",
    "content": "CREATE CONTROLFILE DATABASE \"demo\"\nLOGFILE\n  GROUP 1 '/path/oracle/dbs/t_log1.f'  SIZE 500K,\n  GROUP 2 '/path/oracle/dbs/t_log2.f'  SIZE 500K\nRESETLOGS\ndatafile\n    '/path/file'\nFORCE LOGGING ARCHIVELOG\nCHARACTER SET WE8DEC\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_database.sql",
    "content": "CREATE DATABASE myoracle\n    LOGFILE GROUP 1 ('diska:log1.log', 'diskb:log1.log') SIZE 50K,\n            GROUP 2 ('diska:log2.log', 'diskb:log2.log') SIZE 50K\n    DATAFILE 'diskc:dbone.dbf' SIZE 30M;\n\nCREATE DATABASE sample\n   CONTROLFILE REUSE\n   LOGFILE\n      GROUP 1 ('diskx:log1.log', 'disky:log1.log') SIZE 50K,\n      GROUP 2 ('diskx:log2.log', 'disky:log2.log') SIZE 50K\n   MAXLOGFILES 5\n   MAXLOGHISTORY 100\n   MAXDATAFILES 10\n   MAXINSTANCES 2\n   ARCHIVELOG\n   CHARACTER SET AL32UTF8\n   NATIONAL CHARACTER SET AL16UTF16\n   DATAFILE\n      'disk1:df1.dbf' AUTOEXTEND ON,\n      'disk2:df2.dbf' AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED\n   DEFAULT TEMPORARY TABLESPACE temp_ts\n   UNDO TABLESPACE undo_ts ;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_dimension.sql",
    "content": "CREATE DIMENSION customers_dim \n   LEVEL customer   IS (customers.cust_id)\n   LEVEL city       IS (customers.cust_city) \n   LEVEL state      IS (customers.cust_state_province) \n   LEVEL country    IS (countries.country_id) \n   LEVEL subregion  IS (countries.country_subregion) \n   LEVEL region     IS (countries.country_region) \n   HIERARCHY geog_rollup (\n      customer      CHILD OF\n      city          CHILD OF \n      state         CHILD OF \n      country       CHILD OF \n      subregion     CHILD OF \n      region \n   JOIN KEY (customers.country_id) REFERENCES country\n   )\n   ATTRIBUTE customer DETERMINES\n   (cust_first_name, cust_last_name, cust_gender, \n    cust_marital_status, cust_year_of_birth, \n    cust_income_level, cust_credit_limit) \n   ATTRIBUTE country DETERMINES (countries.country_name)\n;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_directory.sql",
    "content": "CREATE DIRECTORY mydir AS '/scratch/data/file_data';\nCREATE OR REPLACE DIRECTORY bfile_dir AS '/usr/bin/bfile_dir';\nCREATE OR REPLACE DIRECTORY bfile_dir SHARING = NONE AS '/usr/bin/bfile_dir';\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_diskgroup.sql",
    "content": "CREATE DISKGROUP dgroup_01\n  EXTERNAL REDUNDANCY\n  DISK '/devices/disks/c*';\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_edition.sql",
    "content": "CREATE EDITION test_ed;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_flashback_archive.sql",
    "content": "CREATE FLASHBACK ARCHIVE DEFAULT test_archive1\n   TABLESPACE example\n   QUOTA 1 M\n   RETENTION 1 DAY;\n\nCREATE FLASHBACK ARCHIVE test_archive2\n   TABLESPACE example\n   QUOTA 1 M\n   RETENTION 1 DAY;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_function01.sql",
    "content": "CREATE FUNCTION top_protected_f RETURN NUMBER SHARING = NONE\nACCESSIBLE BY (TRIGGER top_trusted_f) AS\nBEGIN RETURN 0.5; END top_protected_f;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_function02.sql",
    "content": "CREATE OR REPLACE EDITIONABLE FUNCTION MY_FUNC RETURN VARCHAR2\nDEFAULT COLLATION USING_NLS_COMP\nAGGREGATE USING MY_AGG_FUNC;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_function03.sql",
    "content": "CREATE FUNCTION process_table(tab       TABLE)\nRETURN TABLE PIPELINED ROW POLYMORPHIC USING process_table_pkg;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_function04.sql",
    "content": "ALTER SESSION SET PLSQL_CCFLAGS = 'my_debug:TRUE';\n\nCREATE OR REPLACE FUNCTION conditional_compilation(val VARCHAR2)\n    RETURN VARCHAR2\n  IS\n\nBEGIN\n    $IF $$my_debug $THEN\n      RETURN '--DEBUG--';\n    $ELSE\n      RETURN val;\n    $END\nEND;\n/\n\n-- SELECT conditional_compilation('hello') FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_function05.sql",
    "content": "CREATE FUNCTION get_val\n   ( x_val IN NUMBER,\n    y_val IN NUMBER,\n    image IN LONG RAW )\n   RETURN BINARY_INTEGER AS LANGUAGE C\n      NAME \"c_get_val\"\n      LIBRARY c_utils\n      PARAMETERS ( c_x_val int\n                 , c_y_val int\n                 , c_image BY REFERENCE byte);\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_function06.sql",
    "content": "CREATE OR REPLACE TYPE DUMMY_TAB\nAS TABLE OF INTEGER;\n\n-- https://docs.oracle.com/cd/B10501_01/appdev.920/a96624/08_subs.htm#19845\nCREATE OR REPLACE FUNCTION fun_pipelined (i INTEGER)\nRETURN dummy_tab PIPELINED PARALLEL_ENABLE\nAS\nBEGIN\n       FOR rec1 in (SELECT i AS outrec from dual)\n       LOOP\n         PIPE ROW (rec1.outrec);\n       END LOOP;\n\n RETURN;\nEND;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_hierarchy.sql",
    "content": "CREATE OR REPLACE HIERARCHY time_hier  -- Hierarchy name\nUSING time_attr_dim               -- Refers to TIME_ATTR_DIM attribute dimension\n (month CHILD OF                  -- Months in the attribute dimension\n quarter CHILD OF\n year);\n\nCREATE OR REPLACE HIERARCHY product_hier\nUSING product_attr_dim\n (category\n  CHILD OF department);\n\nCREATE OR REPLACE HIERARCHY geography_hier\nUSING geography_attr_dim\n (state_province\n  CHILD OF country\n  CHILD OF region);\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_index.sql",
    "content": "CREATE INDEX \"NORTHWIND\".\"IDX_CUSTOMERS_REGION\" ON \"NORTHWIND\".\"CUSTOMERS\" (\"REGION\") \n  PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS \n  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645\n  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1\n  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)\n  TABLESPACE \"USERS\" ;\n\nCREATE INDEX INDEX_SYS_LOG_YEAR ON SYS_LOG (YEAR)\n    GLOBAL PARTITION BY RANGE (YEAR)\n      (PARTITION p1 VALUES LESS THAN (1970),\n       PARTITION p2 VALUES LESS THAN (2000),\n       PARTITION p2 VALUES LESS THAN (2030),\n       PARTITION p3 VALUES LESS THAN (MAXVALUE));\n\nCREATE UNIQUE INDEX order_index ON t_order (order_id) IMMEDIATE INVALIDATION;\nCREATE UNIQUE INDEX order_index ON t_order (order_id) DEFERRED INVALIDATION;\n\nCREATE INDEX the_index IF NOT EXISTS ON t_order (order_id);\n\nCREATE INDEX part_idx ON partitioned_by_ts (part)\n    GLOBAL PARTITION BY RANGE (part)\n        (PARTITION t0 VALUES LESS THAN (TIMESTAMP '2020-01-01 00:00:00') );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_inmemory_join_group.sql",
    "content": "CREATE INMEMORY JOIN GROUP prod_id1\n  (inventories(product_id), order_items(product_id));\nCREATE INMEMORY JOIN GROUP prod_id2\n  (inventories(product_id), pm.online_media(product_id));\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_java.sql",
    "content": "CREATE JAVA CLASS USING BFILE (java_dir, 'Agent.class')\n;\n-- requires / as a stmt delimiter\n-- CREATE JAVA SOURCE NAMED \"Welcome\" AS\n--    public class Welcome {\n--       public static String welcome() {\n--          return \"Welcome World\";   } }\n-- /\nCREATE JAVA RESOURCE NAMED \"appText\"\n   USING BFILE (java_dir, 'textBundle.dat')\n;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_library.sql",
    "content": "CREATE LIBRARY ext_lib AS 'ddl_1' IN ddl_dir;\nCREATE OR REPLACE LIBRARY ext_lib AS 'ddl_1' IN ddl_dir CREDENTIAL ddl_cred;\nCREATE LIBRARY ext_lib AS '/OR/lib/ext_lib.so';\nCREATE OR REPLACE LIBRARY ext_lib IS '/OR/newlib/ext_lib.so';\nCREATE LIBRARY app_lib as '${ORACLE_HOME}/lib/app_lib.so' AGENT 'sales.hq.example.com';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_lockdown_profile.sql",
    "content": "CREATE LOCKDOWN PROFILE hr_prof INCLUDING PRIVATE_DBAAS;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_materialized_zonemap.sql",
    "content": "CREATE MATERIALIZED ZONEMAP sales_zmap\n  ON sales(cust_id, prod_id);\n\nCREATE MATERIALIZED ZONEMAP sales_zmap\n  AS SELECT SYS_OP_ZONE_ID(rowid),\n            MIN(cust_id), MAX(cust_id),\n            MIN(prod_id), MAX(prod_id)\n     FROM sales\n     GROUP BY SYS_OP_ZONE_ID(rowid);\n\nCREATE MATERIALIZED ZONEMAP sales_zmap\n  AS SELECT SYS_OP_ZONE_ID(s.rowid),\n            MIN(cust_state_province), MAX(cust_state_province),\n            MIN(cust_city), MAX(cust_city)\n     FROM sales s\n              LEFT OUTER JOIN customers c ON s.cust_id = c.cust_id\n     GROUP BY SYS_OP_ZONE_ID(s.rowid);\n\nCREATE MATERIALIZED ZONEMAP sales_zmap\n  AS SELECT SYS_OP_ZONE_ID(s.rowid),\n            MIN(prod_category), MAX(prod_category),\n            MIN(prod_subcategory), MAX(prod_subcategory),\n            MIN(country_id), MAX(country_id),\n            MIN(cust_state_province), MAX(cust_state_province),\n            MIN(cust_city), MAX(cust_city)\n     FROM sales s\n              LEFT OUTER JOIN products p ON s.prod_id = p.prod_id\n              LEFT OUTER JOIN customers c ON s.cust_id = c.cust_id\n     GROUP BY sys_op_zone_id(s.rowid);\n\nCREATE MATERIALIZED ZONEMAP sales_zmap\n  AS SELECT SYS_OP_ZONE_ID(s.rowid),\n            MIN(prod_category), MAX(prod_category),\n            MIN(prod_subcategory), MAX(prod_subcategory),\n            MIN(country_id), MAX(country_id),\n            MIN(cust_state_province), MAX(cust_state_province),\n            MIN(cust_city), MAX(cust_city)\n     FROM sales s, products p, customers c\n     WHERE s.prod_id = p.prod_id(+) AND\n                    s.cust_id = c.cust_id(+)\n     GROUP BY sys_op_zone_id(s.rowid);\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_operator.sql",
    "content": "CREATE OPERATOR eq_op\n   BINDING (VARCHAR2, VARCHAR2) \n   RETURN NUMBER \n   USING eq_f;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_outline.sql",
    "content": "CREATE OUTLINE salaries FOR CATEGORY special\n   ON SELECT last_name, salary FROM employees;\nCREATE OR REPLACE PRIVATE OUTLINE my_salaries\n   FROM salaries;\nCREATE OR REPLACE OUTLINE public_salaries\n   FROM PRIVATE my_salaries;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_package.sql.tree",
    "content": "(sql_script (unit_statement (create_package CREATE PACKAGE (package_name (identifier (id_expression (regular_id EMP_BONUS)))) AS (package_obj_spec (variable_declaration (identifier (id_expression (regular_id LOCAL_PARAM))) (type_spec (datatype (native_datatype_element NUMBER))) ;)) (package_obj_spec (exception_declaration (identifier (id_expression (regular_id USER_EXCEPTION))) EXCEPTION ;)) (package_obj_spec (procedure_spec PROCEDURE (identifier (id_expression (regular_id CALC_BONUS))) ( (parameter (parameter_name (identifier (id_expression (regular_id DATE_HIRED)))) (type_spec (datatype (native_datatype_element DATE)))) ) ;)) END (package_name (identifier (id_expression (regular_id EMP_BONUS)))))) ; <EOF>)"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_package01.sql",
    "content": "CREATE PACKAGE EMP_BONUS AS\nLOCAL_PARAM NUMBER;\nUSER_EXCEPTION EXCEPTION;\nPROCEDURE CALC_BONUS (DATE_HIRED DATE);\nEND EMP_BONUS;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_package02.sql",
    "content": "CREATE OR REPLACE PACKAGE calendar_data AUTHID DEFINER AS\n       TYPE calcurtyp IS REF CURSOR RETURN d_months%ROWTYPE;\n       PROCEDURE open_cal_cv (cal_cv IN OUT calcurtyp, year_id INT);\nEND calendar_data;\n\nCREATE OR REPLACE PACKAGE BODY calendar_data AS\n  PROCEDURE open_cal_cv (cal_cv IN OUT calcurtyp, year_id INT)\n  PARALLEL_ENABLE\n  /* although PARALLEL_ENABLE is legal for procedures,\n       the following part of the clause will cause PLS-00655 error, if uncommented:\n       (PARTITION cal_cv BY ANY) */\n  IS\n  BEGIN\n      OPEN cal_cv FOR SELECT *\n      FROM d_months\n      WHERE year_id = year_id;\n  END open_cal_cv;\nEND calendar_data;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_package03.sql",
    "content": "CREATE OR REPLACE PACKAGE pkg_prc_with_properties AS\n  PROCEDURE access_prc_with_properties;\n\n  PRAGMA DEPRECATE(prc_with_properties, 'no more supported');\n\n  PROCEDURE prc_with_properties\n    PARALLEL_ENABLE\n    ACCESSIBLE BY (PROCEDURE access_prc_with_properties);\n\n  END pkg_prc_with_properties;\n/\n\nCREATE OR REPLACE PACKAGE BODY pkg_prc_with_properties AS\n  PROCEDURE access_prc_with_properties\n    IS\n  BEGIN\n     prc_with_properties();\n  END access_prc_with_properties;\n\n  PROCEDURE prc_with_properties\n    PARALLEL_ENABLE\n    ACCESSIBLE BY (PROCEDURE access_prc_with_properties)\n    IS\n  BEGIN\n     DBMS_OUTPUT.PUT_LINE('I have properties!');\n  END prc_with_properties;\n\nEND pkg_prc_with_properties;\n/\n\nCALL pkg_prc_with_properties.access_prc_with_properties();\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_package04.sql",
    "content": "CREATE OR REPLACE PACKAGE initialized_package AS\n\n  END initialized_package;\n/\n\nCREATE OR REPLACE PACKAGE BODY initialized_package AS\n\n\n  BEGIN\n    DBMS_OUTPUT.PUT_LINE('Initialized');\n  EXCEPTION\n    WHEN OTHERS THEN\n      DBMS_OUTPUT.PUT_LINE('ERROR!');\n      RAISE;\nEND initialized_package;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_package05.sql",
    "content": "create or replace package pkg_fun_with_streaming is\n\n  type t_change is record(\n     guid   raw(16)\n   );\n\n\n  type t_message is record(\n    guid raw(16)\n  );\n\n  type t_change_cur is ref cursor return t_change;\n\n  type t_message_tab is table of t_message not null index by int;\n\n\n  function prep_messages(p_changes t_change_cur)\n    return t_message_tab\n    pipelined cluster p_changes by(guid)\n    parallel_enable(partition p_changes by hash(guid));\n\nend;\n/\n\ncreate or replace package body pkg_fun_with_streaming is\n\n  function prep_messages(p_changes t_change_cur)\n    return t_message_tab\n    pipelined cluster p_changes by(guid)\n    parallel_enable(partition p_changes by hash(guid)) is\n\n    l_rec     t_change;\n    l_message t_message;\n\n  begin\n\n    loop\n      fetch p_changes\n        into l_rec;\n\n\n        if l_rec.guid is not null\n        then\n          pipe row(l_message);\n\n        end if;\n\n    end loop;\n\n  end prep_messages;\n\n\nend pkg_fun_with_streaming;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_pmem_filestore.sql",
    "content": "CREATE PMEM FILESTORE cloud_db_1 MOUNTPOINT '/corp/db/cloud_db_1'\n    BACKINGFILE '/var/pmem/foo_1.' SIZE 2T BLOCKSIZE 8K\n    AUTOEXTEND ON NEXT 10G MAXSIZE 3T\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_procedure01.sql",
    "content": "CREATE OR REPLACE PROCEDURE PROC(PARAM NUMBER)\nIS\nLOCAL_PARAM NUMBER;\nUSER_EXCEPTION EXCEPTION;\nBEGIN\nLOCAL_PARAM:=0;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_procedure01.sql.tree",
    "content": "(sql_script (unit_statement (create_procedure_body CREATE OR REPLACE PROCEDURE (procedure_name (identifier (id_expression (regular_id PROC)))) ( (parameter (parameter_name (identifier (id_expression (regular_id (non_reserved_keywords_pre12c PARAM))))) (type_spec (datatype (native_datatype_element NUMBER)))) ) IS (seq_of_declare_specs (declare_spec (variable_declaration (identifier (id_expression (regular_id LOCAL_PARAM))) (type_spec (datatype (native_datatype_element NUMBER))) ;)) (declare_spec (exception_declaration (identifier (id_expression (regular_id USER_EXCEPTION))) EXCEPTION ;))) (body BEGIN (seq_of_statements (statement (assignment_statement (general_element (general_element_part (id_expression (regular_id LOCAL_PARAM)))) := (expression (logical_expression (unary_logical_expression (multiset_expression (relational_expression (compound_expression (concatenation (model_expression (unary_expression (atom (constant (numeric 0)))))))))))))) ;) END))) ; <EOF>)"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_procedure02.sql",
    "content": "CREATE OR REPLACE PROCEDURE prc_calendar_data (cal_cv IN OUT calendar_data.calcurtyp, year_id INT)\n    PARALLEL_ENABLE\n    /* although PARALLEL_ENABLE is legal for procedures,\n       the following part of the clause will cause PLS-00655 error, if uncommented:\n       (PARTITION cal_cv BY ANY) */\n    AS\nBEGIN\n   OPEN cal_cv FOR SELECT *\n      FROM d_months\n      WHERE year_id = year_id;\nEXCEPTION WHEN OTHERS THEN\n  raise_application_error(-20001, 'Error!');\nEND;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_procedure03.sql",
    "content": "CREATE OR REPLACE PROCEDURE prc_hw\n  IS\nBEGIN\n    DBMS_OUTPUT.PUT_LINE('Hello World!');\nEND;\n/\n\nCREATE OR REPLACE PROCEDURE prc_pragma_inline\n  IS\nBEGIN\n    PRAGMA INLINE (prc_hw, 'YES');\n\n    DBMS_OUTPUT.PUT_LINE('');\nEND;\n/\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_profile.sql",
    "content": "CREATE MANDATORY PROFILE c##cdb_profile\nLIMIT PASSWORD_VERIFY_FUNCTION my_mandatory_function\nCONTAINER = ALL;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_restore_point.sql",
    "content": "CREATE RESTORE POINT good_data;\nCREATE RESTORE POINT rp2 for pluggable database pdb;\nCREATE RESTORE POINT rp2 for pluggable database pdb preserve;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_role.sql",
    "content": "create role TEST_ROLE_AAA ;\n\ncreate role TEST_ROLE_BBB  NOT IDENTIFIED ;\n\ncreate role TEST_ROLE_CCC IDENTIFIED BY TEST_ROLE_AAA;\n\ncreate role TEST_ROLE_DDD  IDENTIFIED EXTERNALLY;\n\ncreate role TEST_ROLE_EEE IDENTIFIED GLOBALLY;\n\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_rollback_segment.sql",
    "content": "CREATE ROLLBACK SEGMENT rbs_one TABLESPACE rbs_ts;\n\nCREATE ROLLBACK SEGMENT rbs_one\n   TABLESPACE rbs_ts\n   STORAGE\n   ( INITIAL 10K\n     NEXT 10K\n     MAXEXTENTS UNLIMITED );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_spfile.sql",
    "content": "CREATE SPFILE\n   FROM PFILE = '$ORACLE_HOME/work/t_init1.ora';\n\nCREATE SPFILE = 's_params.ora'\n   FROM PFILE = '$ORACLE_HOME/work/t_init1.ora';\n\nCREATE SPFILE = 's_params.ora'\n   FROM PFILE = '$ORACLE_HOME/work/t_init1.ora' AS COPY;\n\nCREATE SPFILE = 's_params.ora'\n   FROM MEMORY;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_synonym01.sql",
    "content": "create public synonym emp for hr.employees\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_synonym02.sql",
    "content": "create synonym hr.chicago_employees for hr.employees@chicago_db"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_synonym03.sql",
    "content": "create or replace public synonym depts for departments"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_table.sql",
    "content": "CREATE TABLE employee (\n     first_name VARCHAR2(128),\n     last_name VARCHAR2(128),\n     empID NUMBER,\n     salary NUMBER(6) ENCRYPT\n);\nCREATE TABLE employee (\n     first_name VARCHAR2(128),\n     last_name VARCHAR2(128),\n     empID NUMBER ENCRYPT NO SALT,\n     salary NUMBER(6) ENCRYPT USING '3DES168'\n);\n\nCREATE TABLE persons OF person\n  ( homeaddress NOT NULL,\n      UNIQUE (homeaddress.phone),\n      CHECK (homeaddress.zip IS NOT NULL),\n      CHECK (homeaddress.city <> 'San Francisco') );\n\nCREATE TABLE purchaseorder_as_table OF XMLType\n  XMLSCHEMA \"http://xmlns.oracle.com/xdb/documentation/purchaseOrder.xsd\"\n  ELEMENT \"PurchaseOrder\";\n\nCREATE TABLE purchaseorder_as_column OF XMLType\n  XMLTYPE COLUMN xml_document\n  ELEMENT\n    \"http://xmlns.oracle.com/xdb/documentation/purchaseOrder.xsd#PurchaseOrder\";\n\nCREATE TABLE po_binaryxml OF XMLType\n XMLTYPE STORE AS BINARY XML\n VIRTUAL COLUMNS\n (DATE_COL AS (XMLCast(XMLQuery('/PurchaseOrder/@orderDate'\n PASSING OBJECT_VALUE RETURNING CONTENT)\n AS DATE))) ;\n\nCREATE TABLE po_binary OF XMLType;\n\ncreate table junk (\n       me date,\n       primary key (me)\n);\n\nCREATE TABLE TEST\n      AS \n      WITH TESTCTE AS (\n        SELECT 1 ONE FROM DUAL\n      )\n      SELECT 'A', 'B', 'C'\n      FROM DUAL\n      JOIN TESTCTE;\n\nCREATE TABLE DEMO (\n    ID NUMBER GENERATED BY DEFAULT AS IDENTITY,\n    TEST VARCHAR2(100) NOT NULL\n);\n\nCREATE TABLE DEMO (\n    ID NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY,\n    TEST VARCHAR2(100) NOT NULL\n);\n\nCREATE TABLE DEMO (\n    ID NUMBER GENERATED ALWAYS AS IDENTITY,\n    TEST VARCHAR2(100) NOT NULL\n);\n\nCREATE TABLE products (\n    id NUMBER(4) GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH 101) NOT NULL PRIMARY KEY,\n    name VARCHAR2(255) NOT NULL,\n    description VARCHAR2(512),\n    weight FLOAT,\n    PRICE NUMERIC(10,-2)\n);\n\nCREATE TABLE products (\n    id NUMBER(4) GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH 101 INCREMENT BY 1 CYCLE CACHE 200) NOT NULL PRIMARY KEY,\n    name VARCHAR2(255) NOT NULL,\n    description VARCHAR2(512),\n    weight FLOAT,\n    PRICE NUMERIC(10,-2)\n);\n\ncreate table \"DVSADM\".CMP3$58238005 nocompress tablespace \"DVS_PROOF\" nologging lob (VALUE) store as (tablespace \"DVS_PROOF\" enable storage in row nocache nologging) as select /*+ DYNAMIC_SAMPLING(0) FULL(\"DVSADM\".\"DVS_ARCHIVE\") */ * from \"DVSADM\".\"DVS_ARCHIVE\" sample block( 6.734) mytab;\n\nCREATE TABLE \"APPLSYS\".\"FND_SEC_GUIDELINES_TL\" (\n    \"CODE\" VARCHAR2(20) NOT NULL ENABLE,\n    \"TITLE\" VARCHAR2(100) NOT NULL ENABLE,\n    \"DESCRIPTION\" VARCHAR2(2000) NOT NULL ENABLE,\n    \"INFO\" CLOB NOT NULL ENABLE,\n    \"LANGUAGE\" VARCHAR2(30) NOT NULL ENABLE,\n    \"SOURCE_LANG\" VARCHAR2(4) NOT NULL ENABLE,\n    \"CREATED_BY\" VARCHAR2(30) NOT NULL ENABLE,\n    \"CREATION_DATE\" DATE NOT NULL ENABLE,\n    \"LAST_UPDATED_BY\" NUMBER(15,0) NOT NULL ENABLE,\n    \"LAST_UPDATE_DATE\" DATE NOT NULL ENABLE,\n    \"LAST_UPDATE_LOGIN\" NUMBER(15,0))\n    PCTFREE 10 PCTUSED 40 INITRANS 10 MAXTRANS 255 LOGGING\n    STORAGE(\n        INITIAL 4096\n        NEXT 131072\n        MINEXTENTS 1\n        MAXEXTENTS 2147483645\n        PCTINCREASE 0\n        FREELISTS 4\n        FREELIST GROUPS 4\n        BUFFER_POOL DEFAULT)\n    TABLESPACE \"APPS_TS_TX_DATA\"\n    LOB (\"INFO\")\n    STORE AS (\n        TABLESPACE \"APPS_TS_TX_DATA\" ENABLE STORAGE IN ROW CHUNK 8192 PCTVERSION 10\n        NOCACHE\n        STORAGE(\n            INITIAL 4096\n            NEXT 131072\n            MINEXTENTS 1\n            MAXEXTENTS 2147483645\n            PCTINCREASE 0\n            FREELISTS 4\n            FREELIST GROUPS 4\n            BUFFER_POOL DEFAULT))\n;\n\nCREATE TABLE CATEGORIES (\t\n    \"CATEGORY_ID\" NUMBER(9,0), \n\t\"CATEGORY_NAME\" VARCHAR2(15 BYTE), \n\t\"DESCRIPTION\" VARCHAR2(2000 BYTE), \n\t\"PICTURE\" VARCHAR2(255 BYTE)\n) SEGMENT CREATION IMMEDIATE PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) TABLESPACE \"USERS\" ;\n\nCREATE TABLE \"t_ddl_0027\"(\n    \"PID\" INT,\n    \"FID\" INT,\n    \"NAME\" VARCHAR(50) DEFAULT 'Tom',\n    \"ADDRESS\" VARCHAR(50) NOT NULL,\n    \"DEPT\" VARCHAR(50),\n    CONSTRAINT \"PK_ID\" PRIMARY KEY(\"PID\"),\n    CONSTRAINT \"CK_DEPT\" CHECK (\"DEPT\" IN('IT', 'SALES', 'MANAGER')));\n\nCREATE TABLE \"C##RCUSER\".\"JSON_TRANS\"(\n    \"ID\" NUMBER(8,0) NOT NULL ENABLE,\n    \"TRANS_MSG\" CLOB,\n    CONSTRAINT \"CHECK_JSON\" CHECK (trans_msg is json) ENABLE,\n    PRIMARY KEY (\"ID\") USING INDEX ENABLE,\n    SUPPLEMENTAL LOG DATA (ALL) COLUMNS);\n\nCREATE TABLE \"ASEDBUSR\".\"ECLAIMPROCESS\"\n(\t\"PKEY\" NUMBER(12,0) NOT NULL ENABLE,\n\t\"BOID\" VARCHAR2(40 CHAR) NOT NULL ENABLE,\n\t\"METABO\" NUMBER(12,0) NOT NULL ENABLE,\n\t\"LASTUPDATE\" TIMESTAMP (9) NOT NULL ENABLE,\n\t\"PROCESSID\" VARCHAR2(40 CHAR) NOT NULL ENABLE,\n\t\"ROWCOMMENT\" VARCHAR2(15 CHAR),\n\t\"CREATED\" TIMESTAMP (9) NOT NULL ENABLE,\n\t\"CREATEDUSER\" VARCHAR2(40 CHAR) NOT NULL ENABLE,\n\t\"REPLACED\" TIMESTAMP (9) NOT NULL ENABLE,\n\t\"REPLACEDUSER\" VARCHAR2(40 CHAR),\n\t\"ITSPROCSUMPKOGU\" VARCHAR2(40 CHAR),\n\t\"ITSPROCSUMINVOICE\" VARCHAR2(40 CHAR) NOT NULL ENABLE,\n\t\"IMPORTDATE\" DATE NOT NULL ENABLE,\n\t\"BATCHIMPORTSTATUS\" VARCHAR2(40 CHAR) NOT NULL ENABLE,\n\t\"ITSECLAIMPROCVERS\" VARCHAR2(40 CHAR),\n\t\"ITSECLAIMPROCPAT\" VARCHAR2(40 CHAR),\n\t\"ITSPROCVERANLASSLE\" VARCHAR2(40 CHAR),\n\t\"ITSPROCAUSFUEHRLE\" VARCHAR2(40 CHAR),\n\t\"ITSPROCRECHSTELLER\" VARCHAR2(40 CHAR),\n\t\"ITSPROCBEARBOE\" VARCHAR2(40 CHAR),\n\t\"ITSPROCBEARBUSER\" VARCHAR2(40 CHAR),\n\t\"ITSSUMPROCZAHLER\" VARCHAR2(40 CHAR),\n\t\"ITSECLAIMSCHADEN\" VARCHAR2(40 CHAR),\n\t\"ITSECPLSTABRTYP\" VARCHAR2(40 CHAR),\n\t\"ITSECLAIMLSTFALL\" VARCHAR2(40 CHAR),\n\t\"ITSECLAIMFDOSSIER\" VARCHAR2(40 CHAR),\n\t\"VERARBEITUNGCOUNT\" NUMBER(12,0),\n\t\"ITSPROCBATCHLAUF\" VARCHAR2(40 CHAR),\n\t\"VORBEHALTOVR\" NUMBER(12,0) NOT NULL ENABLE,\n\t\"LSTSPERRENOVR\" NUMBER(12,0) NOT NULL ENABLE,\n\t\"SISTIERUNGOVR\" NUMBER(12,0) NOT NULL ENABLE,\n\t\"RUECKWEISUNGTEXT\" VARCHAR2(350 CHAR),\n\t\"FEHLERTEXT\" VARCHAR2(1024 CHAR),\n\t\"PROVSTATUS\" VARCHAR2(40 CHAR),\n\t\"ECLAIMSTATUS\" VARCHAR2(40 CHAR) NOT NULL ENABLE,\n\t\"SBENTSCHEID\" VARCHAR2(40 CHAR) NOT NULL ENABLE,\n\t\"ITSSUMPROCLSTABR\" VARCHAR2(40 CHAR),\n\t\"RESPONSE\" VARCHAR2(4000 CHAR),\n\t\"MODIFIALLOWED\" VARCHAR2(40 CHAR),\n\t\"LSTAUFSCHUBOVR\" NUMBER(12,0) NOT NULL ENABLE,\n\t\"ISEXTERNALSTORED\" VARCHAR2(40 CHAR) NOT NULL ENABLE,\n\t\"ITSPROCGBEREICH\" VARCHAR2(40 CHAR) NOT NULL ENABLE,\n\t\"ITSPROCECLAIMMAND\" VARCHAR2(40 CHAR),\n\t\"HABEGRUENDUNG\" VARCHAR2(40 CHAR),\n\t\"ITSKUERZUNG\" VARCHAR2(40 CHAR),\n\t\"KUERZUNGPROZENT\" NUMBER(9,2),\n\t\"ITSSUMPROCKOGU\" VARCHAR2(40 CHAR),\n\t\"EKOGURUECKWCODE\" VARCHAR2(40 CHAR),\n\t\"EKOGUERLEDIGTCODE\" VARCHAR2(40 CHAR),\n\t\"SECONDOPINION\" VARCHAR2(40 CHAR),\n\t\"ITSTHERAPIEMETHODE\" VARCHAR2(40 CHAR),\n\t\"ITSPROCSUMKOGU\" VARCHAR2(40 CHAR),\n\t\"ITSLERBMELDUNG\" VARCHAR2(40 CHAR),\n\t\"PROCBEHANDORTOVR\" NUMBER(12,0) NOT NULL ENABLE,\n\t\"ITSAUSZAHLUNGSTYP\" VARCHAR2(40 CHAR),\n\t\"AUSZAHLTYPOVR\" NUMBER(12,0) NOT NULL ENABLE,\n\t\"VERARBEITSTATUS\" VARCHAR2(40 CHAR) NOT NULL ENABLE,\n\t\"FOREIGNCURRACTIV\" NUMBER(12,0) NOT NULL ENABLE,\n\t\"PROCRECHSTOVR\" NUMBER(12,0) NOT NULL ENABLE,\n\t\"ISESR\" VARCHAR2(40 CHAR),\n\t\"ITSKSKTARKOST\" VARCHAR2(40 CHAR),\n\t\"ITSPROCBEHANDORT\" VARCHAR2(40 CHAR),\n\t\"STATUS\" VARCHAR2(40 CHAR) NOT NULL ENABLE,\n\t\"ERFREVISION\" NUMBER(12,0) NOT NULL ENABLE,\n\t\"ITSXMLSTORE\" VARCHAR2(40 CHAR),\n\t\"ITSANNULXMLSTORE\" VARCHAR2(40 CHAR),\n\t\"VORBESCHEXPFREIG\" VARCHAR2(40 CHAR),\n\t\"EINFEXPFREIG\" VARCHAR2(40 CHAR),\n\t\"SANKTIONSTUFEFLAG\" VARCHAR2(40 CHAR),\n\t\"SANKTIONSTUFEOVR\" NUMBER(12,0) NOT NULL ENABLE,\n\t\"BESTDATNOTENKURS\" DATE,\n\t\"RKOPFCOMMENT\" VARCHAR2(255 CHAR),\n\t\"INTERNCOMMENT\" VARCHAR2(4000 CHAR),\n\t\"OVRINTERNCOMMENT\" NUMBER(12,0) NOT NULL ENABLE,\n\t\"COMMENTLERB\" VARCHAR2(4000 CHAR),\n\t\"COMMENTLERBOVR\" VARCHAR2(4000 CHAR),\n\t\"COMMENTLERBKOPF\" VARCHAR2(1000 CHAR),\n\t\"COMMENTLERBKOPFPOS\" VARCHAR2(40 CHAR),\n\t\"OVRCOMMENTLERB\" NUMBER(12,0) NOT NULL ENABLE,\n\t\"OVRCOMMENTLERBKOPF\" NUMBER(12,0) NOT NULL ENABLE,\n\t\"COMMENTVERS\" VARCHAR2(4000 CHAR),\n\t\"COMMENTVERSOVR\" VARCHAR2(4000 CHAR),\n\t\"OVRCOMMENTVERS\" NUMBER(12,0) NOT NULL ENABLE,\n\t\"OVRCOMMENTVERSKOPF\" NUMBER(12,0) NOT NULL ENABLE,\n\t\"COMMENTVERSKOPF\" VARCHAR2(1000 CHAR),\n\t\"COMMENTVERSKOPFPOS\" VARCHAR2(40 CHAR),\n\t\"USEESRREDBANKINFO\" VARCHAR2(40 CHAR),\n\t\"ISKOGU\" VARCHAR2(40 CHAR) NOT NULL ENABLE,\n\t\"ITSBEHANDLUNG\" VARCHAR2(40 CHAR),\n\t\"ITSSTORNOECLPROC\" VARCHAR2(40 CHAR),\n\t\"KOPIERT\" VARCHAR2(40 CHAR) NOT NULL ENABLE,\n\t\"STORNOCODE\" VARCHAR2(40 CHAR),\n\t\"MCDINVOICESTATUS\" VARCHAR2(40 CHAR) NOT NULL ENABLE,\n\t\"ITSMCDXMLSTORE\" VARCHAR2(40 CHAR),\n\t\"TARIFGRPMDC\" VARCHAR2(35 CHAR),\n\t\"SUMPOTEINSPARUNG\" NUMBER(14,4) NOT NULL ENABLE,\n\t\"ABSCHLUSSDAT\" TIMESTAMP (9),\n\t\"PROCESSDATE\" DATE,\n\t\"LSTABRDATE\" DATE,\n\t\"LSTABRSTORNODATE\" DATE,\n\t\"REGELVARIABLE1\" VARCHAR2(255 CHAR),\n\t\"TREATMENTBEGIN\" DATE,\n\t\"TREATMENTEND\" DATE,\n\t\"ITSECLAIMPROCINS\" VARCHAR2(40 CHAR),\n\t\"ITSABTRGERKLG\" VARCHAR2(40 CHAR),\n\t\"ITSPROCCOPYFROM\" VARCHAR2(40 CHAR),\n\t\"ARCHIVETAG\" VARCHAR2(40 CHAR),\n\t\"ECLSABEDRGSTATUS\" VARCHAR2(40 CHAR),\n\t\"RECHNUNGSTYP\" VARCHAR2(40 CHAR) NOT NULL ENABLE,\n\t\"MCDVISIBLEDATE\" TIMESTAMP (9),\n\t\"ITSSENDUNG\" VARCHAR2(40 CHAR),\n\t\"MDBID\" VARCHAR2(255 CHAR),\n\t\"LSTZAHLUNGAN\" VARCHAR2(40 CHAR),\n\t\"LSTFORDERUNGAN\" VARCHAR2(40 CHAR),\n\t\"LSTZAHLUNGANOVR\" NUMBER(12,0) NOT NULL ENABLE,\n\t\"LSTFORDERUNGANOVR\" NUMBER(12,0) NOT NULL ENABLE,\n\t\"FRISTBEGINN\" DATE DEFAULT NULL NOT NULL ENABLE,\n\t\"EXTPRUEFSYSSTATUS\" VARCHAR2(40 CHAR) DEFAULT NULL,\n\t\"EXTPRUEFSYSDATE\" DATE DEFAULT NULL,\n\t SUPPLEMENTAL LOG DATA (ALL) COLUMNS\n   ) PCTFREE 10 PCTUSED 40 INITRANS 40 MAXTRANS 255  LOGGING\n  STORAGE(\n  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)\n  TABLESPACE \"ASEDBUSR_DAT\"\n  PARTITION BY LIST (\"REPLACED\")\n (PARTITION \"P_CURR\"  VALUES (TIMESTAMP '3000-01-01 00:00:00') SEGMENT CREATION IMMEDIATE\n  PCTFREE 10 PCTUSED 40 INITRANS 40 MAXTRANS 255\n NOCOMPRESS LOGGING\n  STORAGE(INITIAL 8388608 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645\n  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1\n  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)\n  TABLESPACE \"ASEDBUSR_DAT\" ,\n PARTITION \"P_ARCH\"  VALUES (DEFAULT) SEGMENT CREATION IMMEDIATE\n  PCTFREE 10 PCTUSED 40 INITRANS 40 MAXTRANS 255\n NOCOMPRESS LOGGING\n  STORAGE(INITIAL 8388608 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645\n  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1\n  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)\n  TABLESPACE \"ASEDBUSR_DAT\" )  ENABLE ROW MOVEMENT;\n  CREATE UNIQUE INDEX \"ASEDBUSR\".\"PK1019008\" ON \"ASEDBUSR\".\"ECLAIMPROCESS\" (\"PKEY\")\n  PCTFREE 10 INITRANS 80 MAXTRANS 255 COMPUTE STATISTICS\n  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645\n  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1\n  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)\n  TABLESPACE \"ASEDBUSR_DAT\";\n  ALTER TABLE \"ASEDBUSR\".\"ECLAIMPROCESS\" ADD CONSTRAINT \"PK1019008\" PRIMARY KEY (\"PKEY\")\n  USING INDEX \"ASEDBUSR\".\"PK1019008\"  ENABLE;\n\nCREATE TABLE \"ASEDBUSR\".\"DOCBESTPARAMATTR\"\n(\t\"PKEY\" NUMBER(12,0) NOT NULL ENABLE,\n\t\"BOID\" VARCHAR2(40 CHAR) NOT NULL ENABLE,\n\t\"METABO\" NUMBER(12,0) NOT NULL ENABLE,\n\t\"LASTUPDATE\" TIMESTAMP (9) NOT NULL ENABLE,\n\t\"PROCESSID\" VARCHAR2(40 CHAR) NOT NULL ENABLE,\n\t\"ROWCOMMENT\" VARCHAR2(15 CHAR),\n\t\"CREATED\" TIMESTAMP (9) NOT NULL ENABLE,\n\t\"CREATEDUSER\" VARCHAR2(40 CHAR) NOT NULL ENABLE,\n\t\"REPLACED\" TIMESTAMP (9) NOT NULL ENABLE,\n\t\"REPLACEDUSER\" VARCHAR2(40 CHAR),\n\t\"ARCHIVETAG\" VARCHAR2(40 CHAR),\n\t\"GUELTAB\" DATE NOT NULL ENABLE,\n\t\"GUELTBIS\" DATE NOT NULL ENABLE,\n\t\"ITSPARAMATTRDEF\" VARCHAR2(40 CHAR) NOT NULL ENABLE,\n\t\"CODEVALUE\" VARCHAR2(40 CHAR),\n\t\"ITSBOVALUE\" VARCHAR2(40 CHAR),\n\t\"CLSBOVALUE\" NUMBER(12,0),\n\t\"INTVALUE\" NUMBER(12,0),\n\t\"DECVALUE\" NUMBER(18,6),\n\t\"TEXTVALUE\" VARCHAR2(4000 CHAR),\n\t\"DATEVALUE\" DATE,\n\t\"ITSDOCBESTELLUNG\" VARCHAR2(40 CHAR) NOT NULL ENABLE,\n\t\"MDBID\" VARCHAR2(255 CHAR),\n\t\"BIGTEXTVALUE\" CLOB,\n\t\"CK_CODEVALUE\" VARCHAR2(40 CHAR),\n\t CONSTRAINT \"PK500332\" PRIMARY KEY (\"PKEY\")\n  USING INDEX PCTFREE 10 INITRANS 80 MAXTRANS 255 COMPUTE STATISTICS\n  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645\n  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1\n  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)\n  TABLESPACE \"ASEDBUSR_DAT\"  ENABLE,\n\t SUPPLEMENTAL LOG DATA (ALL) COLUMNS\n   ) SEGMENT CREATION IMMEDIATE\n  PCTFREE 10 PCTUSED 40 INITRANS 40 MAXTRANS 255\n NOCOMPRESS LOGGING\n  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645\n  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1\n  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)\n  TABLESPACE \"ASEDBUSR_DAT\"\n LOB (\"BIGTEXTVALUE\") STORE AS SECUREFILE (\n  TABLESPACE \"ASEDBUSR_DAT\" ENABLE STORAGE IN ROW CHUNK 8192\n  NOCACHE LOGGING  NOCOMPRESS  KEEP_DUPLICATES\n  STORAGE(INITIAL 106496 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645\n  PCTINCREASE 0\n  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)) ;\n\nCREATE TABLE t_order\n(SYS_ID VARCHAR2(32 CHAR) VISIBLE NOT NULL, \nATTACHMENT_NAME VARCHAR2(1024 BYTE) INVISIBLE DEFAULT '');\n\nCREATE TABLE \"A\".\"B\" ( \"FIELD1\" NUMBER(19,0) NOT NULL ENABLE, \"FIELD2\" NUMBER(19,0) NOT NULL ENABLE, PRIMARY KEY (\"FIELD1\") ENABLE ) \nORGANIZATION INDEX NOCOMPRESS ;\n\nCREATE BLOCKCHAIN TABLE bank_ledger (bank VARCHAR2(128), deposit_date DATE, deposit_amount NUMBER)\nNO DROP UNTIL 31 DAYS IDLE\nNO DELETE LOCKED\nHASHING USING \"SHA2_512\" VERSION \"v1\";\n\nCREATE BLOCKCHAIN TABLE bctab_part (trans_id number primary key, sender varchar2(50), recipient varchar2(50), trans_date DATE, amount number) \n     NO DROP UNTIL 16 DAYS IDLE\n     NO DELETE UNTIL 25 DAYS AFTER INSERT\n        HASHING USING \"SHA2_512\" VERSION \"v1\"\n        PARTITION BY RANGE(trans_date)\n        (PARTITION p1 VALUES LESS THAN (TO_DATE('30-09-2019','dd-mm-yyyy')),\n                                PARTITION p2 VALUES LESS THAN (TO_DATE('31-12-2019','dd-mm-yyyy')),\n                                PARTITION p3 VALUES LESS THAN (TO_DATE('31-03-2020','dd-mm-yyyy')),\n                                PARTITION p4 VALUES LESS THAN (TO_DATE('30-06-2020','dd-mm-yyyy'))\n                                );\n\nCREATE TABLE T_ORDER\n(\n    ORDER_ID NUMBER(10) GENERATED BY DEFAULT AS IDENTITY START WITH 1 MAXVALUE 100,\n    STATUS   VARCHAR2(10),\n    COLUMN1  VARCHAR2(10)\n);\n\n-- see as https://docs.oracle.com/en/database/oracle/oracle-database/21/sqlrf/CREATE-TABLE.html#GUID-F9CE0CC3-13AE-4744-A43C-EAC7A71AAAB6\nCREATE TABLE print_media_demo\n( product_id NUMBER(6)\n    , ad_id NUMBER(6)\n    , ad_composite BLOB\n    , ad_sourcetext CLOB\n    , ad_finaltext CLOB\n    , ad_fltextn NCLOB\n    , ad_textdocs_ntab textdoc_tab\n    , ad_photo BLOB\n    , ad_graphic BFILE\n    , ad_header adheader_typ\n) NESTED TABLE ad_textdocs_ntab STORE AS textdocs_nestedtab_demo\n      LOB (ad_composite, ad_photo, ad_finaltext)\n      STORE AS(STORAGE (INITIAL 20M))\n   PARTITION BY RANGE (product_id)\n      (PARTITION p1 VALUES LESS THAN (3000) TABLESPACE tbs_01\n         LOB (ad_composite, ad_photo)\n         STORE AS (TABLESPACE tbs_02 STORAGE (INITIAL 10M))\n         NESTED TABLE ad_textdocs_ntab STORE AS nt_p1 (TABLESPACE example),\n       PARTITION P2 VALUES LESS THAN (MAXVALUE)\n         LOB (ad_composite, ad_finaltext)\n         STORE AS SECUREFILE (TABLESPACE auto_seg_ts)\n         NESTED TABLE ad_textdocs_ntab STORE AS nt_p2\n       )\n   TABLESPACE tbs_03;\n\nCREATE TABLE T (\n    id number(9,0) primary key,\n    data xmltype\n);\n\nCREATE TABLE \"D1\n\"\n(\"c1\" INTEGER, \"C2\" INTEGER);\n\nCREATE TABLE T (\n    id number(9,0) primary key,\n    data xmltype\n) USAGE QUEUE;\n\nCREATE TABLE tab (ID number(9) primary key, data xmltype, data2 xmltype) MEMOPTIMIZE FOR READ;\nCREATE TABLE tab (ID number(9) primary key, data xmltype, data2 xmltype) NO MEMOPTIMIZE FOR READ;\nCREATE TABLE tab (ID number(9) primary key, data xmltype, data2 xmltype) MEMOPTIMIZE FOR WRITE;\nCREATE TABLE tab (ID number(9) primary key, data xmltype, data2 xmltype) NO MEMOPTIMIZE FOR WRITE;\n\nCREATE TABLE tab IF NOT EXISTS (ID number(9) primary key);\n\nCREATE TABLE T1 (\n \"NAME\" VARCHAR(10) NOT NULL,\n \"ID\" INT NOT NULL,\n \"ADDRESS\" VARCHAR(255),\n \"SQ_NUMBER\" NUMBER(10),\n \"PQ_NUMBER\" NUMBER(10),\n CONSTRAINTS UQ1 UNIQUE (\"SQ_NUMBER\", \"PQ_NUMBER\"));\n\ncreate TABLE PROCESSED AS (\nselect * FROM T_ORDER_PROCESSED f)\n       --     WHERE\n       -- TO_CHAR(to_date('20'||f.nr_ano,'YYYY'),'YYYY')||'/'||TRIM(TO_CHAR(f.nr_mes,'00')) = :refCompAcad);\n;\n\nCREATE INDEX part_idx ON partitioned_by_index (part, val)\n    GLOBAL PARTITION BY RANGE (part)\n        ( PARTITION t0 VALUES LESS THAN (TIMESTAMP '2020-01-01 00:00:00')\n        , PARTITION t1 VALUES LESS THAN (MAXVALUE) )\n        ;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_tablespace.sql",
    "content": "CREATE BIGFILE TABLESPACE bigtbs_01\n  DATAFILE 'bigtbs_f1.dbf'\n  SIZE 20M AUTOEXTEND ON;\n\nCREATE UNDO TABLESPACE undots1\n   DATAFILE 'undotbs_1a.dbf'\n   SIZE 10M AUTOEXTEND ON\n   RETENTION GUARANTEE;\n\nCREATE TEMPORARY TABLESPACE temp_demo\n   TEMPFILE 'temp01.dbf' SIZE 5M AUTOEXTEND ON;\n\nCREATE TEMPORARY TABLESPACE tbs_05;\n\nCREATE TEMPORARY TABLESPACE tbs_05 TABLESPACE GROUP '';\n\nCREATE TEMPORARY TABLESPACE tbs_temp_02\n  TEMPFILE 'temp02.dbf' SIZE 5M AUTOEXTEND ON\n  TABLESPACE GROUP tbs_grp_01;\n\nCREATE TABLESPACE tbs_01\n   DATAFILE 'tbs_f2.dbf' SIZE 40M\n   ONLINE;\n\nCREATE TABLESPACE tbs_03\n   DATAFILE 'tbs_f03.dbf' SIZE 20M\n   LOGGING;\n\nCREATE TABLESPACE tbs_02\n   DATAFILE 'diskb:tbs_f5.dbf' SIZE 500K REUSE\n   AUTOEXTEND ON NEXT 500K MAXSIZE 100M;\n\nCREATE TABLESPACE tbs_02\n   DATAFILE 'diskb:tbs_f5.dbf' SIZE 500K REUSE\n   AUTOEXTEND ON NEXT 500K MAXSIZE 100M;\n\nCREATE TABLESPACE tbs_04 DATAFILE 'file_1.dbf' SIZE 10M\n   EXTENT MANAGEMENT LOCAL UNIFORM SIZE 128K;\n\nCREATE TABLESPACE lmt1 DATAFILE 'lmt_file2.dbf' SIZE 100m REUSE\n  EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;\n\nCREATE TABLESPACE lmt2 DATAFILE 'lmt_file3.dbf' SIZE 100m REUSE\n  EXTENT MANAGEMENT LOCAL;\n\nCREATE TABLESPACE encrypt_ts\n  DATAFILE '$ORACLE_HOME/dbs/encrypt_df.dbf' SIZE 1M\n  ENCRYPTION USING 'AES256' ;\n\nCREATE TABLESPACE auto_seg_ts DATAFILE 'file_2.dbf' SIZE 1M\n   EXTENT MANAGEMENT LOCAL\n   SEGMENT SPACE MANAGEMENT AUTO;\n\nCREATE TABLESPACE omf_ts1;\n\nCREATE TABLESPACE omf_ts2 DATAFILE AUTOEXTEND OFF;\n\nCREATE TABLESPACE ts IF NOT EXISTS DATAFILE 'file.dbf' SIZE 100m\n    ONLINE;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_tablespace_set.sql",
    "content": "CREATE TABLESPACE SET ts1\n    IN SHARDSPACE sgr1\n  USING TEMPLATE\n  ( DATAFILE SIZE 100m\n    EXTENT MANAGEMENT LOCAL\n    SEGMENT SPACE MANAGEMENT AUTO\n  );\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_trigger01.sql",
    "content": "CREATE TRIGGER my_schema.my_table_trg\nFOR INSERT OR UPDATE OR DELETE ON my_schema.my_table\nCOMPOUND TRIGGER\n  v_ts        TIMESTAMP(6) := SYSTIMESTAMP;\n  v_cnt        NUMBER      := 0;\nBEFORE EACH ROW IS\n  col_d_value_override INT := 1;\nBEGIN\n\n  IF updating THEN\n    SELECT COUNT(*)\n      INTO v_cnt \n      FROM (SELECT :new.id FROM dual UNION\n            SELECT :old.id FROM dual\n           );\n\n    IF v_cnt > 1 THEN\n      raise_application_error(-20000, 'You can''t change primary key.');\n    END IF;\n\n    SELECT COUNT(*)\n      INTO v_cnt \n      FROM (SELECT :new.id, :new.col_a, :new.col_b, :new.col_c, :new.col_d FROM dual UNION\n            SELECT :old.id, :old.col_a, :old.col_b, :old.col_c, :old.col_d FROM dual\n           );\n  END IF;\n\n  IF v_cnt = 2 OR inserting THEN :new.col_ts :=    v_ts;\n  ELSIF updating            THEN :new.col_ts := :old.col_ts;\n  END IF;\n\n  IF v_cnt = 2 OR deleting  THEN\n    INSERT INTO my_schema.h$_hub_lnk_source_l\n      (id, col_a, col_b, col_c, col_d )\n    VALUES\n      (:old.id, :old.col_a, :old.col_b, :old.col_c, :col_d_value_override )\n    ;\n  END IF;\n\nEND BEFORE EACH ROW;\nEND;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_trigger02.sql",
    "content": "create or replace trigger my_trg\n  before insert on my_schema.tgt_table references\n  for each row\ndeclare\n  l_id          integer;\n  l_rqsttype_id integer;\n  l_rest_date   date;\n  v_cnt         number(1);\nbegin\n  if :new.id is null\n  then\n    :new.id := gen_id('seq', 1);\n  else\n    l_id := gen_id('seq', 0);\n    if :new.id > l_id\n    then\n      :new.id := gen_id('seq', :new.id - l_id);\n    end if;\n  end if;\n  :new.date_load := sysdate;\n  :new.mi_part   := floor(to_char(sysdate, 'mi') / 10);\n  begin\n    select count(1)\n      into v_cnt\n      from my_schema.nem_tbl rt\n     where rt.rqsttypeid = l_rqsttype_id;\n\n    if (v_cnt = 0)\n    then\n      l_rest_date := add_months(trunc(l_rest_date, 'mm'), 1) - 1;\n    end if;\n\n    :new.date_rest := l_rest_date;\n\n  exception\n    when others then\n      :new.date_rest := null;\n  end;\nend;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_type.sql",
    "content": "CREATE TYPE address_t AS OBJECT\n  ( hno    NUMBER,\n    street VARCHAR2(40),\n    city   VARCHAR2(20),\n    zip    VARCHAR2(5),\n    phone  VARCHAR2(10) );\n\n\nCREATE TYPE person AS OBJECT\n  ( name        VARCHAR2(40),\n    dateofbirth DATE,\n    homeaddress address_t,\n    manager     REF person );\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/create_view.sql",
    "content": "CREATE OR REPLACE VIEW VIEW_TEST_ROLE AS\nSELECT ID, NAME || '-' ALIAS_NAME\nFROM TEST_ROLE\nWHERE ID < 6 with check option;\n\nCREATE OR REPLACE FORCE VIEW VIEW_TEST_ROLE AS\nSELECT ID, NAME || '-' ALIAS_NAME\nFROM TEST_ROLE\nWHERE ID < 7 with check option;\n\nCREATE OR REPLACE NO FORCE VIEW VIEW_TEST_ROLE AS\nSELECT ID, NAME || '-' ALIAS_NAME\nFROM TEST_ROLE\nWHERE ID < 8 with check option;\n\nCREATE VIEW warehouse_view OF XMLTYPE\n    XMLSCHEMA \"http://www.example.com/xwarehouses.xsd\"\n    ELEMENT \"Warehouse\"\n    WITH OBJECT ID\n    (extract(OBJECT_VALUE, '/Warehouse/Area/text()').getnumberval())\nAS SELECT XMLELEMENT(\"Warehouse\",\n                     XMLFOREST(WarehouseID as \"Building\",\n                               area as \"Area\",\n                               docks as \"Docks\",\n                               docktype as \"DockType\",\n                               wateraccess as \"WaterAccess\",\n                               railaccess as \"RailAccess\",\n                               parking as \"Parking\",\n                               VClearance as \"VClearance\"))\n   FROM warehouse_table;\n\nCREATE VIEW THE_VIEW IF NOT EXISTS AS\nSELECT ID, NAME\nFROM THE_TABLE\nWHERE ID > 10;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/ctas.sql",
    "content": "create table junk as select sysdate from dual;\n\ncreate table junk1 INITRANS 10 as select sysdate from dual;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/datetime01.sql",
    "content": "select from_tz(cast(to_date('1999-12-01 11:00:00','yyyy-mm-dd hh:mi:ss') as timestamp), 'america/new_york') at time zone 'america/los_angeles' \"west coast time\" from dual\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/datetime03.sql",
    "content": "select\ntimestamp '2009-10-29 01:30:00' at time zone 'us/pacific'from dual\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/datetime04.sql",
    "content": "select\ntimestamp '2009-10-29 01:30:00'\nfrom dual\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/datetime05.sql",
    "content": "select date '1900-01-01' from dual\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/dblink.sql",
    "content": "CREATE PUBLIC DATABASE LINK remote USING 'remote';\nCREATE DATABASE LINK local CONNECT TO hr IDENTIFIED BY p4ssword USING 'local';\nCREATE DATABASE LINK remote.us.example.com CONNECT TO CURRENT_USER USING 'remote';\nCREATE DATABASE LINK \"LINK\" CONNECT TO \"DBLINK\" IDENTIFIED BY VALUES ':1' USING 'local';\n\nALTER DATABASE LINK private_link CONNECT TO hr IDENTIFIED BY hr_new_password;\nALTER PUBLIC DATABASE LINK public_link CONNECT TO scott IDENTIFIED BY scott_new_password;\nALTER SHARED PUBLIC DATABASE LINK shared_pub_link CONNECT TO scott IDENTIFIED BY scott_new_password AUTHENTICATED BY hr IDENTIFIED BY hr_new_password;\n\nDROP PUBLIC DATABASE LINK remote;\nDROP DATABASE LINK private_link_name;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/dblink01.sql",
    "content": "select last_name, department_name \n   from employees@remote, departments\n   where employees.department_id = departments.department_id;\n\nSELECT * FROM scott.emp@hq.acme.com;\n\nSELECT * FROM scott.emp@hq.acme.com@dc1;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/directory.sql",
    "content": "CREATE DIRECTORY mydir AS '/scratch/data/file_data';\n\nCREATE OR REPLACE DIRECTORY bfile_dir AS '/usr/bin/bfile_dir';\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/disassociate_statistics.sql",
    "content": "DISASSOCIATE STATISTICS FROM COLUMNS hr.emp_mgmt.col1 FORCE;\nDISASSOCIATE STATISTICS FROM PACKAGES hr.emp_mgmt;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/drop_analytic_view.sql",
    "content": "DROP ANALYTIC VIEW sales_av;\nDROP ANALYTIC VIEW sch.sales_av;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/drop_attribute_dimension.sql",
    "content": "DROP ATTRIBUTE DIMENSION product_attr_dim;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/drop_audit_policy.sql",
    "content": "DROP AUDIT POLICY table_pol;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/drop_cluster.sql",
    "content": "DROP CLUSTER language;\nDROP CLUSTER sch.language;\nDROP CLUSTER personnel INCLUDING TABLES CASCADE CONSTRAINTS;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/drop_context.sql",
    "content": "DROP CONTEXT hr_context;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/drop_database.sql",
    "content": "DROP DATABASE ;\nDROP DATABASE INCLUDING BACKUPS NOPROMPT ;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/drop_directory.sql",
    "content": "DROP DIRECTORY bfile_dir;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/drop_diskgroup.sql",
    "content": "DROP DISKGROUP dgroup_01 INCLUDING CONTENTS;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/drop_edition.sql",
    "content": "DROP EDITION TEST_ED;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/drop_flashback_archive.sql",
    "content": "DROP FLASHBACK ARCHIVE test_archive2;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/drop_hierarchy.sql",
    "content": "DROP HIERARCHY product_hier;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/drop_indextype.sql",
    "content": "DROP INDEXTYPE position_indextype FORCE;\nDROP INDEXTYPE position_indextype;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/drop_inmemory_join_group.sql",
    "content": "DROP INMEMORY JOIN GROUP prod_id1;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/drop_java.sql",
    "content": "DROP JAVA CLASS \"Agent\";\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/drop_library.sql",
    "content": "DROP LIBRARY ext_lib;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/drop_lockdown_profile.sql",
    "content": "DROP LOCKDOWN PROFILE hr_prof;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/drop_materialized_view.sql",
    "content": "DROP MATERIALIZED VIEW mv1;\n\nDROP MATERIALIZED VIEW mv2 PRESERVE TABLE;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/drop_materialized_view.sql.tree",
    "content": "(sql_script (unit_statement (drop_materialized_view DROP MATERIALIZED VIEW (tableview_name (identifier (id_expression (regular_id mv1)))))) ; (unit_statement (drop_materialized_view DROP MATERIALIZED VIEW (tableview_name (identifier (id_expression (regular_id mv2)))) PRESERVE TABLE)) ; <EOF>)"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/drop_materialized_zonemap.sql",
    "content": "DROP MATERIALIZED ZONEMAP sales_zmap;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/drop_operator.sql",
    "content": "DROP OPERATOR eq_op;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/drop_outline.sql",
    "content": "DROP OUTLINE salaries;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/drop_pmem_filestore.sql",
    "content": "DROP PMEM FILESTORE cloud_db_1 EXCLUDING CONTENTS;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/drop_restore_point.sql",
    "content": "DROP RESTORE POINT good_data;\nDROP RESTORE POINT rp for pluggable database pdb;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/drop_role.sql",
    "content": "drop role TEST_ROLE_AAA;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/drop_rollback_segment.sql",
    "content": "DROP ROLLBACK SEGMENT rbs_one;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/drop_synonym01.sql",
    "content": "drop synonym emp ;\ndrop public synonym emp ;\ndrop public synonym emp force;\ndrop public synonym sch.emp force;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/drop_table.sql",
    "content": "DROP TABLE employee;\nDROP TABLE employee PURGE;\nDROP TABLE employee IF EXISTS;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/drop_tablespace.sql",
    "content": "DROP TABLESPACE tbs_01\n    INCLUDING CONTENTS\n        CASCADE CONSTRAINTS;\nDROP TABLESPACE tbs_02\n   INCLUDING CONTENTS AND DATAFILES;\nDROP TABLESPACE tbs_02 IF EXISTS;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/drop_tablespace_set.sql",
    "content": "DROP TABLESPACE SET ts1;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/drop_user.sql",
    "content": "DROP USER sidney;\nDROP USER sidney CASCADE;\nDROP USER sidney IF EXISTS;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/drop_view.sql",
    "content": "DROP VIEW employee;\nDROP VIEW employee CASCADE CONSTRAINT;\nDROP VIEW employee IF EXISTS;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/editionable_function.sql",
    "content": "CREATE OR REPLACE EDITIONABLE FUNCTION \"TEST\".\"TRIM_FUNC\" (vField in varchar2) return varchar2 is\n    vTemp varchar2(100);\nbegin\n    vTemp:=rtrim(ltrim(vField));\n    return vTemp;\nend;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/editionable_packagebody_function.sql",
    "content": "-- Test for EDITIONABLE package bodies.\nCREATE OR REPLACE EDITIONABLE PACKAGE BODY TEST AS\n    FUNCTION TEST_FUNC RETURN NUMBER PIPELINED DETERMINISTIC AS\n    BEGIN\n        RETURN NULL;\n    END TEST_FUNC;\n    \n    FUNCTION TEST_FUNC2 RETURN NUMBER DETERMINISTIC PIPELINED AS\n    BEGIN\n        RETURN NULL;\n    END TEST_FUNC2;\nEND TEST;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/editionable_packagespec_function.sql",
    "content": "-- Adding pipelined and deterministic keyword in one function spec\nCREATE OR REPLACE EDITIONABLE PACKAGE TEST IS\n    FUNCTION TEST_FUNC RETURN NUMBER PIPELINED DETERMINISTIC;\nEND TEST;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/explain01.sql",
    "content": "explain plan \n    set statement_id = 'raise in tokyo' \n    into plan_table \n    for update employees \n        set salary = salary * 1.10 \n        where department_id =  \n           (select department_id from departments\n               where location_id = 1700)\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/fetch_clause01.sql",
    "content": "Select *\nfROM green_table\noffset 1 rows\nfetch FIRST 1 ROWS ONLY;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/fetch_clause02.sql",
    "content": "Select *\nfROM green_table\noffset 1 rows\nfetch NEXT 20 percent ROW ONLY\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/fetch_clause03.sql",
    "content": "select color, favorite\nFROM green_table\norder by color, favorite\noffset 1 rows\nfetch NEXT 20 ROW WITH TIES;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/fetch_clause04.sql",
    "content": "SELECT\n    (SELECT ID_ FROM TP_STUFF WHERE TEST='1' FETCH FIRST ROW ONLY) AS MWST_ID\nFROM ETL_MD_RAW_ADM ADM\nWHERE ADM.STATUS_ART_ID = 0;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/fetch_statement.sql",
    "content": "CREATE OR REPLACE PACKAGE TEST_PKG_LXD\nAS\n-- Package header\n\nPROCEDURE fetch_statement_test;\n\nEND TEST_PKG_LXD;\n\nCREATE OR REPLACE PACKAGE BODY TEST_PKG_LXD\nAS\n-- Package body\n-- This test case compiles and runs fine on 'Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production'\n\n    PROCEDURE fetch_statement_test\n    IS\n\n        TYPE value_type IS RECORD (v PLS_INTEGER);\n        TYPE list IS TABLE OF value_type INDEX BY PLS_INTEGER;\n        tmp_list list;\n\n        CURSOR fetch_into_cursor IS\n        SELECT 2 FROM dual;\n\n        -- The DDL of TEST_TB is 'CREATE TABLE TEST_TB(id NUMBER(3), value VARCHAR2(10))'\n        TYPE IDList IS TABLE OF TEST_TB.ID%TYPE;\n        TYPE ValueList IS TABLE OF TEST_TB.VALUE%TYPE;\n\n        id_list IDList;\n        value_list ValueList;\n\n        CURSOR fetch_bulk_collect_cursor IS\n            SELECT ID, VALUE FROM TEST_TB;\n    BEGIN\n\n        OPEN fetch_into_cursor;\n            FETCH fetch_into_cursor INTO tmp_list(0).v;\n        CLOSE fetch_into_cursor;\n\n        -- The expected output value is 2, and the actual value is also 2.\n        dbms_output.put_line('tmp_list(0).v=' || tmp_list(0).v);\n\n        OPEN fetch_bulk_collect_cursor;\n            -- Fetch 2 fields into id_list and value_list separately, each field has 2 values, the number of values is limited by tmp_list(0).v.\n            FETCH fetch_bulk_collect_cursor BULK COLLECT INTO id_list, value_list LIMIT tmp_list(0).v;\n        CLOSE fetch_bulk_collect_cursor;\n\n        FOR i IN id_list.FIRST .. id_list.LAST\n        LOOP\n            -- print 2 records\n            dbms_output.put_line('id=' || id_list(i) || ', value=' || value_list(i));\n        END LOOP;\n\n    END fetch_statement_test;\n\nEND TEST_PKG_LXD;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/flashback01.sql",
    "content": "select value(p$) from \"XDB\".\"XDB$SCHEMA\"                 as of snapshot(:2) p$ where SYS_NC_OID$ = :1\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/flashback_table.sql",
    "content": "FLASHBACK TABLE hr.employees TO TIMESTAMP TO_TIMESTAMP('29-DEC-20 01.26.29.000000000 PM');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/for_update01.sql",
    "content": "select employee_id from (select * from employees)\n   for update of employee_id\n\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/for_update02.sql",
    "content": "select employee_id from (select employee_id+1 as employee_id from employees)\n   for update\n\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/for_update03.sql",
    "content": "select employee_id from (select employee_id+1 as employee_id from employees)\n   for update of employee_id\n\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/for_update04.sql",
    "content": "select employee_id from (select employee_id+1 as employee_id from employees)\n   for update of employee_id nowait\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/for_update05.sql",
    "content": "select employee_id from (select employee_id+1 as employee_id from employees)\n   for update of employee_id wait 10\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/for_update06.sql",
    "content": "select employee_id from (select employee_id+1 as employee_id from employees)\n   for update of employee_id skip locked\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/for_update07.sql",
    "content": "select employee_id from (select employee_id+1 as employee_id from employees)\n   for update of a, b.c, d skip locked\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/for_update08.sql",
    "content": "select su.ttype ,su.cid ,su.s_id ,sessiontimezone\nfrom sku su\nwhere (nvl(su.up,'n')='n' and su.ttype=:b0)\nfor update of su.up\norder by su.d\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/forall_bulk_rowcount.sql",
    "content": "DECLARE\n  TYPE num_list IS TABLE OF NUMBER;\n  departments num_list := num_list(45, 78, 91);\nBEGIN\n  FORALL j IN departments.FIRST..departments.LAST\n    DELETE FROM employees WHERE department_id = departments(j);\n\n  FOR i IN departments.FIRST..departments.LAST LOOP\n    DBMS_OUTPUT.PUT_LINE ( 'Statement #' || i || ' deleted ' || SQL%BULK_ROWCOUNT(i) || ' rows.' );\n  END LOOP;\n\n  DBMS_OUTPUT.PUT_LINE('Total rows deleted: ' || SQL%ROWCOUNT);\nEND;\n/\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/forall_indices_of.sql",
    "content": "CREATE TABLE tbl (id NUMBER);\n\n\nDECLARE\n   TYPE nums IS TABLE OF NUMBER;\n   TYPE nums_list IS VARRAY(2) OF nums;\n\n   ns nums_list := nums_list(nums(1, 2, 3), nums(4, 5, 6));\nBEGIN\n\n   FOR i IN 1..2 LOOP\n     FORALL j IN INDICES OF ns(i)\n        INSERT INTO tbl VALUES (ns(i)(j));\n   END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/forall_statement_and_exception_handling.sql",
    "content": "-- forall syntax: https://docs.oracle.com/en/database/oracle/oracle-database/21/lnpls/FORALL-statement.html#GUID-C45B8241-F9DF-4C93-8577-C840A25963DB\n-- forall exception handling: https://docs.oracle.com/en/database/oracle/oracle-database/21/lnpls/plsql-optimization-and-tuning.html#GUID-DAF46F06-EF3F-4B1A-A518-5238B80C69FA\n\nCREATE OR REPLACE PACKAGE TEST_PKG_LXD\nAS\n-- Package header\n\nPROCEDURE forall_and_exception_after_forall;\n\nEND TEST_PKG_LXD;\n\nCREATE OR REPLACE PACKAGE BODY TEST_PKG_LXD\nAS\n-- Package body\n-- This test case passed on 'Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production'\n\n    PROCEDURE forall_and_exception_after_forall\n    IS\n        TYPE IdList IS TABLE OF NUMBER;\n        ids IdList := IdList(10, 20, 30);\n\n        error_message  VARCHAR2(100);\n        bad_stmt_no    PLS_INTEGER;\n\n        dml_errors  EXCEPTION;\n        PRAGMA EXCEPTION_INIT(dml_errors, -24381);\n    BEGIN\n        -- Populate table:\n        -- The DDL of TEST_TB is 'CREATE TABLE TEST_TB(id NUMBER(3), value VARCHAR2(10))'\n        INSERT INTO TEST_TB (id, value) VALUES (10, 'v_10');\n        INSERT INTO TEST_TB (id, value) VALUES (20, 'value_20');\n        INSERT INTO TEST_TB (id, value) VALUES (30, 'v_30');\n        COMMIT;\n\n        -- forall_statement syntax\n        FORALL j IN ids.FIRST..ids.LAST SAVE EXCEPTIONS\n            -- Append 5-character string to each value:\n            UPDATE TEST_TB SET value = value || '. add'\n            WHERE id = ids(j);\n\n        EXCEPTION\n          WHEN dml_errors THEN\n          -- Handling FORALL Exceptions After FORALL Statement Completes\n            FOR i IN 1..SQL%BULK_EXCEPTIONS.COUNT LOOP\n              error_message := SQLERRM(-(SQL%BULK_EXCEPTIONS(i).ERROR_CODE));\n              DBMS_OUTPUT.PUT_LINE (error_message);\n\n              bad_stmt_no := SQL%BULK_EXCEPTIONS(i).ERROR_INDEX;\n              DBMS_OUTPUT.PUT_LINE('Bad statement #: ' || bad_stmt_no);\n\n            END LOOP;\n\n            COMMIT;  -- Commit results of successful updates\n\n            WHEN OTHERS THEN\n              DBMS_OUTPUT.PUT_LINE('Unrecognized error.');\n              RAISE;\n    END forall_and_exception_after_forall;\n\nEND TEST_PKG_LXD;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/function01.sql",
    "content": "select decode(decode(decode( (select count(1) from dual), a, 1, 0), 0, 1), 1, 0) from dual\n--   select decode(decode(decode(decode(x, 0, 1) , 0, 1), 1, 0 ), 0, 1) from dual\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/function02.sql",
    "content": "select set(x) from dual\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/function03.sql",
    "content": "select trim(both from con.ke)\nfrom dual\n\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/function04.sql",
    "content": "select lnnvl( 2 > 1) from dual\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/function05.sql",
    "content": "select count(*)\n  from employees\n  where lnnvl(commission_pct >= .2)\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/function06.sql",
    "content": "call dbms_scheduler.auto_purge (  )\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/function07.sql",
    "content": "create or replace function budget(job varchar2) return varchar2 SQL_MACRO is\nbegin\n  return q'{\n     select deptno, sum(sal) budget \n     from emp \n     where job = budget.job\n     group by deptno\n  }';\nend;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/general_element_part.sql",
    "content": "CREATE OR REPLACE PACKAGE TEST_PKG_LXD\nAS\n-- Package header\n\nTYPE type_array IS ARRAY(5) OF PLS_INTEGER;\n\nFUNCTION return_array_test RETURN type_array;\nPROCEDURE get_array_test;\n\nEND TEST_PKG_LXD;\n\nCREATE OR REPLACE PACKAGE BODY TEST_PKG_LXD\nAS\n-- Package body\n-- This test case compiles and runs fine on 'Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production'\n\n    FUNCTION return_array_test RETURN type_array\n    IS\n        test_array type_array;\n    BEGIN\n        test_array := type_array(1, 2, 3, 4, 5);\n        return test_array;\n        \n    END return_array_test;\n\n    PROCEDURE get_array_test\n    IS\n        value PLS_INTEGER;\n    BEGIN\n\n        value := return_array_test()(3);\n        -- The expected output value is 3, and the actual output value is also 3\n        dbms_output.put_line('value=' || value);\n\n    END get_array_test;\n\nEND TEST_PKG_LXD;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/groupby01.sql",
    "content": "select :b3 as l_snap_id , :b2 as p_dbid , :b1 as p_instance_number , nvl(pid, -9) pid , nvl(serial#, -9) serial# , decode(pid, null, null, max(spid)) spid ,\n decode(pid, null, null, max(program)) program , decode(pid, null, null, max(background)) background , sum(pga_used_mem) pga_used_mem ,\n sum(pga_alloc_mem) pga_alloc_mem , sum(pga_freeable_mem) pga_freeable_mem , max(pga_alloc_mem) max_pga_alloc_mem , max(pga_max_mem) max_pga_max_mem ,\n decode(pid, null, avg(pga_alloc_mem), null) avg_pga_alloc_mem , decode(pid, null, stddev(pga_alloc_mem), null) stddev_pga_alloc_mem ,\n decode(pid, null, count(pid), null) num_processes\n from v$process\n where program != 'pseudo'\n group by grouping sets ( (pid, serial#), () )\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/groupby02.sql",
    "content": "select\n\tdecode(pid, null, null, max(program)) program , decode(pid, null, null, max(background)) background , sum(pga_used_mem) pga_used_mem ,\n\tsum(pga_alloc_mem) pga_alloc_mem , sum(pga_freeable_mem) pga_freeable_mem , max(pga_alloc_mem) max_pga_alloc_mem , max(pga_max_mem) max_pga_max_mem ,\n\tdecode(pid, null, avg(pga_alloc_mem), null) avg_pga_alloc_mem , decode(pid, null, stddev(pga_alloc_mem), null) stddev_pga_alloc_mem ,\n\tdecode(pid, null, count(pid), null) num_processes\nfrom v$process\nwhere program != 'pseudo'\ngroup by grouping sets ( (), ((pid+1), serial#) )\n\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/groupby03.sql",
    "content": "select * from x\ngroup by grouping sets\n( a, 1 )\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/groupby04.sql",
    "content": "select * from x\ngroup by grouping sets\n( (a),1 )\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/groupby05.sql",
    "content": "select * from x\ngroup by grouping sets\n( ((a),b), ((a),b) )\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/groupby06.sql",
    "content": "select \nprod_category, prod_subcategory, country_id, cust_city, count(*)\n   from  products, sales, customers\n   where sales.prod_id = products.prod_id \n   and sales.cust_id=customers.cust_id \n   and sales.time_id = '01-oct-00'\n   and customers.cust_year_of_birth between 1960 and 1970\ngroup by grouping sets \n  (\n   (prod_category, prod_subcategory, country_id, cust_city),\n   (prod_category, prod_subcategory, country_id),\n   (prod_category, prod_subcategory),\n    country_id\n  )\norder by prod_category, prod_subcategory, country_id, cust_city\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/groupby07.sql",
    "content": "select decode((tt || tc), '56', count(distinct cn), '57',  sum(nu)) as q\nfrom t\nwhere tt='500'\n  and tc in ('6','7')\n  and to_char(c,'mm') = '03'\n  having sum(nu) > 0\ngroup by tn, ui, (tt || tc)\norder by 1\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/index.sql",
    "content": "create index IDX on OBJ (CODE, DOCUMENT);\n\nALTER INDEX supplier_idx\n  RENAME TO supplier_index_name;\n\nDROP INDEX index_name;\n\n\nCREATE INDEX ord_customer_ix\n   ON orders (customer_id);\n\nCREATE INDEX ord_customer_ix_demo\n   ON orders (customer_id, sales_rep_id)\n   COMPRESS 1;\n\nCREATE INDEX ord_customer_ix_demo\n   ON orders (order_mode)\n   NOSORT\n   NOLOGGING;\n\nCREATE INDEX idx_personnel ON CLUSTER personnel;\n\nCREATE INDEX upper_ix ON employees (UPPER(last_name));\n\nCREATE INDEX income_ix\n   ON employees(salary + (salary*commission_pct));\n\nCREATE INDEX src_idx ON print_media(text_length(ad_sourcetext));\n\nCREATE INDEX area_idx ON rect_tab x (x.area());\n\nCREATE INDEX cust_last_name_ix ON customers (cust_last_name)\n  GLOBAL PARTITION BY HASH (cust_last_name)\n  PARTITIONS 4;\n\nCREATE INDEX prod_idx ON hash_products(category_id) LOCAL\n   STORE IN (tbs_01, tbs_02);\n\nCREATE BITMAP INDEX product_bm_ix\n   ON hash_products(list_price)\n   TABLESPACE tbs_04;\n\nCREATE UNIQUE INDEX nested_tab_ix\n      ON textdocs_nestedtab(NESTED_TABLE_ID, document_typ);\n\nALTER INDEX ord_customer_ix REBUILD REVERSE;\n\nALTER INDEX ord_customer_ix REBUILD PARALLEL;\n\nALTER INDEX oe.cust_lname_ix\n    INITRANS 5;\n\nALTER INDEX upper_ix PARALLEL;\n\nALTER INDEX upper_ix RENAME TO upper_name_ix;\n\nALTER INDEX cost_ix\n   MODIFY PARTITION p2 UNUSABLE;\n\nALTER INDEX cost_ix UNUSABLE;\n\nALTER INDEX cost_ix\n   REBUILD PARTITION p2;\n\nALTER INDEX cost_ix\n   REBUILD PARTITION p3 NOLOGGING;\n\nALTER INDEX cost_ix MODIFY PARTITION p3\n   STORAGE(MAXEXTENTS 30) LOGGING;\n\nALTER INDEX cost_ix\n   RENAME PARTITION p3 TO p3_Q3;\n\nALTER INDEX cost_ix\n   SPLIT PARTITION p2 AT (1500)\n   INTO ( PARTITION p2a TABLESPACE tbs_01 LOGGING,\n          PARTITION p2b TABLESPACE tbs_02);\n\nALTER INDEX cost_ix\n   DROP PARTITION p1;\n\nALTER INDEX prod_idx\n      MODIFY DEFAULT ATTRIBUTES INITRANS 5;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/insert_statement.sql",
    "content": "DECLARE\n   V_RECORD EVENT%ROWTYPE;\nBEGIN \n   SELECT * INTO V_RECORD FROM EVENT WHERE ROWNUM=1;\n   INSERT INTO TMP_EVENT VALUES V_RECORD;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/interval01.sql",
    "content": "select (systimestamp - order_date) day(9) to second from orders\nwhere order_id = 2458\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/interval02.sql",
    "content": "select interval '42' day from dual\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/interval03.sql",
    "content": "select\n interval '4 5:12:10.222' day to second(3)\n,interval '4 5:12' day to minute\n,interval '400 5' day(3) to hour\n,interval '400' day(3)\n,interval '11:12:10.2222222' hour to second(7)\n,interval '11:20' hour to minute\n,interval '10' hour\n,interval '10:22' minute to second\n,interval '10' minute\n,interval '4' day\n,interval '25' hour\n,interval '40' minute\n,interval '120' hour(3)\n,interval '30.12345' second(2,4)\n,interval :a day\n\n,interval '1' year\n,interval '1' month\n    \nfrom dual\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/interval04.sql",
    "content": "select interval'20' day - interval'240' hour from dual\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/join01.sql",
    "content": "select d.department_id as d_dept_id, e.department_id as e_dept_id, e.last_name\n   from departments d full outer join employees e\n   on d.department_id = e.department_id\n   order by d.department_id, e.last_name\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/join02.sql",
    "content": "select department_id as d_e_dept_id, e.last_name\n   from departments d full outer join employees e\n   using (department_id)\n   order by department_id, e.last_name\n\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/join03.sql",
    "content": "select d.department_id, e.last_name\n   from m.departments d right outer join n.employees e\n   on d.department_id = e.department_id\n   order by d.department_id, e.last_name\n\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/join04.sql",
    "content": "select d.department_id, e.last_name\n   from departments d, employees e\n   where d.department_id = e.department_id(+)\n   order by d.department_id, e.last_name\n\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/join05.sql",
    "content": "select times.time_id, product, quantity from inventory \n   partition by  (product) \n   right outer join times on (times.time_id = inventory.time_id) \n   where times.time_id between to_date('01/04/01', 'dd/mm/yy') \n      and to_date('06/04/01', 'dd/mm/yy') \n   order by  2,1\n\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/join06.sql",
    "content": "select * from dual d1\njoin dual d2 on (d1.dummy = d2.dummy)\njoin dual d3 on(d1.dummy = d3.dummy)\njoin dual on(d1.dummy = dual.dummy)\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/join07.sql",
    "content": "select * from t1 \njoin t2 tt2 using(c)\njoin t3 tt3 using(d)\njoin t3 using(d)\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/join08.sql",
    "content": "select * from dual t1\njoin (select * from dual) tt2 using(dummy)\njoin (select * from dual) using(dummy)\njoin (select * from dual) d on(d.dummy=tt3.dummy)\ninner join (select * from dual) tt2 using(dummy)\ninner join (select * from dual) using(dummy)\ninner join (select * from dual) d on(d.dummy=t1.dummy)\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/join09.sql",
    "content": "select * from dual t1\nleft outer join (select * from dual) tt2 using(dummy)\nleft outer join (select * from dual) using(dummy)\nleft outer join (select * from dual) d on(d.dummy=tt3.dummy)\ninner join (select * from dual) tt2 using(dummy)\ninner join (select * from dual) using(dummy)\ninner join (select * from dual) d on(d.dummy=t1.dummy)\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/join10.sql",
    "content": "select * from dual t1,\n       \t      (\n\t\tdual left outer join (select * from dual) tt2 using(dummy)\n\t\t)\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/join11.sql",
    "content": "select * from t1, ( t2 left outer join t3 using(dummy) )\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/join12.sql",
    "content": "select * from dual,( dual left outer join tt2 using(dummy) )\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/join13.sql",
    "content": "select * from t1,\n       ((((\n       \tt2 left outer join t3 using(dummy)\n\t))))\n\t"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/join14.sql",
    "content": "select * from dual t1,\n(\n\t(\n\t\t(\n\t\t\tdual t2 join dual t3 using(dummy) )\n\t\t\tleft outer join dual t4 using(dummy) )\n\t\t\tleft outer join dual t5 using(dummy) )\n\n\t\t\t\n\t\t\t"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/join15.sql",
    "content": "select * from dual t1, ( dual t2 join dual t3 using(dummy)) left outer join dual t4 using (dummy)\n\t\t\t\n\t\t\t\n\t\t\t"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/join16.sql",
    "content": "select * from dual t1,\n\t\t\tdual t2 join dual t3 using(dummy) \n\t\t\tleft outer join dual t4 using(dummy) \n\t\t\tleft outer join dual t5 using(dummy) \n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/join17.sql",
    "content": "select *\nfrom hdr a\ninner join sh s\ninner join ca c\non c.id = s.id\non a.va = s.va\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/join18.sql",
    "content": "select department_id as d_e_dept_id, e.last_name\n   from departments\n   full outer join employees on (a=b)\n   left outer join employees on (a=b)\n   right outer join employees on (a=b)\n   join employees on (a=b)\n   inner join employees on (a=b)\n   cross join employees\n   natural join employees\n\n\n\n\n\t\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/join19.sql",
    "content": "select d1.*, d2.* from dual d1 cross join dual d2\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/join20.sql",
    "content": "select d1.*, d2.* from dual cross join dual \n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/join21.sql",
    "content": "select * from sys.dual natural join sys.dual \n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/join22.sql",
    "content": "SELECT *\n  FROM employees e\n     , LATERAL(SELECT * FROM departments d\n                WHERE e.department_id = d.department_id);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/join23.sql",
    "content": "SELECT d.department_name, v.employee_id, v.last_name\n  FROM departments d\n CROSS APPLY (SELECT * FROM employees e\n               WHERE e.department_id = d.department_id) v\n WHERE d.department_name IN ('Marketing', 'Operations')\n ORDER BY d.department_name, v.employee_id;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/json_query.sql",
    "content": "-- From https://www.oratable.com/querying-json-data-in-oracle/\n-- 2.2a  SQL/JSON query: JSON_QUERY\n--       to select the entire JSON document\nselect custid\n     , custname\n     , json_query(metadata, '$'\n                  ) json_metadata\nfrom customer;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/json_query.sql.tree",
    "content": "(sql_script (unit_statement (data_manipulation_language_statements (select_statement (select_only_statement (subquery (subquery_basic_elements (query_block select (selected_list (select_list_elements (expression (logical_expression (unary_logical_expression (multiset_expression (relational_expression (compound_expression (concatenation (model_expression (unary_expression (atom (general_element (general_element_part (id_expression (regular_id custid))))))))))))))) , (select_list_elements (expression (logical_expression (unary_logical_expression (multiset_expression (relational_expression (compound_expression (concatenation (model_expression (unary_expression (atom (general_element (general_element_part (id_expression (regular_id custname))))))))))))))) , (select_list_elements (expression (logical_expression (unary_logical_expression (multiset_expression (relational_expression (compound_expression (concatenation (model_expression (unary_expression (standard_function (json_function json_query ( (expression (logical_expression (unary_logical_expression (multiset_expression (relational_expression (compound_expression (concatenation (model_expression (unary_expression (atom (general_element (general_element_part (id_expression (regular_id (non_reserved_keywords_in_12c metadata))))))))))))))) , '$' json_query_returning_clause )))))))))))) (column_alias (identifier (id_expression (regular_id json_metadata)))))) (from_clause from (table_ref_list (table_ref (table_ref_aux (table_ref_aux_internal (dml_table_expression_clause (tableview_name (identifier (id_expression (regular_id customer))))))))))))))))) ; <EOF>)"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/json_sql.sql",
    "content": "select 'A' | | 'B'  from dual;\n\nSELECT JSON_OBJECT (\n           KEY 'deptno' IS d.department_id,\n           KEY 'deptname' IS d.department_name\n    ) \"Department Objects\"\nFROM departments d\nORDER BY d.department_id;\n\nSELECT JSON_OBJECT(KEY 'VALUE' VALUE COL), t.*  FROM T t;\n\nSELECT JSON_OBJECT(KEY 'VALUE' VALUE COL FORMAT JSON), t.*  FROM T t;\n\nSELECT JSON_ARRAY (\n               JSON_OBJECT('percentage' VALUE .50),\n               JSON_ARRAY(1,2,3),\n               100,\n               'California',\n               null\n               NULL ON NULL\n           ) \"JSON Array Example\"\nFROM DUAL;\n\nSELECT JSON_ARRAYAGG(id ORDER BY id RETURNING VARCHAR2(100)) ID_NUMBERS\nFROM id_table;\n\nSELECT JSON_OBJECTAGG(KEY department_name VALUE department_id) \"Department Numbers\"\nFROM departments\nWHERE department_id <= 30;\n\nSELECT JSON_QUERY('{a:100, b:200, c:300}', '$') AS value\nFROM DUAL;\n\nSELECT JSON_SERIALIZE ('{a:[1,2,3,4]}' RETURNING VARCHAR2(3) TRUNCATE ERROR ON ERROR) from dual;\n\nSELECT JSON_VALUE('{a:100}', '$.a') AS value FROM DUAL;\n\nSELECT JSON_VALUE('{\"level\": 10}', '$.level' RETURNING NUMBER) FROM DUAL;\n\nSELECT 1 FROM DUAL WHERE '{\"a\": 1, \"b\": [1, 2, 3]}' IS JSON;\n\nSELECT * FROM employees WHERE (doc IS JSON);\n\nSELECT * FROM employees WHERE dept = 2 AND (doc IS JSON);\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/keywordasidentifier01.sql",
    "content": "select timestamp, avg, cume_dist from nulls\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/keywordasidentifier02.sql",
    "content": "select m.model from model\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/keywordasidentifier03.sql",
    "content": "select ind.index_owner,ind.index_name,ind.uniqueness\n , ind.status,ind.index_type,ind.temporary, ind.partitioned,ind.funcidx_status\n , ind.join_index,ind.columns,ie.column_expression\n , ind.index_name sdev_link_name,'INDEX' sdev_link_type, ind.index_owner sdev_link_owner     \nfrom \n(\n   select index_owner,table_owner,index_name,uniqueness, status,index_type,temporary, partitioned,funcidx_status, join_index\n   , max(decode(position,1 ,column_name))|| max(decode(position,2 ,', '||column_name))|| max(decode(position,3 ,', '||column_name))|| max(decode(position,4 ,', '||column_name))|| max(decode(position,5 ,', '||column_name))||           max(decode(position,6 ,', '||column_name))||           max(decode(position,7 ,', '||column_name))||           max(decode(position,8 ,', '||column_name))||           max(decode(position,9 ,', '||column_name))||           max(decode(position,10,', '||column_name)) columns \n\n  from\n  (\n     select di.owner index_owner,dc.table_owner,dc.index_name,di.uniqueness, di.status, di.index_type, di.temporary, di.partitioned,di.funcidx_status, di.join_index\n     , dc.column_name,dc.column_position position          \n     from all_ind_columns dc,all_indexes di         \n     where dc.table_owner = :OBJECT_OWNER           \n     and dc.table_name  =  :OBJECT_NAME           \n     and dc.index_name = di.index_name           \n     and dc.index_owner = di.owner \n  )    \n  group by index_owner,table_owner,index_name,uniqueness, status, index_type, temporary, partitioned,funcidx_status, join_index\n) ind,\nALL_IND_EXPRESSIONS ie  \nwhere ind.index_name = ie.index_name(+)\nand ind.index_owner = ie.index_owner(+)\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/keywordasidentifier04.sql",
    "content": "select bs.keep keep, bs.keep_until keep_until \nfrom v$backup_set bs \nunion all \nselect null keep, null keep_until\nfrom v$backup_piece bp\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/keywordasidentifier05.sql",
    "content": "select exception from exception"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/keywordasidentifier06.sql",
    "content": "SELECT * FROM PERIOD;\nCREATE PROCEDURE TEST AS\nBEGIN\n    IF A.EXISTS() THEN\n        NULL;\n    END IF;\nEND;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/least_greatest.sql",
    "content": "SELECT LEAST(1), LEAST(1, 2), LEAST(1, 2, 3), GREATES(1), GREATEST(1, 2), GREATEST(1, 2, 3) FROM DUAL"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/lexer01.sql",
    "content": "select * from dual where 1 < > 2 and 1 ! = 2 and 1 ^ /*aaa */ = 2\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/lexer02.sql",
    "content": "select 'A' | | 'B'  from dual;\n\nselect a ä, b Ḅ from dual;\n\nCREATE OR REPLACE PACKAGE ACCESS_SECURITY AS\n-- omitted\nEND;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/lexer02.sql.tree",
    "content": "(sql_script (unit_statement (data_manipulation_language_statements (select_statement (select_only_statement (subquery (subquery_basic_elements (query_block select (selected_list (select_list_elements (expression (logical_expression (unary_logical_expression (multiset_expression (relational_expression (compound_expression (concatenation (concatenation (model_expression (unary_expression (atom (constant (quoted_string 'A')))))) | | (concatenation (model_expression (unary_expression (atom (constant (quoted_string 'B'))))))))))))))) (from_clause from (table_ref_list (table_ref (table_ref_aux (table_ref_aux_internal (dml_table_expression_clause (tableview_name (identifier (id_expression (regular_id dual))))))))))))))))) ; (unit_statement (data_manipulation_language_statements (select_statement (select_only_statement (subquery (subquery_basic_elements (query_block select (selected_list (select_list_elements (expression (logical_expression (unary_logical_expression (multiset_expression (relational_expression (compound_expression (concatenation (model_expression (unary_expression (atom (general_element (general_element_part (id_expression (regular_id a)))))))))))))) (column_alias (identifier (id_expression (regular_id ä))))) , (select_list_elements (expression (logical_expression (unary_logical_expression (multiset_expression (relational_expression (compound_expression (concatenation (model_expression (unary_expression (atom (general_element (general_element_part (id_expression (regular_id b)))))))))))))) (column_alias (identifier (id_expression (regular_id Ḅ)))))) (from_clause from (table_ref_list (table_ref (table_ref_aux (table_ref_aux_internal (dml_table_expression_clause (tableview_name (identifier (id_expression (regular_id dual))))))))))))))))) ; (unit_statement (create_package CREATE OR REPLACE PACKAGE (package_name (identifier (id_expression (regular_id ACCESS_SECURITY)))) AS END)) ; <EOF>)"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/lexer03.sql",
    "content": "select :1, :X, :1 + 1, 1 + :2 from A where A=:3 and b= : 4 and c= :5and :A = :b\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/lexer04.sql",
    "content": "select tbl$or$idx$part$num(\"sys\".\"wrh$_seg_stat\",0,4,0,\"rowid\") as c1 from t1\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/lexer05.sql",
    "content": "select tbl$or$idx$part$num(\"sys\".\"wrh:_seg_stat\",0,4,0,\"rowid\") as c1 from t1\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/like01.sql",
    "content": "select last_name\nfrom employees\nwhere last_name\nlike '%a\\_b%' escape '\\'\norder by last_name\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/lob-item.sql",
    "content": "SELECT \"C1\" FROM \"T1\""
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/lob-item.sql.tree",
    "content": "(sql_script (unit_statement (data_manipulation_language_statements (select_statement (select_only_statement (subquery (subquery_basic_elements (query_block SELECT (selected_list (select_list_elements (expression (logical_expression (unary_logical_expression (multiset_expression (relational_expression (compound_expression (concatenation (model_expression (unary_expression (atom (general_element (general_element_part (id_expression \"C1\"))))))))))))))) (from_clause FROM (table_ref_list (table_ref (table_ref_aux (table_ref_aux_internal (dml_table_expression_clause (tableview_name (identifier (id_expression \"T1\")))))))))))))))) <EOF>)"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/materialized_views.sql",
    "content": "CREATE MATERIALIZED VIEW foreign_customers FOR UPDATE\n   AS SELECT * FROM sh.customers@remote cu\n   WHERE EXISTS\n     (SELECT * FROM sh.countries@remote co\n      WHERE co.country_id = cu.country_id);\nCREATE MATERIALIZED VIEW sales_mv\n   BUILD IMMEDIATE\n   REFRESH FAST ON COMMIT\n   AS SELECT t.calendar_year, p.prod_id,\n      SUM(s.amount_sold) AS sum_sales\n      FROM times t, products p, sales s\n      WHERE t.time_id = s.time_id AND p.prod_id = s.prod_id\n      GROUP BY t.calendar_year, p.prod_id;\n\nCREATE MATERIALIZED VIEW sales_by_month_by_state\n     TABLESPACE example\n     PARALLEL 4\n     BUILD IMMEDIATE\n     REFRESH COMPLETE\n     ENABLE QUERY REWRITE\n     AS SELECT t.calendar_month_desc, c.cust_state_province,\n        SUM(s.amount_sold) AS sum_sales\n        FROM times t, sales s, customers c\n        WHERE s.time_id = t.time_id AND s.cust_id = c.cust_id\n        GROUP BY t.calendar_month_desc, c.cust_state_province;\n\nCREATE MATERIALIZED VIEW sales_sum_table\n   ON PREBUILT TABLE WITH REDUCED PRECISION\n   ENABLE QUERY REWRITE\n   AS SELECT t.calendar_month_desc AS month, \n             c.cust_state_province AS state,\n             SUM(s.amount_sold) AS sales\n      FROM times t, customers c, sales s\n      WHERE s.time_id = t.time_id AND s.cust_id = c.cust_id\n      GROUP BY t.calendar_month_desc, c.cust_state_province;\n\nCREATE MATERIALIZED VIEW order_data REFRESH WITH ROWID\n   AS SELECT * FROM orders;\n\nCREATE MATERIALIZED VIEW warranty_orders REFRESH FAST AS\n  SELECT order_id, line_item_id, product_id FROM order_items o\n    WHERE EXISTS\n    (SELECT * FROM inventories i WHERE o.product_id = i.product_id\n      AND i.quantity_on_hand IS NOT NULL)\n  UNION\n    SELECT order_id, line_item_id, product_id FROM order_items\n    WHERE quantity > 5;\n\nCREATE MATERIALIZED VIEW my_warranty_orders\n   AS SELECT w.order_id, w.line_item_id, o.order_date\n   FROM warranty_orders w, orders o\n   WHERE o.order_id = o.order_id\n   AND o.sales_rep_id = 165;\n\nCREATE MATERIALIZED VIEW LOG ON customers\n   PCTFREE 5\n   TABLESPACE example\n   STORAGE (INITIAL 10K);\n\nCREATE MATERIALIZED VIEW LOG ON customers WITH PRIMARY KEY, ROWID;\n\nCREATE MATERIALIZED VIEW LOG ON sales\n   WITH ROWID, SEQUENCE(amount_sold, time_id, prod_id)\n   INCLUDING NEW VALUES;\n\nCREATE MATERIALIZED VIEW LOG ON order_items WITH (product_id);\n\nCREATE MATERIALIZED VIEW products_mv \n   REFRESH FAST ON COMMIT\n   AS SELECT SUM(list_price - min_price), category_id\n         FROM product_information \n         GROUP BY category_id;\n\nCREATE MATERIALIZED VIEW TEST\n      AS \n      WITH TESTCTE AS (\n        SELECT 1 ONE FROM DUAL\n      )\n      SELECT 'A', 'B', 'C'\n      FROM DUAL\n      JOIN TESTCTE;\n\n-- tests for column aliases\nCREATE MATERIALIZED VIEW sales_mv (year, \"prod\")\n   BUILD IMMEDIATE\n   REFRESH FAST ON COMMIT\n   AS SELECT t.calendar_year, p.prod_id,\n      SUM(s.amount_sold) AS sum_sales\n      FROM times t, products p, sales s\n      WHERE t.time_id = s.time_id AND p.prod_id = s.prod_id\n      GROUP BY t.calendar_year, p.prod_id;\n\nCREATE MATERIALIZED VIEW sales_mv (year ENCRYPT, prod)\n   BUILD IMMEDIATE\n   REFRESH FAST ON COMMIT\n   AS SELECT t.calendar_year, p.prod_id,\n      SUM(s.amount_sold) AS sum_sales\n      FROM times t, products p, sales s\n      WHERE t.time_id = s.time_id AND p.prod_id = s.prod_id\n      GROUP BY t.calendar_year, p.prod_id;\n\nCREATE MATERIALIZED VIEW sales_mv (year ENCRYPT, prod ENCRYPT USING 'some_algorithm' IDENTIFIED BY pass 'int_algorithm' NO SALT)\n   BUILD IMMEDIATE\n   REFRESH FAST ON COMMIT\n   AS SELECT t.calendar_year, p.prod_id,\n      SUM(s.amount_sold) AS sum_sales\n      FROM times t, products p, sales s\n      WHERE t.time_id = s.time_id AND p.prod_id = s.prod_id\n      GROUP BY t.calendar_year, p.prod_id;\n\n-- tests for scoped table ref constraints\nCREATE MATERIALIZED VIEW sales_mv (year ENCRYPT, prod ENCRYPT, SCOPE FOR (ref_col) IS schema.table_or_alias)\n   BUILD IMMEDIATE\n   REFRESH FAST ON COMMIT\n   AS SELECT t.calendar_year, p.prod_id,\n      SUM(s.amount_sold) AS sum_sales\n      FROM times t, products p, sales s\n      WHERE t.time_id = s.time_id AND p.prod_id = s.prod_id\n      GROUP BY t.calendar_year, p.prod_id;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/max_001.sql",
    "content": "SELECT \n\n MAX (DISTINCT miles),\n MAX (ALL miles)\n \nFROM Flights"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/merge01.sql",
    "content": "merge into bonuses d \n   using (select employee_id.* from employees) s \n   on (employee_id = a) \n   when matched then update set d.bonus = bonus \n     delete where (salary > 8000)\n   when not matched then insert (d.employee_id, d.bonus) \n     values (s.employee_id, s.salary)\n     where (s.salary <= 8000)\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/merge02.sql",
    "content": "merge into bonuses d \n   using (select employee_id.* from employees) s \n   on (employee_id = a) \n   when not matched then insert (d.employee_id, d.bonus) \n     values (s.employee_id, s.salary)\n     where (s.salary <= 8000)\n   when matched then update set d.bonus = bonus \n     delete where (salary > 8000)\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/merge03.sql",
    "content": "merge /*+ dynamic_sampling(mm 4) dynamic_sampling_est_cdn(mm)\n              dynamic_sampling(m 4) dynamic_sampling_est_cdn(m) */\n\ninto sys.mon_mods_all$ mm\nusing\n(\n\tselect decode(grouping_id(tp.bo#,tsp.pobj#,m.obj#),3,tp.bo#,1,tsp.pobj#,m.obj#) obj#, sum(m.inserts) inserts, sum(m.updates) updates, sum(m.deletes) deletes,\n\tdecode(sum(bitand(m.flags,1)),0,0,1) +decode(sum(bitand(m.flags,2)),0,0,2) +decode(sum(bitand(m.flags,4)),0,0,4) flags, sum(m.drop_segments) drop_segments\n\tfrom sys.mon_mods$ m, sys.tabcompart$ tp, sys.tabsubpart$ tsp\n\twhere m.obj# = tsp.obj# and tp.obj# = tsp.pobj#\n\tgroup by rollup(tp.bo#,tsp.pobj#,m.obj#) having grouping_id(tp.bo#,tsp.pobj#,m.obj#) < 7\n) v on\n(mm.obj# = v.obj#)\nwhen matched then\nupdate set mm.inserts = mm.inserts + v.inserts, mm.updates = mm.updates + v.updates, mm.deletes = mm.deletes + v.deletes,\nmm.flags = mm.flags + v.flags - bitand(mm.flags,v.flags) , mm.drop_segments = mm.drop_segments + v.drop_segments\nwhen not matched then insert values (v.obj#, v.inserts, v.updates, v.deletes, sysdate, v.flags, v.drop_segments)\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/merge04.sql",
    "content": "merge /*+ dynamic_sampling(mm 4) dynamic_sampling_est_cdn(mm)\n              dynamic_sampling(m 4) dynamic_sampling_est_cdn(m) */\n\ninto sys.mon_mods_all$ mm\nusing\n(\n\tselect decode(grouping_id(tp.bo#,tsp.pobj#,m.obj#),3,tp.bo#,1,tsp.pobj#,m.obj#) obj#, sum(m.inserts) inserts, sum(m.updates) updates, sum(m.deletes) deletes,\n\tdecode(sum(bitand(m.flags,1)),0,0,1) +decode(sum(bitand(m.flags,2)),0,0,2) +decode(sum(bitand(m.flags,4)),0,0,4) flags, sum(m.drop_segments) drop_segments\n\tfrom sys.mon_mods$ m, sys.tabcompart$ tp, sys.tabsubpart$ tsp\n\twhere m.obj# = tsp.obj# and tp.obj# = tsp.pobj#\n\tgroup by rollup(tp.bo#,tsp.pobj#,m.obj#) having grouping_id(tp.bo#,tsp.pobj#,m.obj#) < 7\n        order by 1, 2, 3\n) v on\n(mm.obj# = v.obj#)\nwhen matched then\nupdate set mm.inserts = mm.inserts + v.inserts, mm.updates = mm.updates + v.updates, mm.deletes = mm.deletes + v.deletes,\nmm.flags = mm.flags + v.flags - bitand(mm.flags,v.flags) , mm.drop_segments = mm.drop_segments + v.drop_segments\nwhen not matched then insert values (v.obj#, v.inserts, v.updates, v.deletes, sysdate, v.flags, v.drop_segments)\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/merge05.sql",
    "content": "-- MERGE INTO with a rowtype variable as \"insert values\" parameter\nMERGE INTO salesfront.SF_FORM_REFERENCE_CHOICES_DEF target\n\tUSING (select null from dual)\n\tON (recChoicesDef.id = target.id)\nWHEN MATCHED THEN\n\tUPDATE SET target.source_id = recChoicesDef.source_id\nWHEN NOT MATCHED THEN\n\tINSERT VALUES recChoicesDef;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/model_clause01.sql",
    "content": "select country,prod,year,s\nfrom sales_view_ref\nmodel\npartition by (country)\ndimension by (prod, year)\nmeasures (sale s)\nignore nav\n-- cell_reference_options\nunique dimension\n-- here starts model_rules_clause\nrules upsert sequential order\n(\ns[prod='mouse pad', year=2001] = s['mouse pad', 1999] + s['mouse pad', 2000],\ns['standard mouse', 2002] = s['standard mouse', 2001]\n)\norder by country, prod, year\n\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/model_clause02.sql",
    "content": "select country, year, sale, csum\n   from \n   (select country, year, sum(sale) sale\n    from sales_view_ref\n    group by country, year\n   )\n   model dimension by (country, year)\n         measures (sale, 0 csum) \n         rules (csum[any, any]= \n                  sum(sale) over (partition by country \n                                  order by year \n                                  rows unbounded preceding) \n                )\n   order by country, year\n\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/model_clause03.sql",
    "content": "select country,prod,year,s\n  from sales_view_ref\n  model\n    partition by (country)\n    dimension by (prod, year)\n    measures (sale s)\n    ignore nav\n    unique dimension\n    rules upsert sequential order\n    (\n      s[prod='mouse pad'] = 1,\n      s['standard mouse'] = 2\n    )\n  order by country, prod, year\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/model_clause04.sql",
    "content": "select country, year, sale, csum\n   from\n   (select country, year, salex sale\n    from sales_view_ref\n    group by country, year\n   )\n   model dimension by (country, year)\n         measures (sale, 0 csum)\n         rules\n            (\n              s['standard mouse'] = 2\n            )\n   order by country, year\n\n "
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/model_clause05.sql",
    "content": "select country, year, sale, csum\n   from\n   (select country, year, salex sale\n    from sales_view_ref\n    group by country, year\n   ) m\n   model dimension by (country, year)\n         measures (sale, 0 csum)\n         rules\n            (\n              s['standard mouse'] = 2\n            )\n   order by country, year\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/multiset_operators.sql",
    "content": "-- Example from https://github.com/utPLSQL/utPLSQL/blob/3437b689e2097b1bdae4b0daf22b09549e5eabee/source/core/ut_suite_cache_manager.pkb\nselect c.obj.path as path\n  from suite_items c\n where c.obj.tags multiset intersect :a_include_tag_list is not empty or :a_include_tag_list is empty;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/noaudit_statement.sql",
    "content": "NOAUDIT ROLE;\nNOAUDIT SELECT TABLE BY hr;\nNOAUDIT DELETE ANY TABLE;\nNOAUDIT SELECT\n        ON hr.employees;\nNOAUDIT SELECT\n        ON hr.employees\n            WHENEVER SUCCESSFUL;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/numbers01.sql",
    "content": "select 25\n, +6.34\n, 0.5\n, 25e-03\n, -1 -- Here are some valid floating-point number literals:\n, 25f\n, +6.34F\n, 0.5d\n, -1D\n, (sysdate -1d)   -- here we subtract \"one\" in decimal format\n, sysdate -1m     -- here we subtract \"one\" and \"m\" is column's alias\n, sysdate -1dm\nfrom dual\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/nvl_001.sql",
    "content": "SELECT last_name, \nNVL(TO_CHAR(commission_pct), 'Not Applicable')  \"COMMISSION\" FROM employees\nWHERE last_name LIKE 'B%'\nORDER BY last_name"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/object_access01.sql",
    "content": "select\nextractvalue(value(t), '/select_list_item/pos') + 1 pos,\nextractvalue(value(t), '/select_list_item/value') res,\nextractvalue(value(t), '/select_list_item/nonnulls') nonnulls,\nextractvalue(value(t), '/select_list_item/ndv') ndv,\nextractvalue(value(t), '/select_list_item/split') split,\nextractvalue(value(t), '/select_list_item/rsize') rsize,\nextractvalue(value(t), '/select_list_item/rowcnt') rowcnt,\nextract(value(t), '/select_list_item/hash_val').getclobval() hashval\nfrom\ntable\n(\n\txmlsequence\n\t(\n\t\textract(:b1 , '/process_result/select_list_item')\n\t)\n) t\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/object_access_expressions.sql",
    "content": "SELECT (t.t_queue_type).date_calc AS date_calc_par\n     , t.t_queue_type.date_calc AS date_calc_direct\n     , t.t_queue_type.as_code() AS type_code\n     , (t.t_queue_type).as_code() AS type_code_par\n     , t.t_queue_type.sub_type.as_code() AS subtype_code\n     , ((t.t_queue_type).sub_type).as_code() AS subtype_code_par\n     , t.hier(1)(2)(3).gettype AS nested_invocations_and_member_access\n     , treat(ent as my_schema.my_table).version AS member_of_treat_result\n  FROM t_queue t;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/offset_clause.sql",
    "content": "Select *\nfROM green_table\noffset 1 row;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/order_by01.sql",
    "content": "select * from dual order by 1\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/order_by02.sql",
    "content": "select * from dual order by 1 asc\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/order_by03.sql",
    "content": "select * from dual order by m.year, m.title, f(a)\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/order_by04.sql",
    "content": "select * from dual order by a nulls first,  b nulls last, substr(c, 1) collate generic_m\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/order_by05.sql",
    "content": "select * from dual order siblings by a nulls first, b nulls last, c nulls last, d nulls last, e nulls last"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/order_by06.sql",
    "content": "with a as (select * from dual order by 1) select * from a\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/package_body.sql",
    "content": "CREATE PACKAGE BODY EMP_BONUS AS\nLOCAL_PARAM NUMBER;\nUSER_EXCEPTION EXCEPTION;\nPROCEDURE CALC_BONUS (DATE_HIRED DATE) IS\nBEGIN\nLOCAL_PARAM:=0;\nEND;\nEND EMP_BONUS;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/package_body.sql.tree",
    "content": "(sql_script (unit_statement (create_package_body CREATE PACKAGE BODY (package_name (identifier (id_expression (regular_id EMP_BONUS)))) AS (package_obj_body (variable_declaration (identifier (id_expression (regular_id LOCAL_PARAM))) (type_spec (datatype (native_datatype_element NUMBER))) ;)) (package_obj_body (exception_declaration (identifier (id_expression (regular_id USER_EXCEPTION))) EXCEPTION ;)) (package_obj_body (procedure_body PROCEDURE (identifier (id_expression (regular_id CALC_BONUS))) ( (parameter (parameter_name (identifier (id_expression (regular_id DATE_HIRED)))) (type_spec (datatype (native_datatype_element DATE)))) ) IS (body BEGIN (seq_of_statements (statement (assignment_statement (general_element (general_element_part (id_expression (regular_id LOCAL_PARAM)))) := (expression (logical_expression (unary_logical_expression (multiset_expression (relational_expression (compound_expression (concatenation (model_expression (unary_expression (atom (constant (numeric 0)))))))))))))) ;) END) ;)) END (package_name (identifier (id_expression (regular_id EMP_BONUS)))))) ; <EOF>)"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/packagebody_function.sql",
    "content": "-- Test for ignoring the order of DETERMINISTIC and PIPELINED keywords in function bodies\nCREATE OR REPLACE PACKAGE BODY TEST AS\n    FUNCTION TEST_FUNC RETURN NUMBER PIPELINED DETERMINISTIC AS\n    BEGIN\n        RETURN NULL;\n    END TEST_FUNC;\n    \n    FUNCTION TEST_FUNC2 RETURN NUMBER DETERMINISTIC PIPELINED AS\n    BEGIN\n        RETURN NULL;\n    END TEST_FUNC2;\nEND TEST;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/packagespec_function.sql",
    "content": "-- Adding pipelined and deterministic keyword in one function spec\nCREATE OR REPLACE PACKAGE TEST IS \n    FUNCTION TEST_FUNC RETURN NUMBER PIPELINED DETERMINISTIC;\nEND TEST;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/partitioned_tables.sql",
    "content": "-- https://docs.oracle.com/cd/E18283_01/server.112/e16541/part_admin001.htm\nCREATE TABLE sales\n  ( prod_id       NUMBER(6)\n  , cust_id       NUMBER\n  , time_id       DATE\n  , channel_id    CHAR(1)\n  , promo_id      NUMBER(6)\n  , quantity_sold NUMBER(3)\n  , amount_sold   NUMBER(10,2)\n  )\n PARTITION BY RANGE (time_id)\n ( PARTITION sales_q1_2006 VALUES LESS THAN (TO_DATE('01-APR-2006','dd-MON-yyyy'))\n    TABLESPACE tsa\n , PARTITION sales_q2_2006 VALUES LESS THAN (TO_DATE('01-JUL-2006','dd-MON-yyyy'))\n    TABLESPACE tsb\n , PARTITION sales_q3_2006 VALUES LESS THAN (TO_DATE('01-OCT-2006','dd-MON-yyyy'))\n    TABLESPACE tsc\n , PARTITION sales_q4_2006 VALUES LESS THAN (TO_DATE('01-JAN-2007','dd-MON-yyyy'))\n    TABLESPACE tsd\n );\n\n\nCREATE TABLE sales\n  ( prod_id       NUMBER(6)\n  , cust_id       NUMBER\n  , time_id       DATE\n  , channel_id    CHAR(1)\n  , promo_id      NUMBER(6)\n  , quantity_sold NUMBER(3)\n  , amount_sold   NUMBER(10,2)\n  )\n STORAGE (INITIAL 100K NEXT 50K) LOGGING\n PARTITION BY RANGE (time_id)\n ( PARTITION sales_q1_2006 VALUES LESS THAN (TO_DATE('01-APR-2006','dd-MON-yyyy'))\n    TABLESPACE tsa STORAGE (INITIAL 20K NEXT 10K)\n , PARTITION sales_q2_2006 VALUES LESS THAN (TO_DATE('01-JUL-2006','dd-MON-yyyy'))\n    TABLESPACE tsb\n , PARTITION sales_q3_2006 VALUES LESS THAN (TO_DATE('01-OCT-2006','dd-MON-yyyy'))\n    TABLESPACE tsc\n , PARTITION sales_q4_2006 VALUES LESS THAN (TO_DATE('01-JAN-2007','dd-MON-yyyy'))\n    TABLESPACE tsd\n )\n ENABLE ROW MOVEMENT;\n\n\nCREATE TABLE interval_sales\n    ( prod_id        NUMBER(6)\n    , cust_id        NUMBER\n    , time_id        DATE\n    , channel_id     CHAR(1)\n    , promo_id       NUMBER(6)\n    , quantity_sold  NUMBER(3)\n    , amount_sold    NUMBER(10,2)\n    ) \n  PARTITION BY RANGE (time_id) \n  INTERVAL(NUMTOYMINTERVAL(1, 'MONTH'))\n    ( PARTITION p0 VALUES LESS THAN (TO_DATE('1-1-2007', 'DD-MM-YYYY')),\n      PARTITION p1 VALUES LESS THAN (TO_DATE('1-1-2008', 'DD-MM-YYYY')),\n      PARTITION p2 VALUES LESS THAN (TO_DATE('1-7-2009', 'DD-MM-YYYY')),\n      PARTITION p3 VALUES LESS THAN (TO_DATE('1-1-2010', 'DD-MM-YYYY')) );\n\nCREATE TABLE customers_demo (\n  customer_id number(6),\n  cust_first_name varchar2(20),\n  cust_last_name varchar2(20),\n  credit_limit number(9,2))\nPARTITION BY RANGE (credit_limit)\nINTERVAL (1000)\n(PARTITION p1 VALUES LESS THAN (5001));\n\nCREATE TABLE list_customers\n   ( customer_id             NUMBER(6)\n   , cust_first_name         VARCHAR2(20)\n   , cust_last_name          VARCHAR2(20)\n   , cust_address            CUST_ADDRESS_TYP\n   , nls_territory           VARCHAR2(30)\n   , cust_email              VARCHAR2(30))\n   PARTITION BY LIST (nls_territory) (\n   PARTITION asia VALUES ('CHINA', 'THAILAND'),\n   PARTITION europe VALUES ('GERMANY', 'ITALY', 'SWITZERLAND'),\n   PARTITION west VALUES ('AMERICA'),\n   PARTITION east VALUES ('INDIA'),\n   PARTITION rest VALUES (DEFAULT));\nCREATE TABLE hash_products \n    ( product_id          NUMBER(6)   PRIMARY KEY\n    , product_name        VARCHAR2(50) \n    , product_description VARCHAR2(2000) \n    , category_id         NUMBER(2) \n    , weight_class        NUMBER(1) \n    , warranty_period     INTERVAL YEAR TO MONTH \n    , supplier_id         NUMBER(6) \n    , product_status      VARCHAR2(20) \n    , list_price          NUMBER(8,2) \n    , min_price           NUMBER(8,2) \n    , catalog_url         VARCHAR2(50) \n    , CONSTRAINT          product_status_lov_demo \n                          CHECK (product_status in ('orderable' \n                                                  ,'planned' \n                                                  ,'under development' \n                                                  ,'obsolete') \n ) ) \n PARTITION BY HASH (product_id) \n PARTITIONS 4 \n STORE IN (tbs_01, tbs_02, tbs_03, tbs_04); \n\n\nCREATE TABLE composite_sales\n    ( prod_id        NUMBER(6)\n    , cust_id        NUMBER\n    , time_id        DATE\n    , channel_id     CHAR(1)\n    , promo_id       NUMBER(6)\n    , quantity_sold  NUMBER(3)\n    , amount_sold         NUMBER(10,2)\n    )\nPARTITION BY RANGE (time_id)\nSUBPARTITION BY HASH (channel_id)\n  (PARTITION SALES_Q1_1998 VALUES LESS THAN (TO_DATE('01-APR-1998','DD-MON-YYYY')),\n   PARTITION SALES_Q2_1998 VALUES LESS THAN (TO_DATE('01-JUL-1998','DD-MON-YYYY')),\n   PARTITION SALES_Q3_1998 VALUES LESS THAN (TO_DATE('01-OCT-1998','DD-MON-YYYY')),\n   PARTITION SALES_Q4_1998 VALUES LESS THAN (TO_DATE('01-JAN-1999','DD-MON-YYYY')),\n   PARTITION SALES_Q1_1999 VALUES LESS THAN (TO_DATE('01-APR-1999','DD-MON-YYYY')),\n   PARTITION SALES_Q2_1999 VALUES LESS THAN (TO_DATE('01-JUL-1999','DD-MON-YYYY')),\n   PARTITION SALES_Q3_1999 VALUES LESS THAN (TO_DATE('01-OCT-1999','DD-MON-YYYY')),\n   PARTITION SALES_Q4_1999 VALUES LESS THAN (TO_DATE('01-JAN-2000','DD-MON-YYYY')),\n   PARTITION SALES_Q1_2000 VALUES LESS THAN (TO_DATE('01-APR-2000','DD-MON-YYYY')),\n   PARTITION SALES_Q2_2000 VALUES LESS THAN (TO_DATE('01-JUL-2000','DD-MON-YYYY'))\n      SUBPARTITIONS 8,\n   PARTITION SALES_Q3_2000 VALUES LESS THAN (TO_DATE('01-OCT-2000','DD-MON-YYYY'))\n     (SUBPARTITION ch_c,\n      SUBPARTITION ch_i,\n      SUBPARTITION ch_p,\n      SUBPARTITION ch_s,\n      SUBPARTITION ch_t),\n   PARTITION SALES_Q4_2000 VALUES LESS THAN (MAXVALUE)\n      SUBPARTITIONS 4)\n;\nCREATE TABLE customers_part (\n   customer_id        NUMBER(6),\n   cust_first_name    VARCHAR2(20),\n   cust_last_name     VARCHAR2(20),\n   nls_territory      VARCHAR2(30),\n   credit_limit       NUMBER(9,2))\n   PARTITION BY RANGE (credit_limit)\n   SUBPARTITION BY LIST (nls_territory)\n      SUBPARTITION TEMPLATE\n         (SUBPARTITION east  VALUES\n            ('CHINA', 'JAPAN', 'INDIA', 'THAILAND'),\n          SUBPARTITION west VALUES\n             ('AMERICA', 'GERMANY', 'ITALY', 'SWITZERLAND'),\n          SUBPARTITION other VALUES (DEFAULT))\n      (PARTITION p1 VALUES LESS THAN (1000),\n       PARTITION p2 VALUES LESS THAN (2500),\n       PARTITION p3 VALUES LESS THAN (MAXVALUE));\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/pivot01.sql",
    "content": "select * from pivot_table\n  unpivot (yearly_total for order_mode in (store as 'direct',\n           internet as 'online'))\n  order by year, order_mode\n\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/pivot02.sql",
    "content": "select * from (\n select times_purchased as \"puchase frequency\", state_code\n from customers t\n )\n pivot xml\n (\n count(state_code)\n for state_code in (select state_code from preferred_states)\n )\n order by 1\n\n\t    "
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/pivot03.sql",
    "content": "select * from (\n select times_purchased as \"purchase frequency\", state_code\n from customers t\n )\n pivot xml\n (\n count(state_code)\n for state_code in (any)\n )\n order by 1\n\n\t    "
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/pivot04.sql",
    "content": "select value\nfrom\n(\n (\n select\n 'a' v1,\n 'e' v2,\n 'i' v3,\n 'o' v4,\n 'u' v5\n from dual\n )\n unpivot\n (\n value\n for value_type in\n (v1,v2,v3,v4,v5)\n )\n )\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/pivot05.sql",
    "content": "select *\nfrom   (select customer_id, product_code, quantity\n        from   pivot_test)\npivot xml (sum(quantity) as sum_quantity for (product_code) in (select distinct product_code\n                                                                from   pivot_test))\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/pivot06.sql",
    "content": "select *\nfrom   (select product_code, quantity\n        from   pivot_test)\npivot xml (sum(quantity) as sum_quantity for (product_code) in (select distinct product_code\n                                                                from   pivot_test\n                                                                where  id < 10))"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/pivot07.sql",
    "content": "select *\nfrom   (select customer_id, product_code, quantity\n        from   pivot_test)\npivot  (sum(quantity) as sum_quantity for (product_code) in ('a' as a, 'b' as b, 'c' as c))\norder by customer_id\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/pivot08.sql",
    "content": "select *\nfrom   (select product_code, quantity\n        from   pivot_test)\npivot  (sum(quantity) as sum_quantity for (product_code) in ('a' as a, 'b' as b, 'c' as c))"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/pivot09.sql",
    "content": " select *\n from (s join d using(c))\n pivot\n (\n max(c_c_p) as max_ccp\n , max(d_c_p) max_dcp\n , max(d_x_p) dxp\n , count(1) cnt\n for (i, p) in\n (\n (1,1) as one_one,\n (1,2) as one_two,\n (1,3) as one_three,\n (2,1) as two_one,\n (2,2) as two_two,\n (2,3) as two_three\n )\n )\n where d_t = 'p'\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/pivot10.sql",
    "content": " select *\n from s join d using(c)\n pivot\n (\n max(c_c_p) as max_ccp\n , max(d_c_p) max_dcp\n , max(d_x_p) dxp\n , count(1) cnt\n for (i, p) in\n (\n (1,1) as one_one,\n (1,2) as one_two,\n (1,3) as one_three,\n (2,1) as two_one,\n (2,2) as two_two,\n (2,3) as two_three\n )\n )\n where d_t = 'p'\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/pivot11.sql",
    "content": " select *\n from s\n pivot\n (\n max(c_c_p) as max_ccp\n , max(d_c_p) max_dcp\n , max(d_x_p) dxp\n , count(1) cnt\n for (i, p) in\n (\n (1,1) as one_one,\n (1,2) as one_two,\n (1,3) as one_three,\n (2,1) as two_one,\n (2,2) as two_two,\n (2,3) as two_three\n )\n )\n join d using(c)\n where d_t = 'p'\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/pivot12.sql",
    "content": " select value from\n (\n    (\n        select\n            'a' v1,\n            'e' v2,\n            'i' v3,\n            'o' v4,\n            'u' v5\n        from dual\n    )\n    unpivot include nulls\n    (\n        value\n        for value_type in\n            (v1, v2,v3,v4,v5) -- Also can give ANY here.\n    )\n )"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/pivot13.sql",
    "content": "WITH SessionCTE AS\n         (\n             SELECT\n                 terminal\n             FROM v$session\n         )\nSELECT\n    *\nFROM SessionCTE PIVOT\n    (\n        COUNT(*) FOR terminal IN ('VIRTUALORACLE11' AS oracle_local, 'DRUID' AS druid, 'THOR' AS thor)\n    )"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/purge_statement.sql",
    "content": "PURGE TABLE test;\nPURGE TABLE RB$$33750$TABLE$0;\nPURGE RECYCLEBIN;\nPURGE TABLESPACE ts USER U;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/query_factoring01.sql",
    "content": "with\n  reports_to_101 (eid, emp_last, mgr_id, reportlevel) as\n  (\n     select employee_id, last_name, manager_id, 0 reportlevel\n     from employees\n     where employee_id = 101\n     union all\n     select e.employee_id, e.last_name, e.manager_id, reportlevel+1\n     from reports_to_101 r, employees e\n     where r.eid = e.manager_id\n  )\nselect eid, emp_last, mgr_id, reportlevel\nfrom reports_to_101 r, auto a\nwhere r.c1 = a.c2\norder by reportlevel, eid\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/query_factoring02.sql",
    "content": "with\n  reports_to_101 (eid, emp_last, mgr_id, reportlevel, mgr_list) \n  as\n  (\n     select employee_id, last_name, manager_id, 0 reportlevel\n     , cast(manager_id as varchar2(2000))\n     from employees\n     where employee_id = 101\n  union all\n     select e.employee_id, e.last_name, e.manager_id, reportlevel+1\n     , cast(mgr_list || ',' || manager_id as varchar2(2000))\n     from reports_to_101 r, employees e\n     where r.eid = e.manager_id\n  )\nselect eid, emp_last, mgr_id, reportlevel, mgr_list\nfrom reports_to_101\norder by reportlevel, eid\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/query_factoring03.sql",
    "content": "with\n  reports_to_101 (eid, emp_last, mgr_id, reportlevel) as\n  (\n    select employee_id, last_name, manager_id, 0 reportlevel\n    from employees\n    where employee_id = 101\n  union all\n    select e.employee_id, e.last_name, e.manager_id, reportlevel+1\n    from reports_to_101 r, employees e\n    where r.eid = e.manager_id\n  )\nselect eid, emp_last, mgr_id, reportlevel\nfrom reports_to_101\nwhere reportlevel <= 1\norder by reportlevel, eid\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/query_factoring04.sql",
    "content": "with\n  org_chart (eid, emp_last, mgr_id, reportlevel, salary, job_id) as\n  (\n    select employee_id, last_name, manager_id, 0 reportlevel, salary, job_id\n    from employees\n    where manager_id is null\n  union all\n    select e.employee_id, e.last_name, e.manager_id,\n           r.reportlevel+1 reportlevel, e.salary, e.job_id\n    from org_chart r, employees e\n    where r.eid = e.manager_id\n  )\n  search depth first by emp_last set order1\nselect lpad(' ',2*reportlevel)||emp_last emp_name, eid, mgr_id, salary, job_id\nfrom org_chart\norder by order1\n\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/query_factoring05.sql",
    "content": "with \nx1 as (select max(y1) from klm1),\nx2 as (select max(y2) from klm2),\nx3 as (select max(y3) from klm3),\nx4 as (select max(y4) from klm4)\nselect\n distinct\n -1,\n +1,\n a + b * (a * d) as aaa,\n t1.region_name,\n t2.division_name,\n t1.region_name as a,\n t2.division_name as aaaa,\n a.*,\n sum(t3.amount),\n sum(count(1)) + count(*)\n , sum(1) + (select count(1) from ddd) a\nfrom dual, fff\nwhere a is null \nor b is not null \nand ( a like 'd')\nand 1 = 0\nand a.b is a set\nunion\nselect a from dual\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/query_factoring06.sql",
    "content": "with \n   dept_costs as (\n      select department_name, sum(salary) dept_total\n         from employees e, departments d\n         where e.department_id = d.department_id\n      group by department_name),\n   avg_cost as (\n      select sum(dept_total)/count(*) avg\n      from dept_costs)\nselect * from dept_costs\n   where dept_total >\n      (select avvg from avg_cost)\n      order by department_name\n\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/query_factoring08.sql",
    "content": "with -- qf\n\tx1 as ( select * from t1 ),\n\tx2 as ( select * from t2 join t3 on (t2.a2 = t3.a3))\nselect\n\t*\nfrom\n\tx1\njoin\tx2 on (x1.a1 = x2.a2)\njoin\tt4 on (x1.a1 = t4.a4)\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/query_factoring09.sql",
    "content": "with rn as (\n  select rownum rn\n  from dual\n  connect by level <= (select max(cases) from t1))\nselect pname\nfrom t1, rn\nwhere rn <= cases\norder by pname\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/query_factoring10.sql",
    "content": "with o(obj,link) as\n(\nselect 'a', 'b' from dual union all\nselect 'a', 'c' from dual union all\nselect      'c', 'd' from dual union all\nselect           'd', 'c' from dual union all\nselect           'd', 'e' from dual union all\nselect                'e', 'e' from dual\n),\nt(root,lev,obj,link,path) as (\nselect obj,1,obj,link,cast(obj||'->'||link \nas varchar2(4000))\nfrom o \nwhere obj='a'  -- start with\nunion all\nselect \n  t.root,t.lev+1,o.obj,o.link,\n  t.path||', '||o.obj||\n    '->'\n    ||o.link\nfrom t, o \nwhere t.link=o.obj\n)\nsearch depth first by obj set ord\ncycle obj set cycle to 1 default 0\nselect root,lev,obj,link,path,cycle,\n    case\n    when (lev - lead(lev) over (order by ord)) < 0\n    then 0\n    else 1\n    end is_leaf\n from t\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/query_factoring11.sql",
    "content": "with col_generator as (\nselect t1.batch_id, decode(t1.action, 'sent', t1.actdate) sent,\ndecode(t2.action,'recv', t2.actdate) received\nfrom test t1, test t2\nwhere t2.batch_id(+) = t1.batch_id)\nselect batch_id, max(sent) sent, max(received) received\nfrom col_generator\ngroup by batch_id\norder by 1\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/quntitative_expression.sql",
    "content": "SELECT 1 FROM DUAL WHERE 1 = ANY(1, 2, 3);\nSELECT 1 FROM DUAL WHERE 1 = ANY(1, 2, 3) AND 1 = 1;\nSELECT 1 FROM DUAL WHERE 1 = ANY(1, 2, 3) OR 1 = 1;\nSELECT 1 FROM DUAL WHERE 1 = ANY(1, 2, 3) AND 2 = ANY(2, 3);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/rename_objects.sql",
    "content": "-- Test for RENAME statement of unit_statement (f.e. renaming Oracle jobs)\nRENAME FOO TO BAR;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/revoke_statement.sql",
    "content": "REVOKE DROP ANY TABLE\n    FROM hr, oe;\nREVOKE dw_manager\n    FROM sh;\nREVOKE CREATE TABLESPACE\n    FROM dw_manager;\nREVOKE dw_user\n    FROM dw_manager;\nREVOKE DELETE\n    ON orders FROM hr;\nREVOKE UPDATE\n    ON emp_details_view FROM public;\nREVOKE INHERIT PRIVILEGES ON USER sh FROM hr;\nREVOKE SELECT\n    ON hr.departments_seq FROM oe;\nREVOKE REFERENCES\n    ON hr.employees\n    FROM oe\n    CASCADE CONSTRAINTS;\nREVOKE READ ON DIRECTORY bfile_dir FROM hr;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/round_001.sql",
    "content": "SELECT\nround(\n\tdecode(\n\ta.attribute_name, n.col,\n\ta.attribute_num_value * n.scale + n.shift,\n\ta.attribute_num_value), 4\n\t)\n\tFROM employees"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/round_decode_001.sql",
    "content": "\tSELECT \n\tnvl(\n\ta.attribute_str_value,\n\tround(\n\tdecode(\n\ta.attribute_name, n.col,\n\ta.attribute_num_value * n.scale + n.shift,\n\ta.attribute_num_value), 4\n\t)\n\t) val\n\tfrom employees"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/row_number_001.sql",
    "content": "SELECT department_id, last_name, employee_id, \nROW_NUMBER()\nOVER (PARTITION BY department_id ORDER BY employee_id) AS emp_id\nFROM employees\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/sample01.sql",
    "content": "select * from \n(\nselect 1 as c1 from \"sys\".\"obj$\" sample block (14.285714 , 1) seed (1) \"o\"\n) samplesub\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/select_all_some_any.sql",
    "content": "\nselect * from \"CW_ROLE\" where role_id = some(1,5);\nselect * from \"T_ROLE\" where role_id = any(1,5);\nselect * from \"T_ROLE\" where role_id = all(1,5);\n\nselect u.name, u.sex, u.age from sys.user u;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/select_analytic_view.sql",
    "content": "WITH\n  my_av ANALYTIC VIEW AS (\n    USING sales_av HIERARCHIES (time_hier)\n    ADD MEASURES (\n      lag_sales AS (LAG(sales) OVER (HIERARCHY time_hier OFFSET 1))\n    )\n  )\nSELECT time_hier.member_name time, sales, lag_sales\nFROM my_av HIERARCHIES (time_hier)\nWHERE time_hier.level_name = 'YEAR'\nORDER BY time_hier.hier_order;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/select_cte.sql",
    "content": "-- offset, fetch and order by is acceptable in with clause subquery\nWITH t AS (SELECT dummy\n             FROM dual\n             ORDER BY dummy ASC NULLS LAST\n             OFFSET 0 ROWS\n             FETCH FIRST ROW ONLY)\nSELECT dummy FROM t\nORDER BY dummy ASC NULLS LAST\nOFFSET 0 ROWS\nFETCH FIRST ROW ONLY;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/select_dense_rank.sql",
    "content": "-- undocumented (?) feature of first/last: you could replace mandatory \"order by\" clause by \"partition by\" clause\nselect max(dummy) keep(dense_rank first partition by dummy)\n     , max(dummy) keep(dense_rank last partition by dummy)\nfrom dual;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/select_flashback_query.sql",
    "content": " select *\n    from sale_op_tbl versions period for dt between CURRENT_DATE - 10 and CURRENT_DATE\n    where id_store = 589\n      and id_item = 29584;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/select_hierarchical_query.sql",
    "content": "-- https://stackoverflow.com/questions/10043445/oracle-connect-by-clause-after-group-by-clause\n-- CONNECT BY comes after GROUP BY\nSELECT deptno,\n       LTRIM(MAX(SYS_CONNECT_BY_PATH(ename,','))\n       KEEP (DENSE_RANK LAST ORDER BY curr),',') AS employees\nFROM   (SELECT deptno,\n               ename,\n               ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY ename) AS curr,\n               ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY ename) -1 AS prev\n        FROM   emp)\nGROUP BY deptno\nCONNECT BY prev = PRIOR curr AND deptno = PRIOR deptno\nSTART WITH curr = 1;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/select_package_function.sql",
    "content": "SELECT DBMS_LOB.SUBSTR(FIELD_1,4000,1) AS FIELD_1, 'ABC' AS FIELD_2 FROM TABLE_1"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/select_time.sql",
    "content": "SELECT TIME '19:00:00'+INTERVAL '9' HOUR, TIME '19:00:00'-INTERVAL '9' HOUR  from dual;\nSELECT TIME '19:00:00'+INTERVAL '9' DAY, TIME '19:00:00'-INTERVAL '9' DAY  from dual;\nSELECT TIME '19:00:00'+INTERVAL '9' SECOND, TIME '19:00:00'-INTERVAL '9' SECOND  from dual;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/select_without_from.sql",
    "content": "SELECT 2*3;\nSELECT 2*3 WHERE 1=0;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/seq_token_error.sql",
    "content": "select seq from employees;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/simple02.sql",
    "content": "select employee_id from (select employee_id+1 as employee_id from employees)\n   for update\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/simple03.sql",
    "content": "select employee_id from (select employee_id+1 as employee_id from employees)\n   for update of employee_id\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/simple04.sql",
    "content": "select * from\n(\n\t(\n\t\tselect * from dual\n\t)\n\tunpivot\n\t(\n\t\tvalue for value_type in (dummy)\n\t)\n)\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/simple05.sql",
    "content": "select * from\n(\nselect * from a \n\tunpivot\n\t(\n\t\tvalue for value_type in (dummy)\n\t)\n)\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/simple06.sql",
    "content": "select * from (( select * from dual)) a\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/simple07.sql",
    "content": "select * from dual for update\nof dual\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/simple08.sql",
    "content": "select a, b, c, d, e, 1, 2, f(a,b,c,1+1) from dual\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/simple09.sql",
    "content": "select a||last_name,\n        employee_id\n    from employees\n    start with job_id = 'ad_vp' \n    connect by prior employee_id = manager_id\n\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/simple10.sql",
    "content": "select a as over from over\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/simple11.sql",
    "content": "select a.* from dual\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/simple12.sql",
    "content": "select\n +1,\n t2.division_name as aaaa,\n a.*,\n sum(t3.amount)\nfrom dual\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/simple13.sql",
    "content": "select * from (dual),  (dual d), (dual) d\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/single_statement.sql",
    "content": "create TABLE PROCESSED AS (\nselect * FROM T_ORDER_PROCESSED f)\n       --     WHERE\n       -- TO_CHAR(to_date('20'||f.nr_ano,'YYYY'),'YYYY')||'/'||TRIM(TO_CHAR(f.nr_mes,'00')) = :refCompAcad);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/string01.sql",
    "content": "select\n  'hello'\n, 'oracle.dbs'\n, 'jackie''s raincoat'\n, '09-mar-98'\n, ''\n, ''''\n, q'!name like '%dbms_%%'!'\n, q'<'so,' she said, 'it's finished.'>'\n, q'{select * from employees where last_name = 'smith'}'\n, q'\"name like '['\"'\n, q'#name like #smth #'\n, q''name like 'smth ''\n, q'(name like )) )'\n, q'~name like ~~~ ~'\n, q'/name like // /'\n, q'\\name like \\\\ \\'\n, n'nchar literal'\nfrom dual\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/timing.sql",
    "content": "TIMING;\n\nTIMING START;\nTIMING START one_word;\nTIMING START more_than_one_word;\n\nTIMING SHOW;\n\nTIMING STOP;\n\n-- verify that selecting a column named TIMING still work\nSELECT timing FROM some_table;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/timing.sql.tree",
    "content": "(sql_script (sql_plus_command (timing_command TIMING)) ; (sql_plus_command (timing_command TIMING START)) ; (sql_plus_command (timing_command TIMING START (id_expression (regular_id one_word)))) ; (sql_plus_command (timing_command TIMING START (id_expression (regular_id more_than_one_word)))) ; (sql_plus_command (timing_command TIMING SHOW)) ; (sql_plus_command (timing_command TIMING STOP)) ; (unit_statement (data_manipulation_language_statements (select_statement (select_only_statement (subquery (subquery_basic_elements (query_block SELECT (selected_list (select_list_elements (expression (logical_expression (unary_logical_expression (multiset_expression (relational_expression (compound_expression (concatenation (model_expression (unary_expression (atom (general_element (general_element_part (id_expression (regular_id (non_reserved_keywords_pre12c timing))))))))))))))))) (from_clause FROM (table_ref_list (table_ref (table_ref_aux (table_ref_aux_internal (dml_table_expression_clause (tableview_name (identifier (id_expression (regular_id some_table))))))))))))))))) ; <EOF>)"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/to_binary_double.sql",
    "content": "select\n\traw_value,\n\tto_binary_double(raw_value),\n\tto_binary_double(raw_value, '9990.9999'),\n\tto_binary_double(raw_value, '9990.9999', 'NLS_DATE_LANGUAGE = RUSSIAN'),\n\tto_binary_double(raw_value default 0 on conversion error),\n\tto_binary_double(raw_value default 0 on conversion error, '9990.9999'),\n\tto_binary_double(raw_value default 0 on conversion error, '9990.9999', 'NLS_DATE_LANGUAGE = RUSSIAN')\nfrom raw_values;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/to_binary_float.sql",
    "content": "select\n\traw_value,\n\tto_binary_float(raw_value),\n\tto_binary_float(raw_value, '9990.9999'),\n\tto_binary_float(raw_value, '9990.9999', 'NLS_DATE_LANGUAGE = RUSSIAN'),\n\tto_binary_float(raw_value default 0 on conversion error),\n\tto_binary_float(raw_value default 0 on conversion error, '9990.9999'),\n\tto_binary_float(raw_value default 0 on conversion error, '9990.9999', 'NLS_DATE_LANGUAGE = RUSSIAN')\nfrom raw_values;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/to_char.sql",
    "content": "SELECT TO_CHAR(SYSDATE), TO_CHAR(SYSDATE, 'D'), TO_CHAR(SYSDATE, 'D', 'NLS_DATE_LANGUAGE = RUSSIAN') FROM DUAL"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/to_char_001.sql",
    "content": "SELECT  TO_CHAR(\"date\", 'YYYY-MM') || '-01' as \"month\" FROM employes"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/to_char_002.sql",
    "content": "select TO_CHAR(commission_pct) as \"commission\" from employees"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/to_date.sql",
    "content": "SELECT TO_DATE('01.Jan.12') FROM DUAL;\nSELECT TO_DATE('01.01.2012', 'dd.mm.yyyy') FROM DUAL;\nSELECT TO_DATE('01' || '.01.2012', 'dd.mm.yyyy') FROM DUAL;\nSELECT TO_DATE('01.' || (NQUATER*3 - 2) || '.' || NRYEAR, 'DD.MM.YYYY') FROM DUAL;\nSELECT LAST_DAY(TO_DATE('01.' || (NQUATER*3 - 2) || '.' || NRYEAR, 'DD.MM.YYYY')) FROM DUAL;\nSELECT TO_CHAR(LAST_DAY(TO_DATE('01.' || (NQUATER*3 - 2) || '.' || NRYEAR, 'DD.MM.YYYY')),'DD') FROM DUAL;\nSELECT TO_DATE(\"CHAR_COLUMN\") FROM EMPLOYES;\nSELECT TO_DATE(\"CHAR_COLUMN\",'DD.MM.YYYY') FROM EMPLOYES;\nSELECT TO_DATE(E.\"CHAR_COLUMN\",'DD.MM.YYYY') FROM EMPLOYES E;\nSELECT TO_DATE('01.01.2012' DEFAULT NULL ON CONVERSION ERROR) FROM DUAL;\nSELECT TO_DATE('01.01.2012' DEFAULT NULL ON CONVERSION ERROR, 'dd.mm.yyyy') FROM DUAL;\nSELECT TO_DATE('01.01.2012' DEFAULT NULL ON CONVERSION ERROR, 'dd.mm.yyyy', 'NLS_DATE_LANGUAGE = RUSSIAN') FROM DUAL;\nSELECT TO_DATE('01.01.2012' DEFAULT '01.01.1970' ON CONVERSION ERROR) FROM DUAL;\nSELECT TO_DATE('01.01.2012' DEFAULT '01.01.1970' ON CONVERSION ERROR, 'dd.mm.yyyy') FROM DUAL;\nSELECT TO_DATE('01.01.2012' DEFAULT '01.01.1970' ON CONVERSION ERROR, 'dd.mm.yyyy', 'NLS_DATE_LANGUAGE = RUSSIAN') FROM DUAL;\nSELECT TO_DATE(\"CHAR_COLUMN\" DEFAULT NULL ON CONVERSION ERROR) FROM DUAL;\nSELECT TO_DATE(\"CHAR_COLUMN\" DEFAULT NULL ON CONVERSION ERROR, 'dd.mm.yyyy') FROM DUAL;\nSELECT TO_DATE(\"CHAR_COLUMN\" DEFAULT NULL ON CONVERSION ERROR, 'dd.mm.yyyy', 'NLS_DATE_LANGUAGE = RUSSIAN') FROM DUAL;\nSELECT TO_DATE(\"CHAR_COLUMN\" DEFAULT '01.01.1970' ON CONVERSION ERROR) FROM DUAL;\nSELECT TO_DATE(\"CHAR_COLUMN\" DEFAULT '01.01.1970' ON CONVERSION ERROR, 'dd.mm.yyyy') FROM DUAL;\nSELECT TO_DATE(\"CHAR_COLUMN\" DEFAULT '01.01.1970' ON CONVERSION ERROR, 'dd.mm.yyyy', 'NLS_DATE_LANGUAGE = RUSSIAN') FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/to_dsinterval.sql",
    "content": "select\n\tto_dsinterval('10 1:02:10'),\n\tto_dsinterval('1o 1:02:10' default '10 8:00:00' on conversion error),\n\tto_dsinterval(raw_value),\n\tto_dsinterval(raw_value default '10 8:00:00' on conversion error),\n\tto_dsinterval(\"RAW_VALUE\" default '10 8:00:00' on conversion error)\nfrom raw_values;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/to_number.sql",
    "content": "select\n\traw_value,\n\tto_number(raw_value),\n\tto_number(raw_value, '9990.9999'),\n\tto_number(raw_value, '9990.9999', 'NLS_DATE_LANGUAGE = RUSSIAN'),\n\tto_number(raw_value default 0 on conversion error),\n\tto_number(raw_value default 0 on conversion error, '9990.9999'),\n\tto_number(raw_value default 0 on conversion error, '9990.9999', 'NLS_DATE_LANGUAGE = RUSSIAN')\nfrom raw_values;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/to_timestamp.sql",
    "content": "select\n\traw_value,\n\tto_timestamp(raw_value),\n\tto_timestamp(raw_value, 'YYYY-MM-DD'),\n\tto_timestamp(raw_value, 'YYYY-MM-DD', 'NLS_DATE_LANGUAGE = RUSSIAN'),\n\tto_timestamp(raw_value default '1970-01-01' on conversion error, 'YYYY-MM-DD'),\n\tto_timestamp(raw_value default '1970-01-01' on conversion error, 'YYYY-MM-DD', 'NLS_DATE_LANGUAGE = RUSSIAN'),\n\tto_timestamp(raw_value default null on conversion error),\n\tto_timestamp(raw_value default null on conversion error, 'YYYY-MM-DD'),\n\tto_timestamp(raw_value default null on conversion error, 'YYYY-MM-DD', 'NLS_DATE_LANGUAGE = RUSSIAN')\nfrom raw_values;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/to_timestamp_tz.sql",
    "content": "select\n\traw_value,\n\tto_timestamp_tz(raw_value),\n\tto_timestamp_tz(raw_value, 'YYYY-MM-DD'),\n\tto_timestamp_tz(raw_value, 'YYYY-MM-DD', 'NLS_DATE_LANGUAGE = RUSSIAN'),\n\tto_timestamp_tz(raw_value default '1970-01-01' on conversion error, 'YYYY-MM-DD'),\n\tto_timestamp_tz(raw_value default '1970-01-01' on conversion error, 'YYYY-MM-DD', 'NLS_DATE_LANGUAGE = RUSSIAN'),\n\tto_timestamp_tz(raw_value default null on conversion error),\n\tto_timestamp_tz(raw_value default null on conversion error, 'YYYY-MM-DD'),\n\tto_timestamp_tz(raw_value default null on conversion error, 'YYYY-MM-DD', 'NLS_DATE_LANGUAGE = RUSSIAN')\nfrom raw_values;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/to_yminterval.sql",
    "content": "select\n\tto_dsinterval('10-02'),\n\tto_dsinterval('1x-02' default '00-00' on conversion error),\n\tto_dsinterval(raw_value),\n\tto_dsinterval(raw_value default '00-00' on conversion error),\n\tto_dsinterval(\"RAW_VALUE\" default '00-00' on conversion error)\nfrom raw_values;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/truncate_cluster.sql",
    "content": "TRUNCATE CLUSTER personnel REUSE STORAGE;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/truncate_table.sql",
    "content": "truncate table test;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/unified.sql",
    "content": "AUDIT POLICY table_pol;\nAUDIT POLICY dml_pol BY hr, sh;\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/union01.sql",
    "content": "select 'a' obj, 'b' link from dual union all\nselect 'a', 'c' from dual union all\nselect      'c', 'd' from dual union all\nselect           'd', 'c' from dual union all\nselect           'd', 'e' from dual union all\nselect                'e', 'e' from dual\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/union02.sql",
    "content": "select distinct job_id from hr.jobs\nunion all\nselect distinct job_id from hr.job_history\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/union03.sql",
    "content": "select distinct job_id from hr.jobs\nunion all\n(\n\tselect distinct job_id from hr.job_history\n)\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/union04.sql",
    "content": "(\n\tselect distinct job_id from hr.jobs\n)\nunion all\n(\n\tselect distinct job_id from hr.job_history\n\tunion all\n\t((((\n\t\tselect distinct job_id from hr.job_history\n\t\tunion all\n\t\t(\n\t\t\tselect distinct job_id from hr.job_history\n\t\t)\n\t)))\n\tunion all\n\t\tselect distinct job_id from hr.job_history\t\n\t)\t\n)\nunion all\n(\n\tselect distinct job_id from hr.job_history\n\tunion all\n\t(\n\t\tselect distinct job_id from hr.job_history\n\t\tunion all\n\t\t(\n\t\t\tselect distinct job_id from hr.job_history\n\t\t)\n\t)\n)\nunion all\n(\n\tselect distinct job_id from hr.job_history\n\tunion all\n\tselect distinct job_id from hr.job_history\n)\nunion all\n\tselect distinct job_id from hr.job_history\nunion all\n\tselect distinct job_id from hr.job_history\nunion all\n\tselect distinct job_id from hr.job_history\nunion all\n\tselect distinct job_id from hr.job_history\t\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/union05.sql",
    "content": "select * from dual\nunion all\n(\n\tselect * from dual\n)\nunion all\n(\n\tselect * from dual\n)\nunion all\n(\n\tselect * from dual\n)\nunion all\n(\n\tselect * from dual\n)\nunion all\n(\n\tselect * from dual\n)\nunion all\n(\n\tselect * from dual\n)\nunion all\n(\n\tselect * from dual\n)\norder by 1 asc, 2 asc\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/union06.sql",
    "content": "(  select \"x\".\"r_no\",   \n          \"x\".\"i_id\",   \n\t  \"x\".\"ind\",\t\n\t  \"x\".\"item\",   \n\t  '0' \"o\"\n   from \"x\"        \n   where (\"x\".\"r_no\" = :a)\n   minus\n   select \"y\".\"r_no\",   \n          \"y\".\"i_id\",\n \t  \"y\".\"ind\",\t   \n \t  \"y\".\"item\",   \n \t  '0' \"o\"  \n   from \"y\"\n   where (\"y\".\"r_no\" = :a)\n)\nunion\n(  select \"y\".\"r_no\",   \n          \"y\".\"i_id\",   \n \t  \"y\".\"ind\",\t\n \t  \"y\".\"item\",   \n \t  '1' \"o\"  \n   from \"y\"\n   where (\"y\".\"r_no\" = :a)\n   minus\n   select \"x\".\"r_no\",   \n          \"x\".\"i_id\",\n          \"x\".\"ind\",   \n          \"x\".\"item\",   \n\t  '1' \"o\"  \n    from \"x\"\n    where (\"x\".\"r_no\" = :a)\n)\norder by 4,3,1\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/union07.sql",
    "content": "--\n-- note: this query was copied from the druid project\n-- http://code.alibabatech.com/wiki/display/druid/home\n-- \nselect * from (\n        select row_.*, rownum rownum_\n        from (\n                select *\n                        from\n                        (\n                                select results.*,row_number() over ( partition by results.object_id order by results.gmt_modified desc) rn\n                                from\n                                (\n                                        (\n                                                select                                        sus.id                id,          sus.gmt_create        gmt_create,\n                                                        sus.gmt_modified      gmt_modified,          sus.company_id        company_id,\n                                                        sus.object_id         object_id,          sus.object_type       object_type,\n                                                        sus.confirm_type      confirm_type,          sus.operator          operator,\n                                                        sus.filter_type       filter_type,          sus.member_id         member_id,\n                                                        sus.member_fuc_q        member_fuc_q,          sus.risk_type         risk_type     , 'y' is_draft\n                                                from                        f_u_c_ sus , a_b_c_draft p                                                              ,\n                                                        member m\n                                                where 1=1                                               and             p.company_id = m.company_id\n                                                        and                     m.login_id=?\n                                                        and p.sale_type in(                     ?                       )\n                                                        and p.id=sus.object_id\n                                        )\n                                        union\n                                        (\n                                                select                                        sus.id                id,          sus.gmt_create        gmt_create,\n                                                        sus.gmt_modified      gmt_modified,          sus.company_id        company_id,\n                                                        sus.object_id         object_id,          sus.object_type       object_type,\n                                                        sus.confirm_type      confirm_type,          sus.operator          operator,\n                                                        sus.filter_type       filter_type,          sus.member_id         member_id,\n                                                        sus.member_fuc_q        member_fuc_q,          sus.risk_type         risk_type     , 'n' is_draft\n                                                from f_u_c_ sus , a_b_c p                                                                   ,member m\n                                                where 1=1\n                                                        and             p.company_id = m.company_id\n                                                        and                     m.login_id=?\n                                                        and p.sale_type in(                     ?                       )\n                                                        and p.id=sus.object_id\n                                        )\n                                        ) results\n                                )               where rn = 1 order by gmt_modified desc\n                        )row_ where rownum <= ?\n        )\nwhere rownum_ >= ?\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/union08.sql",
    "content": "select * from dual where exists (\n\tselect * from dual\n\tunion all\n\tselect * from dual\n)\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/union09.sql",
    "content": "select * from (\n        select row_.*\n        from (\n                select *\n                        from\n                        (\n                                select results.*, 1 rn\n                                from\n                                (\n                                        (\n                                                select  dummy\n                                                from    dual\n                                                where 1=1\n                                        )\n                                        union\n                                        (\n                                                select dummy\n                                                from   dual\n                                                where 1=1\n                                        )\n                                ) results\n                        )\n                        where rn = 1 order by dummy desc\n               )row_ \n               where rownum <= 1\n        )\nwhere rownum >= 1\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/union10.sql",
    "content": "select                                                                                                                                                    \n(                                                                                                                                                              \n (                                                                                                                                                             \n  select 'y' from dual                                                                                                                                         \n  where exists ( select 1 from dual where 1 = 0 )                                                                                                              \n )                                                                                                                                                             \n union                                                                                                                                                         \n (                                                                                                                                                             \n  select 'n' from dual                                                                                                                                         \n  where not exists ( select 1 from dual where 1 = 0 )                                                                                                          \n )                                                                                                                                                             \n)                                                                                                                                                              \nas yes_no                                                                                                                                                      \nfrom dual\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/validate_conversion.sql",
    "content": "select\n\traw_value,\n\tvalidate_conversion(raw_value as number),\n\tvalidate_conversion(raw_value as date, 'YYYY-MM-DD'),\n\tvalidate_conversion(raw_value as date, 'YYYY-MM-DD', 'NLS_DATE_LANGUAGE = RUSSIAN')\nfrom raw_values;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/values_clause.sql",
    "content": "CREATE OR REPLACE PACKAGE TEST_PKG_LXD\nAS\n-- Package header\n\nPROCEDURE values_test;\n\nEND TEST_PKG_LXD;\n\nCREATE OR REPLACE PACKAGE BODY TEST_PKG_LXD\nAS\n-- Package body\n-- This test case compiles and runs fine on 'Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production'\n\n    PROCEDURE values_test\n    IS\n\n        TYPE value_type IS RECORD (ID PLS_INTEGER, VALUE VARCHAR2(100));\n        TYPE list IS TABLE OF value_type INDEX BY PLS_INTEGER;\n        tmp_list list;\n\n    BEGIN\n\n        tmp_list(0).ID := 1;\n        tmp_list(0).VALUE := 'test_value';\n\n        --The DDL of TEST_TB is 'CREATE TABLE TEST_TB(id NUMBER(3), value VARCHAR2(100))'\n        INSERT INTO TEST_TB VALUES tmp_list(0);\n\n    END values_test;\n\nEND TEST_PKG_LXD;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/varray_type_def.sql",
    "content": "CREATE OR REPLACE PACKAGE TEST_PKG_LXD\nAS\n-- Package header\n\nPROCEDURE varray_def_test;\n\nEND TEST_PKG_LXD;\n\nCREATE OR REPLACE PACKAGE BODY TEST_PKG_LXD\nAS\n-- Package body\n-- This test case passed on 'Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production'\n\n    PROCEDURE varray_def_test\n    IS\n        -- All of these varray definition are valid\n        TYPE type_array1 IS VARRAY(5) OF PLS_INTEGER;\n        TYPE type_array2 IS VARYING ARRAY(5) OF PLS_INTEGER;\n        TYPE type_array3 IS VARRAY(5) OF PLS_INTEGER;\n\n        array1 type_array1;\n        array2 type_array2;\n        array3 type_array3;\n    BEGIN\n\n        array1 := type_array1(1);\n        array2 := type_array2(2);\n        array3 := type_array3(3);\n\n        dbms_output.put_line('v1=' || array1(1) || ', v2=' || array2(1) || ', v3=' || array3(1));\n\n    END varray_def_test;\n\nEND TEST_PKG_LXD;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/views.sql",
    "content": "CREATE VIEW emp_view AS \n   SELECT last_name, salary*12 annual_salary\n   FROM employees \n   WHERE department_id = 20;\n\nCREATE EDITIONING VIEW ed_orders_view (o_id, o_date, o_status)\n  AS SELECT order_id, order_date, order_status FROM orders\n  WITH READ ONLY;\n\nCREATE VIEW emp_sal (emp_id, last_name, \n      email UNIQUE RELY DISABLE NOVALIDATE,\n   CONSTRAINT id_pk PRIMARY KEY (emp_id) RELY DISABLE NOVALIDATE)\n   AS SELECT employee_id, last_name, email FROM employees;\n\nCREATE VIEW clerk AS\n   SELECT employee_id, last_name, department_id, job_id\n   FROM employees\n   WHERE job_id = 'PU_CLERK'\n      or job_id = 'SH_CLERK'\n      or job_id = 'STA_CLERK';\n\nCREATE VIEW clerk AS\n   SELECT employee_id, last_name, department_id, job_id\n   FROM employees\n   WHERE job_id = 'PU_CLERK'\n      or job_id = 'SH_CLERK'\n      or job_id = 'ST_CLERK'\n   WITH CHECK OPTION;\n\nCREATE VIEW locations_view AS\n   SELECT d.department_id, d.department_name, l.location_id, l.city\n   FROM departments d, locations l\n   WHERE d.location_id = l.location_id;\n\nCREATE VIEW customer_ro (name, language, credit)\n      AS SELECT cust_last_name, nls_language, credit_limit\n      FROM customers\n      WITH READ ONLY;\n\nCREATE OR REPLACE VIEW oc_inventories OF inventory_typ\n WITH OBJECT ID (product_id)\n AS SELECT i.product_id,\n           warehouse_typ(w.warehouse_id, w.warehouse_name, w.location_id),\n           i.quantity_on_hand\n    FROM inventories i, warehouses w\n    WHERE i.warehouse_id=w.warehouse_id;\n\nCREATE EDITIONABLE VIEW TEST (A, B, C)\n      AS SELECT 'A', 'B', 'C'\n      FROM DUAL;\n\nCREATE VIEW TEST (A, B, C)\n      AS \n      WITH TESTCTE AS (\n        SELECT 1 ONE FROM DUAL\n      )\n      SELECT 'A', 'B', 'C'\n      FROM DUAL\n      JOIN TESTCTE;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/whenever_sqlerror.sql",
    "content": "WHENEVER SQLERROR CONTINUE;\nWHENEVER SQLERROR CONTINUE COMMIT;\nWHENEVER SQLERROR CONTINUE ROLLBACK;\nWHENEVER SQLERROR CONTINUE NONE;\n\nWHENEVER SQLERROR EXIT SQL.SQLCODE;\nWHENEVER SQLERROR EXIT SQL.SQLCODE COMMIT;\nWHENEVER SQLERROR EXIT SQL.SQLCODE ROLLBACK;\n\nWHENEVER SQLERROR EXIT 1;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/whenever_sqlerror.sql.tree",
    "content": "(sql_script (sql_plus_command (whenever_command WHENEVER SQLERROR CONTINUE)) ; (sql_plus_command (whenever_command WHENEVER SQLERROR CONTINUE COMMIT)) ; (sql_plus_command (whenever_command WHENEVER SQLERROR CONTINUE ROLLBACK)) ; (sql_plus_command (whenever_command WHENEVER SQLERROR CONTINUE NONE)) ; (sql_plus_command (whenever_command WHENEVER SQLERROR EXIT (variable_name (id_expression (regular_id (non_reserved_keywords_pre12c SQL))) . (id_expression (regular_id SQLCODE))))) ; (sql_plus_command (whenever_command WHENEVER SQLERROR EXIT (variable_name (id_expression (regular_id (non_reserved_keywords_pre12c SQL))) . (id_expression (regular_id SQLCODE))) COMMIT)) ; (sql_plus_command (whenever_command WHENEVER SQLERROR EXIT (variable_name (id_expression (regular_id (non_reserved_keywords_pre12c SQL))) . (id_expression (regular_id SQLCODE))) ROLLBACK)) ; (sql_plus_command (whenever_command WHENEVER SQLERROR EXIT (numeric 1))) ; <EOF>)"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/xml_function.sql",
    "content": "SELECT\n    XMLAGG(XMLELEMENT(X,first_name, ',')\n        ORDER BY FIRST_NAME).extract('//text()').getClobVal() AS \"NAMES\"\nFROM STUDENTS;\n\nSELECT\n    XMLCOLATTVAL(first_name,first_name, first_name).extract('//text()').getClobVal()\nFROM STUDENTS;\n\nSELECT\n    XMLFOREST(first_name,first_name, first_name).extract('//text()').getClobVal()\nFROM STUDENTS;\n\nSELECT\n    XMLELEMENT(TEST,first_name , ',').extract('//text()').getClobVal()\nFROM STUDENTS;\n\nSELECT XMLPARSE(CONTENT '124 <purchaseOrder poNo=\"12435\">\n   <customerName> Acme Enterprises</customerName>\n   <itemNo>32987457</itemNo>\n   </purchaseOrder>'\nWELLFORMED).extract('//text()').getClobVal() AS PO FROM DUAL;\n\nSELECT XMLPI(NAME \"Order analysisComp\", 'imported, reconfigured, disassembled').extract('//text()').getClobVal()\n           AS \"XMLPI\" FROM DUAL;\n\nSELECT warehouse_name,\n       EXTRACTVALUE(warehouse_spec, '/Warehouse/Area'),\n       XMLQuery(\n               'for $i in /Warehouse\n               where $i/Area > 50000\n               return <Details>\n                         <Docks num=\"{$i/Docks}\"/>\n                         <Rail>\n                           {\n                           if ($i/RailAccess = \"Y\") then \"true\" else \"false\"\n                           }\n                         </Rail>\n                      </Details>' PASSING warehouse_spec RETURNING CONTENT).extract('//text()').getClobVal() \"Big_warehouses\"\nFROM warehouses;\n\nSELECT XMLROOT ( XMLType('<poid>143598</poid>'), VERSION '1.0', STANDALONE YES).extract('//text()').getClobVal()\n           AS \"XMLROOT\" FROM DUAL;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/xmltable01.sql",
    "content": "-- See https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions228.htm\n\nSELECT warehouse_name warehouse,\n   warehouse2.\"Water\", warehouse2.\"Rail\", warehouse2.\"Box\"\n   FROM warehouses,\n   XMLTABLE(xmlnamespaces ('http://www.example.com/xml/path' AS \"a\"),\n      '/Warehouse'\n      PASSING warehouses.warehouse_spec\n      COLUMNS \n         \"Water\" varchar2(6) PATH '/Warehouse/WaterAccess',\n         \"Rail\" varchar2(6) PATH '/Warehouse/RailAccess',\n         \"Box\" varchar2(6) PATH '/Warehouse/BoxAccess')\n      warehouse2;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/xmltable02.sql",
    "content": "select xmlelement(\"other_attrs\", xmlelement(\"parsing_user_id\", parsing_user_id)).getClobVal() other\nfrom f\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples/xmltable03.sql",
    "content": "-- XMLTable and outer join methods: http://anononxml.blogspot.com/2011/06/xmltable-and-outer-join-methods.html\n\nselect master_id\n          ,details_id\n          ,sub_details_id\n   from demo4 s\n        ,XMLTable('master' \n                  passing (s.xml) \n                  columns master_id varchar2 (20) path 'id'\n                          ,details XMLType path 'details/detail') mstr\n        ,XMLTable('detail' \n                  passing (mstr.details) \n                  columns details_id varchar2 (20) path 'id'\n                          ,sub_details XMLType path 'sub_details/sub_detail')(+) dtl\n        ,XMLTable('sub_detail' \n                  passing (dtl.sub_details) \n                  columns sub_details_id varchar2 (20) path 'id')(+) sub_dtl;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples-sql-script/anonymous_block.sql",
    "content": "DECLARE\n  NUX NUMBER := 1;\nBEGIN\n  DBMS_OUTPUT.PUT_LINE('Hello');\nEXCEPTION\n  WHEN OTHERS THEN\n    DBMS_OUTPUT.PUT_LINE('Something went wrong!');\nEND;\n/\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples-sql-script/cursor-attributes-with-spaces.sql",
    "content": "DROP PACKAGE TCERS.PK_GRAMMAR_TEST;\n\nCREATE OR REPLACE PACKAGE TCERS.PK_GRAMMAR_TEST AS \n\n  function test return number;\n\nEND PK_GRAMMAR_TEST;\n/\nDROP PACKAGE BODY TCERS.PK_GRAMMAR_TEST;\n\nCREATE OR REPLACE PACKAGE BODY TCERS.PK_GRAMMAR_TEST AS\n\n  function test return number AS\n    src_row all_source% rowtype;\n    n pls_integer;\n    cursor src is select * from all_source;\n  BEGIN\n    open src;\n    loop\n      fetch src into src_row;\n      \n      if src% notfound then\n        exit;\n      end if;\n      \n      if src%  found then\n        null;\n      end if;\n      \n    end loop;\n    \n    if src%     isopen then\n      close src;\n    end if;\n    \n    RETURN sql%   rowcount;\n  END test;\n\nEND PK_GRAMMAR_TEST;\n/\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples-sql-script/declare_procedure_no_args.sql",
    "content": "declare\n    procedure proc;\n    var number;\nbegin\n    null;\nend;\n/\n\ncreate or replace package pkg is\n    procedure proc;\n    var number;\nend pkg;\n/\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples-sql-script/delete_as_regular_id.pkb",
    "content": "CREATE OR REPLACE PACKAGE BODY FOO\nAS\n    PROCEDURE BAR(COLL COLL_TYPE)\n    IS\n    BEGIN\n        COLL.DELETE;\n        COLL.DELETE();\n        COLL.DELETE(42);\n        COLL.DELETE(42, 64);\n    END BAR;\nEND FOO;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples-sql-script/deterministic_function.pks",
    "content": "create or replace package deterministic_function\nis\n\n  function fixed_value return varchar2 deterministic;\n\nend deterministic_function;\n/\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples-sql-script/e_in_out_parameters.pks",
    "content": "create or replace package e_in_out_parameters\nis\n\n  procedure some_in_nocopy_procedure( p_string in nocopy varchar2 );\n\nend e_in_out_parameters;\n/\n\nshow errors;\n\ncreate or replace package e_in_out_parameters\nis\n\n  procedure some_out_in_procedure( p_string out in varchar2 );\n\nend e_in_out_parameters;\n/\n\nshow errors;\n\ncreate or replace package e_in_out_parameters\nis\n\n  procedure some_inout_procedure( p_string inout varchar2 );\n\nend e_in_out_parameters;\n/\n\nshow errors\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples-sql-script/grants.sql",
    "content": "-- 4 Roles for scott\nGRANT DEFAULT_ROLE TO scott WITH ADMIN OPTION;\nGRANT CONNECT TO scott;\nGRANT USR_DEFAULT_CONNECT TO scott WITH ADMIN OPTION;\nALTER USER scott DEFAULT ROLE CONNECT;\n -- 3 System Privileges for scott\nGRANT ALTER USER TO scott;\nGRANT CREATE TABLE TO scott;\nGRANT CREATE USER TO scott;\n -- 6 Object Privileges for scott\nGRANT INSERT, SELECT ON example.green_table TO scott;\nGRANT ALL ON example.blue_table TO scott;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples-sql-script/green_run.sql",
    "content": "@@green_table.sql;\n\n@@green_tools.pks;\n@@green_tools.pkb;\n\n@@green_tools_review.sql;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples-sql-script/green_table.sql",
    "content": "drop table green_table;\n\ncreate table green_table\n(\n  green_col_one number(10) not null disable\n, green_col_two varchar2(64)\n)\ntablespace \"greenspace\"\n;\n\nDrop\tTable\tGreen_Table; Create Table green_table\n(\n  green_col_one number(10) not null disable\n, green_col_two varchar2(64)\n)\nTablespace USERS\n;\n\ninsert into green_table (green_col_one, green_col_two)\nvalues (100021, 'green-varchar-21');\ninsert into green_table (green_col_one, green_col_two)\nvalues (100022, 'green-varchar-22');\ninsert into green_table (green_col_one, green_col_two)\nvalues (100023, 'green-varchar-23');\n\nselect *\nfrom green_table;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples-sql-script/green_tools.pkb",
    "content": "create or replace package body green_tools\nis\n\n  procedure no_params_procedure\n  is\n  begin\n    dbms_output.put_line('no_params_procedure : begin');\n  end no_params_procedure;\n\n  function add_brackets( p_string in varchar2 ) return varchar2\n  as\n  begin\n    return '[' || p_string || ']';\n  end add_brackets;\n\n  procedure print_green_info( p_with_brackets in boolean )\n  is\n  begin\n    for r in ( select green_col_two\n               from   green_table )\n    loop\n      if p_with_brackets then\n        dbms_output.put_line('print_green_info : with brackets : ' || add_brackets(r.green_col_two));\n      else\n        dbms_output.put_line('print_green_info : no brackets : ' || r.green_col_two);\n      end if;\n    end loop;\n  end print_green_info;\n\nend green_tools;\n/\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples-sql-script/green_tools.pks",
    "content": "create or replace package green_tools\nis\n\n  procedure no_params_procedure;\n\n  function add_brackets( p_string in varchar2 ) return varchar2;\n\n  procedure print_green_info( p_with_brackets in boolean );\n\nend green_tools;\n/\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples-sql-script/green_tools_review.sql",
    "content": "set serveroutput on\n\nselect green_tools.add_brackets('to-be-bracketed') as with_brackets\nfrom dual;\n\nbegin\n  green_tools.print_green_info( p_with_brackets => false );\nend;\n/\n\nbegin\n  green_tools.print_green_info( p_with_brackets => true );\nend;\n/\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples-sql-script/in_out_parameters.pks",
    "content": "create or replace package in_out_parameters\nis\n\n  procedure some_procedure( p_string varchar2 );\n\n  procedure some_in_procedure( p_string in varchar2 );\n\n  procedure some_out_procedure( p_string out varchar2 );\n\n  procedure some_in_out_procedure( p_string in out varchar2 );\n\n  procedure some_in_out_nocopy_procedure( p_string in out nocopy varchar2 );\n\nend in_out_parameters;\n/\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples-sql-script/key_word_as_param.pkb",
    "content": "create or replace package body login\nas\n\nfunction fun return varchar2\nas\n\traw_key2 raw(128);\n    raw_userpass raw(128);\n    raw_encrypted raw(2048);\nbegin\n    dbms_obfuscation_toolkit.desencrypt(input => raw_userpass, key => raw_key2, encrypted_data => raw_encrypted);\nend fun;\n\nend;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples-sql-script/logical_expressions.sql",
    "content": "DECLARE\n    FOO NUMBER := 1;\n    BAR NUMBER := 2;\nBEGIN\n    IF FOO = 1 AND BAR IS NOT NULL THEN\n        RAISE_APPLICATION_ERROR(-20001, 'FOO is 1 and BAR is not null');\n    END IF;\n\n    IF FOO = 1 OR NOT BAR IS NULL THEN\n        RAISE_APPLICATION_ERROR(-20002, 'FOO is 1 or BAR is not null');\n    END IF;\n\n    IF FOO = 1 AND BAR IS NOT NULL AND BAR IS NOT NAN THEN\n        RAISE_APPLICATION_ERROR(-20003, 'FOO is 1 and BAR is not null and BAR is not nan');\n    END IF;\nEND;\n/\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples-sql-script/package_body_null.pkb",
    "content": "create or replace package body pkgtest is\nbegin\n    null;\nend;\n/\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples-sql-script/package_with_cursor.sql",
    "content": "create or replace package pkgtest is\n\n    cursor cuData is\n        select * from dual;\n\n    procedure main;\nend;\n/\n\ncreate or replace package body pkgtest is\n    procedure main is\n        sbData varchar2(100);\n    begin\n      open pkgtest.cuData;\n      fetch cuData into sbData;\n      close cuData;\n\n      if cuData%isopen then\n        dbms_output.put_line('should work');\n      end if;\n\n      if sql%rowcount > 0 then\n        dbms_output.put_line('should work too');\n      end if;\n    end;\n\n    function GETPOS_TEMPLATE_DEF_ID return VARCHAR2 is\n      LVS_ID VARCHAR2(4000 CHAR);\n    BEGIN\n      LVS_ID := TRIM(BOTH SF_FORM_EXT_CONSTANTS.GETSOMETHING FROM LVS_ID);\n      return LVS_ID;\n    end GETPOS_TEMPLATE_DEF_ID;\nend;\n/\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples-sql-script/package_with_schema.pkb",
    "content": "CREATE OR REPLACE PACKAGE BODY HR.PACK\nAS\nPROCEDURE PROC1\nAS\nBEGIN\n    NULL;\nEND;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples-sql-script/package_with_schema.pks",
    "content": "CREATE OR REPLACE PACKAGE HR.PACK\nAS\nPROCEDURE PROC1;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples-sql-script/package_with_simple_init_block.pkb",
    "content": "-- The package init block should not be parsed as a variable declaration\ncreate package body MyPackage as\nbegin\n  OtherPackage.DoSomething;\nend MyPackage;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples-sql-script/pipe_row.pkb",
    "content": "create or replace package body pipe_row_test as\n\nfunction fun return t_tab pipelined\nas\n    vRow t_tab_row;\nbegin\n    for rec in ( select Id from tbl )\n    loop\n        vrow.Id := rec.Id;\n        pipe row (vrow);\n    end loop;\n         \nend;\n\n\nfunction prodfunc(n number) return mytabletype pipelined is\nbegin\n    <<pipes>>\n    for i in 1 .. 5 loop\n    \tpipe row (myobjectformat(n,sysdate+i,'row '||i));\n    end loop pipes;\n    return;\nend;\n\nend;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples-sql-script/pltables.sql",
    "content": "declare\n    TYPE tyrcmessage IS RECORD (id number, message varchar2(100));\n    TYPE tytbMessages IS TABLE OF tyrcmessage INDEX BY BINARY_INTEGER;\n\n    tbmessages tytbMessages;\n    nuidx      number;\n\nbegin\n    nuidx := tbmessages.first;\n    while nuidx is not null loop\n        nuidx := tbmessages.next(nuidx);\n    end loop;\nend;\n/\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples-sql-script/pragma_autonomous_transaction.sql",
    "content": "declare\n    pragma autonomous_transaction;\nbegin\n    commit;\nend;\n/\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples-sql-script/pragma_exception_init.pkb",
    "content": "create or replace package body pragma_exception_init\nis\n\n  some_exception exception;\n  pragma exception_init (some_exception, -20001);\n\nend pragma_exception_init;\n/\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples-sql-script/pragma_exception_init.pks",
    "content": "create or replace package pragma_exception_init\nis\n\n  some_exception exception;\n  pragma exception_init (some_exception, -20001);\n\nend pragma_exception_init;\n/\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples-sql-script/proc_over_dblink_as_nvl_param.pkb",
    "content": "create or replace package body pack as\n\nprocedure test(inId number)\nas\n\tvSum number;\n\tvPaymentsDate number;\nbegin\n\t\n\tvSum := nvl(pack_1.getSum@dblink(inId=>inId, vPaymentsDate => pack_2.getLastDay(4, 3)), 0);  \n\nend;\n\n\nend;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples-sql-script/procedure_with_cursor_and_limit.sql",
    "content": "CREATE OR REPLACE PROCEDURE SF_JOB_CLEANUP_SHOWCASES_START (FPN_ANZ_ZUM_VERARBEITEN NUMBER DEFAULT 10000, FPN_BULK_LIMIT NUMBER DEFAULT 5000) AS\n\n    TYPE T_BULK_TAB IS RECORD (\n        SC_ID SALESFRONT.SF_SHOWCASE.ID%TYPE,        \n        JOBLIST_ID SF_JOB_CLEANUP_SHOWCASES_SCLIST.ID%TYPE\n    );\n    TYPE T_BULK_COLLECT_TAB IS TABLE OF T_BULK_TAB;\n\n    LNC_ID_LIST T_BULK_COLLECT_TAB;\n\n    COUNTER PLS_INTEGER := 0;\n    LVNEXISTS PLS_INTEGER := 0;\n    LVSERRORMSG VARCHAR2(4000);\n\n    CURSOR C_DEL_SC(C_MAX_ROW NUMBER) IS\n        SELECT SC.ID SC_ID , SL.ID JOBLIST_ID FROM SF_JOB_CLEANUP_SHOWCASES_SCLIST SL\n            INNER JOIN SALESFRONT.SF_SHOWCASE SC ON  SC.ID = SL.SF_SHOWCASE_ID\n            WHERE SL.VERARBEITEN = 1 \n            AND VERARBEITET_AM IS NULL\n            AND ROWNUM < C_MAX_ROW;\n                   \nBEGIN \n    EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM USER_SCHEDULER_JOBS JO WHERE JOB_NAME=''SF_START_TOURENEXPORT'' AND JO.STATE = ''RUNNING''' \n            INTO LVNEXISTS;\n    \n    IF LVNEXISTS = 0 THEN\n    OPEN C_DEL_SC(FPN_ANZ_ZUM_VERARBEITEN);\n    LOOP\n        --IN BLÖCKEN AUS PERFORMANCE GRÜNDEN\n        FETCH C_DEL_SC BULK COLLECT INTO LNC_ID_LIST LIMIT FPN_BULK_LIMIT; \n            COUNTER := COUNTER + LNC_ID_LIST.COUNT;   \n        EXIT WHEN C_DEL_SC%NOTFOUND;        \n            \n        COMMIT;\n    END LOOP;\n    CLOSE C_DEL_SC;\n    END IF;\n\nEXCEPTION WHEN OTHERS THEN\n    LVSERRORMSG := SQLERRM || ' BACKTRACE: ' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE;\n    ROLLBACK;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples-sql-script/result_cache_function.pks",
    "content": "create or replace package result_cache_function\nis\n\n  function some_function( p_string in varchar2 ) return varchar2 result_cache;\n\nend result_cache_function;\n/\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples-sql-script/select_into.sql",
    "content": "DECLARE\n    TYPE T2 IS RECORD (C NUMBER);\n    TYPE T1 IS RECORD (B T2);\n    A T1;\n\n    TYPE T3 IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;\n    D T3;\nBEGIN\n    SELECT 1\n    INTO A.B.C\n    FROM DUAL;\n\n    SELECT 1\n    INTO D(1)\n    FROM DUAL;\n\n    SELECT 1\n    INTO :BLOCK.ITEM\n    FROM DUAL;\nEND;\n/\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples-sql-script/show_errors.pks",
    "content": "create or replace package show_errors\nis\n\n  procedure some_procedure;\n\nend show_errors;\n/\n\nshow errors;\n\ncreate or replace package show_errors\nis\n\n  procedure some_procedure;\n\nend show_errors;\n/\n\nshow err\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples-sql-script/substr_as_regular_id.pkb",
    "content": "create or replace package body testPack as\n\nfunction blob_to_clob (blob_in in blob) return clob\nas  \nbegin     \n    utl_raw.cast_to_varchar2(dbms_lob.substr(a, b, c));\n    return null;\nend blob_to_clob;\n\nend testPack;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples-sql-script/synonym_with_database_link.sql",
    "content": "create or replace synonym rs_customer2Prs for SCHEMANAME.CUSTOMER2PRS@SCHEMANAME.LINKNAME;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples-sql-script/trigger_examples.sql",
    "content": "create or replace trigger trg_status_tick\n after insert or update or delete on status for each row\ndeclare\nbegin\n if inserting then\n   tp_ticket_util.fire('status', tp_ticket_const.cinsert, :new.id);\n elsif updating then\n   tp_ticket_util.fire('status', tp_ticket_const.cupdate, :new.id);\n elsif deleting then\n   tp_ticket_util.fire('status', tp_ticket_const.cdelete, :old.id);\n end if;\nend;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples-sql-script/type_body_elements.sql",
    "content": "create or replace type type_body_elements\nas object\n(\n  some_string varchar2(64),\n  member function function_one\n  return varchar2,\n  member function function_two\n  return varchar2\n);\n/\n\ncreate or replace type body type_body_elements\nis\n\n  member function function_one\n  return varchar2\n  is\n  begin\n    return 'the function_one result';\n  end function_one;\n\n  member function function_two\n  return varchar2\n  is\n  begin\n    return 'the function_two result';\n  end function_two;\n\nend;\n/\ncreate or replace TYPE CLNOBJREPORTCOLUMN force is table of varchar2(4000);\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples-sql-script/user.sql",
    "content": "CREATE USER scott\n IDENTIFIED BY tiger\n DEFAULT TABLESPACE USERS\n TEMPORARY TABLESPACE TEMP\n PROFILE SCOTT_PROFILE\n ACCOUNT UNLOCK;\n\n-- 1 Tablespace Quota for scott\nALTER USER scott QUOTA 5000M ON USERS;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/examples-sql-script/with_clause_in_exists_block_in_procedure.sql",
    "content": "CREATE OR REPLACE PROCEDURE PROCESS_QUEUE(FPN_DATENQUELLE_ID NUMBER DEFAULT NULL) IS\n    BEGIN\n        DELETE\n        FROM TP_TICKET_RAW DEL_T\n        WHERE EXISTS (\n                      WITH BASIS AS (SELECT * FROM TP_TICKET_RAW TT)\n                      SELECT NULL\n                      FROM BASIS BA\n                      WHERE EXISTS (SELECT NULL\n                                   FROM BASIS BE\n                                   WHERE BE.TABLE_NAME = BA.TABLE_NAME\n                                     AND BE.TP_TICKET_ART_ID = BA.TP_TICKET_ART_ID\n                                     AND BE.REF_ID = BA.REF_ID\n                                     AND BA.CREATION_DATE > BE.CREATION_DATE)\n                                     AND DEL_T.ID = BA.ID\n                        );\n        COMMIT;\n END PROCESS_QUEUE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/hw-examples/alter_operator.sql",
    "content": "ALTER OPERATOR eq_op COMPILE;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/hw-examples/alter_outline.sql",
    "content": "ALTER OUTLINE salaries REBUILD;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/hw-examples/drop_operator.sql",
    "content": "DROP OPERATOR eq_op;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/hw-examples/keywordasidentifier02.sql",
    "content": "select m.model from model\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/hw-examples/lexer01.sql",
    "content": "select * from dual where 1 < > 2 and 1 ! = 2 and 1 ^ /*aaa */ = 2\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/hw-examples/lexer02.sql",
    "content": "select 'A' | | 'B'  from dual\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/hw-examples/lexer03.sql",
    "content": "select :1, :X, :1 + 1, 1 + :2 from A where A=:3 and b= : 4 and c= :5and :A = :b\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/hw-examples/lexer04.sql",
    "content": "select tbl$or$idx$part$num(\"sys\".\"wrh$_seg_stat\",0,4,0,\"rowid\") as c1 from t1\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/hw-examples/lexer05.sql",
    "content": "select tbl$or$idx$part$num(\"sys\".\"wrh:_seg_stat\",0,4,0,\"rowid\") as c1 from t1\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/hw-examples/simple11.sql",
    "content": "select a.* from dual\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/hw-examples/truncate_table.sql",
    "content": "truncate table test;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/long-running/aggregate01.sql",
    "content": "with\n\tcodes2codelocales as\n\t(\n\t\tselect t6.cdl_name as cod_name, t7.cdl_name as cod_cod_name, t14.cod_oid\n\t\tfrom servicedesk.itsm_codes t14\n\t\tleft outer join servicedesk.itsm_codes_locale t6 on (t6.cdl_cod_oid=t14.cod_oid)\n\t\tleft outer join servicedesk.itsm_codes_locale t7 on (t7.cdl_cod_oid=t14.cod_cod_oid)\n\t)\n\t, incident as\n\t(\n\t\tselect t1.*,\n\t\t       c2cl1.cod_name as \"closure code\", c2cl1.cod_cod_name as \"closure code parent\",\n\t\t       c2cl2.cod_name as \"reason caused code\", c2cl2.cod_cod_name as \"reason caused code parent\",\n\t\t       t11.cdl_name \"severity\", t13.cdl_name \"business impact\", t16.cdl_name \"priority\",\n\t\t       t2.rct_name \"status\", t12.rct_name \"category\", t99.rct_name \"folder\"\n\t\tfrom servicedesk.itsm_incidents t1\n\t\tjoin servicedesk.itsm_codes_locale t11   on (t1.inc_sev_oid=t11.cdl_cod_oid)\n\t\tjoin servicedesk.itsm_codes_locale t13   on (t1.inc_imp_oid=t13.cdl_cod_oid)\n\t\tjoin servicedesk.itsm_codes_locale t16   on (t1.inc_pri_oid=t16.cdl_cod_oid)\n\t\tjoin servicedeskrepo.rep_codes_text t2   on (t1.inc_sta_oid=t2.rct_rcd_oid)\n\t\tjoin servicedeskrepo.rep_codes_text t12  on (t1.inc_cat_oid=t12.rct_rcd_oid)\n\t\tjoin servicedeskrepo.rep_codes_text t99  on (t1.inc_poo_oid=t99.rct_rcd_oid)\n\t\tleft outer join codes2codelocales c2cl1  on (t1.inc_clo_oid=c2cl1.cod_oid)\n\t\tleft outer join codes2codelocales c2cl2  on (t1.inc_cla_oid=c2cl2.cod_oid) \n\t\twhere t1.\"reg_created\" between sysdate-1 and sysdate\n\t)\n\t, workgrouphistory as\n\t(\n\t\tselect i.inc_id\n\t\t, max(t101.hin_subject) keep (dense_rank first order by (t101.reg_created)) as \"first\"\n\t\t, max(t101.hin_subject) keep (dense_rank last order by (t101.reg_created)) as \"last\"\n\t\tfrom\n\t\tservicedesk.itsm_historylines_incident t101\n\t\tjoin incident i on (t101.hin_inc_oid = i.inc_oid)\n--\t\tfrom servicedesk.itsm_incidents i (t101.hin_inc_oid = i.inc_oid)\n\t\twhere t101.hin_subject like 'to workgroup from%'\n--\t\tand i.\"reg_created\" between sysdate-1 and sysdate\t\t\n\t\tgroup by i.inc_id\n\t)\nselect\n  incident.inc_id \"id\"\n ,incident.\"status\"\n ,incident.inc_description \"description\"\n ,t4.wog_searchcode \"workgroup\"\n ,t5.per_searchcode \"person\"\n ,incident.inc_solution \"solution\"\n ,incident.\"closure code\"\n ,incident.\"closure code parent\"\n ,incident.\"reason caused code\"\n ,incident.\"reason caused code parent\"\n ,t10.cit_searchcode \"ci\"\n ,incident.\"severity\"\n ,incident.\"category\"\n ,incident.\"business impact\"\n ,incident.\"priority\"\n ,to_char(incident.\"reg_created\", 'dd-mm-yy hh24:mi:ss') \"registered\"\n ,to_char(incident.\"inc_deadline\", 'dd-mm-yy hh24:mi:ss') \"deadline\"\n ,to_char(incident.\"inc_actualfinish\", 'dd-mm-yy hh24:mi:ss') \"finish\"\n ,t3.icf_incshorttext3 \"message group\"\n ,t3.icf_incshorttext4 \"application\"\n ,t3.icf_incshorttext2 \"msg id\"\n ,incident.\"folder\"\n ,workgrouphistory.\"first\" \"first wg\"\n ,workgrouphistory.\"last\" \"last wg\"\n ,t102.hin_subject \"frirst pri\"\nfrom incident\njoin servicedesk.itsm_inc_custom_fields t3  on (incident.inc_oid=t3.icf_inc_oid)\njoin servicedesk.itsm_workgroups t4         on (incident.inc_assign_workgroup=t4.wog_oid)\njoin workgrouphistory                       on (incident.inc_id = workgrouphistory.inc_id)\nleft outer join servicedesk.itsm_persons t5 on (incident.inc_assign_person_to=t5.per_oid)\nleft outer join servicedesk.itsm_configuration_items t10 on (incident.inc_cit_oid=t10.cit_oid)\nleft outer join servicedesk.itsm_historylines_incident t102 on (incident.inc_oid = t102.hin_inc_oid and t102.hin_subject like 'priority set to%')\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/long-running/cast_multiset07.sql",
    "content": "select\n\t\"a3\".\"r_id\" \"r_id\"\nfrom\n\t\"pe\" \"a3\",\n\t\"me\" \"a2\"\nwhere\n\t \"a3\".\"m_id\"=\"a2\".\"m_id\"\n\t and \"a2\".\"mi_t\" =\n\t any\n\t (((\n\t\tselect \"a4\".\"sys$\".\"id\"\n\t\tfrom the\n\t\t(\n \t\t \tselect \"qa\".\"u_pkg\".\"getchartable\"\n \t\t \t(\n \t\t \t \t\"qa\".\"u_pkg\".\"glist\"\n \t\t \t \t(\n \t\t \t \t\tcursor\n \t\t \t \t\t(\n \t\t \t \t\t\tselect \"qa\".\"u_pkg\".\"glist\"\n \t\t \t \t\t\t(\n \t\t \t \t\t\t\tcursor\n \t\t \t \t\t\t\t(\n\t\t \t \t\t\t\t\tselect \"a6\".\"mi_t\" \"mi_t\"\n\t\t \t \t\t\t\t\tfrom \"me\" \"a6\"\n\t\t \t \t\t\t\t\tconnect by \"a6\".\"mi_uid\"=prior \"a6\".\"mi_id\"\n\t\t \t \t\t\t\t\tstart with \"a6\".\"mi_t\"=:b1\n\t \t \t \t\t\t\t)\n\t \t \t \t\t\t)\n \t \t \t \t\t\t\"lst\"\n\t \t \t \t\t\tfrom \"sys\".\"dual\" \"a5\"\n\t \t \t \t\t)\n\t \t \t \t)\n\t \t \t)\n\t \t \tfrom dual\n\t \t)\n\t \t\"a4\"\n\t)))\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/long-running/datetime02.sql",
    "content": "select\n\tdbin.db_name,\n\tdbin.instance_name,\n\tdbin.version,\n\tcase when s1.startup_time = s2.startup_time             then 0 else 1 end as bounce,\n        cast(s1.end_interval_time as date) as begin_time,\n\tcast(s2.end_interval_time as date) as end_time,\n\tround((cast( (case when s2.end_interval_time > s1.end_interval_time then s2.end_interval_time else s1.end_interval_time end) as date)\n\t\t- cast(s1.end_interval_time as date)) * 86400) as int_secs,\n\tcase when (s1.status <> 0 or s2.status <> 0) then 1 else 0 end as err_detect,\n        round( greatest( (extract(day from s2.flush_elapsed) * 86400)\n\t       + (extract(hour from s2.flush_elapsed) * 3600)\n\t       + (extract(minute from s2.flush_elapsed) * 60)\n\t       + extract(second from s2.flush_elapsed),\n\t       (extract(day from s1.flush_elapsed) * 86400)\n\t       + (extract(hour from s1.flush_elapsed) * 3600)\n\t       + (extract(minute from s1.flush_elapsed) * 60)\n\t       + extract(second from s1.flush_elapsed),0 )\n\t) as max_flush_secs\nfrom wrm$_snapshot s1 ,  wrm$_database_instance dbin ,  wrm$_snapshot s2\nwhere s1.dbid = :dbid\nand s2.dbid = :dbid\nand s1.instance_number = :inst_num\nand s2.instance_number = :inst_num\nand s1.snap_id  = :bid\nand s2.snap_id = :eid\nand dbin.dbid = s1.dbid\nand dbin.instance_number = s1.instance_number\nand dbin.startup_time = s1.startup_time\n\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/long-running/order_by07.sql",
    "content": "create or replace view testview\n(\n id, --Test comment\n    report_id,\n    report_element_id,\n    parent_id,\n    chapterNo,\n    sequenceNo,\n    title_de,\n    title_en,\n    is_direct_restricted,\n    is_inherited_restricted,\n    has_note,\n    current_status_code,\n    report_element_discriminator,\n    has_childs,\n    validation_needed,\n -- this is required that ef6 can use this view with a primary key!\n constraint v_report_tree primary key (id) rely disable\n)\nas \nwith\n    restr as (\n        select \n            entityid reid\n            , max(isdirectrestricted) isDirectRestricted\n            , case when min(isdirectrestricted) = 0 then 1 else 0 end isIndirectRestricted\n        from \n            v_report_element_restrictions \n        where restrictionstart < sysdate and restrictionend > sysdate\n        group by\n            entityid\n    ),\n    notes as (\n        SELECT\n            report_element_id,\n            1 hasNote\n        FROM\n            report_element_note\n        where\n            deleted = 0\n        group by\n            report_element_id    \n    ),\n    vaidationNeeded as (\n        SELECT\n            report_element_id\n            , 1 ValidationNeeded\n        FROM\n            v_formatted_data_item_value_usage\n        WHERE\n            validationstatus = 'notvalidated'\n        group by \n            report_element_id    \n    ),\n    contentText as (\n        select\n            *\n        from\n        (\n                select \n                    re.id report_element_id\n                    , lang.code\n                    , CASE\n                        WHEN re.discriminator = 'DISCRIMA' THEN to_char('[' || SUBSTR(Regexp_replace(ce.text, '<.+?>'),0,30) || '...]')\n                        ELSE to_char(Regexp_replace(ce.text, '<.+?>')) end text\n                from\n                    content_element ce\n                        inner join content c on c.id = ce.content_id\n                        inner join language lang on lang.id = ce.language_id        \n                        inner join report_element re on c.id = nvl(re.text_content_id,re.title_content_id)\n                where\n                    c.deleted = 0\n                    and ce.deleted = 0\n                order by\n                    re.id, ce.content_id\n        )            \n        PIVOT  (min(Text) AS lang_text FOR (code) IN ('EY' AS DE, 'OH' AS EN))           \n    )\nselect\n SYS_GUID() id\n    , re.report_id report_id\n    , re.id report_element_id\n    , re.parent_id parent_id\n    , report_helper.ReportElementNo(re.id) chapterNo\n    , re.sequence_no sequenceNo\n    , ct.de_lang_text title_de\n    , ct.en_lang_text title_en\n    , cast(nvl(restr.isDirectRestricted,0) as number(1)) is_direct_restricted\n    , cast(nvl(restr.isIndirectRestricted,0) as number(1)) is_inherited_restricted\n    , cast(nvl(notes.hasNote,0) as number(1)) has_note\n    , re.status_code current_status_code\n    , re.discriminator report_element_discriminator\n    , cast((case when exists(select 1 from report_element re2 where re2.parent_id = re.id and deleted = 0) then 1 else 0 end) as number(1)) has_childs\n    , cast(nvl(valNeed.ValidationNeeded,0) as number(1)) validation_needed\nfrom \n    report_element re\n    left outer join contentText ct on ct.report_element_id = re.id   \n    left outer join restr restr on restr.reid = re.id\n    left outer join notes notes on notes.report_element_id = re.id\n    left outer join vaidationNeeded valNeed on valNeed.report_element_id = re.id\nwhere \n    re.deleted = 0\nstart with re.parent_id is null\nconnect by prior re.id = re.parent_id\norder siblings by sequenceno;\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/antlr-grammars-v4/long-running/query_factoring07.sql",
    "content": "with timegrouped_rawdata\nas\n(\n\tselect /*+ leading(sn di md sh ot) cardinality(ot 1000) */\n\tsh.metric_id as metric_id ,\n\tot.bsln_guid as bsln_guid ,\n\tot.timegroup as timegroup ,\n\tsh.value as obs_value\n\tfrom\n\tdba_hist_snapshot sn ,\n\tdba_hist_database_instance di ,\n\tsys.wrh$_sysmetric_history sh ,\n\tbsln_metric_defaults md ,\n\ttable(:b1 ) ot\n\twhere sn.dbid = :b6\n\tand sn.snap_id between :b5 and :b4\n\tand di.dbid = sn.dbid\n\tand di.instance_number = sn.instance_number\n\tand di.startup_time = sn.startup_time\n\tand di.instance_name = :b3\n\tand sh.snap_id = sn.snap_id\n\tand sh.dbid = sn.dbid\n\tand sh.instance_number = sn.instance_number\n\tand sh.group_id = 2\n\tand sh.metric_id = md.metric_id\n\tand md.status = :b2\n\tand ot.obs_time = trunc(sh.end_time, 'hh24')\n)\n(\nselect\n\tbsln_statistics_t\n\t(\n\t\tbsln_guid ,metric_id ,:b11 ,:b10 ,timegroup ,sample_count ,average ,minimum ,maximum ,sdev ,\n\t\tpctile_25 ,pctile_50 ,pctile_75 ,pctile_90 ,pctile_95 ,pctile_99 ,est_sample_count ,est_slope ,est_intercept ,\n\t\tcase when est_slope = 0 then 0 else greatest(0,nvl(100-(25*power((1-est_mu1/est_slope), 2)*(est_sample_count-1) ),0)) end ,\n\t\tln( 1000) * est_slope + est_intercept ,\n\t\tln(10000) * est_slope + est_intercept\n\t)\n\tfrom\n\t(\n\t\tselect metric_id ,bsln_guid ,timegroup ,est_mu as est_slope ,est_mu * ln(alpha) + x_m as est_intercept ,to_number(null) as est_fit_quality ,\n\t\tcase when count_below_x_j > 0 then (sum_below_x_j + (n-m+1)*(x_j-x_m))/count_below_x_j - x_j else to_number(null) end as est_mu1 ,\n\t\test_sample_count ,n as sample_count ,average ,minimum ,maximum ,sdev ,pctile_25 ,pctile_50 ,pctile_75 ,pctile_90 ,pctile_95 ,pctile_99\n\t\tfrom\n\t\t(\n\t\t\tselect metric_id ,bsln_guid ,timegroup ,max(n) as n ,count(rrank) as est_sample_count ,\n\t\t\tcase when count(rrank) > 3 then ( sum(obs_value) + ( max(n) - max(rrank) ) * max(obs_value) - (max(n) - min(rrank) + 1) * min(obs_value) ) / (count(rrank)-1)\n\t\t\telse to_number(null) end as est_mu ,\n\t\t\t(max(n) - min(rrank) + 1) / (max(n) + 1) as alpha ,\n\t\t\tmin(obs_value) as x_m ,max(obs_value) as x_l ,max(rrank) as l ,min(rrank) as m ,max(mid_tail_value) as x_j ,\n\t\t\tsum(case when obs_value < mid_tail_value then obs_value else 0 end ) as sum_below_x_j ,\n\t\t\tsum(case when cume_dist < :b7 then 1 else 0 end ) as count_below_x_j ,\n\t\t\tmax(max_val) as maximum ,max(min_val) as minimum ,max(avg_val) as average ,max(sdev_val) as sdev ,max(pctile_25) as pctile_25 ,max(pctile_50) as pctile_50 ,\n\t\t\tmax(pctile_75) as pctile_75 ,max(pctile_90) as pctile_90 ,max(pctile_95) as pctile_95 ,max(pctile_99) as pctile_99\n\t\t\tfrom\n\t\t\t(\n\t\t\t\tselect metric_id ,bsln_guid ,timegroup ,obs_value as obs_value,\n\t\t\t\tcume_dist () over (partition by metric_id, bsln_guid, timegroup order by obs_value ) as cume_dist ,\n\t\t\t\tcount(1) over (partition by metric_id, bsln_guid, timegroup ) as n ,\n\t\t\t\trow_number () over (partition by metric_id, bsln_guid, timegroup order by obs_value) as rrank ,\n\t\t\t\tpercentile_disc(:b7 ) within group (order by obs_value asc) over (partition by metric_id, bsln_guid, timegroup) as mid_tail_value ,\n\t\t\t\tmax(obs_value) over (partition by metric_id, bsln_guid, timegroup ) as max_val ,\n\t\t\t\tmin(obs_value) over (partition by metric_id, bsln_guid, timegroup ) as min_val ,\n\t\t\t\tavg(obs_value) over (partition by metric_id, bsln_guid, timegroup ) as avg_val ,\n\t\t\t\tstddev(obs_value) over (partition by metric_id, bsln_guid, timegroup ) as sdev_val ,\n\t\t\t\tpercentile_cont(0.25) within group (order by obs_value asc) over (partition by metric_id, bsln_guid, timegroup) as pctile_25 ,\n\t\t\t\tpercentile_cont(0.5) within group (order by obs_value asc) over (partition by metric_id, bsln_guid, timegroup) as pctile_50 ,\n\t\t\t\tpercentile_cont(0.75) within group (order by obs_value asc) over (partition by metric_id, bsln_guid, timegroup) as pctile_75 ,\n\t\t\t\tpercentile_cont(0.90) within group (order by obs_value asc) over (partition by metric_id, bsln_guid, timegroup) as pctile_90 ,\n\t\t\t\tpercentile_cont(0.95) within group (order by obs_value asc) over (partition by metric_id, bsln_guid, timegroup) as pctile_95 ,\n\t\t\t\tpercentile_cont(0.99) within group (order by obs_value asc) over (partition by metric_id, bsln_guid, timegroup) as pctile_99\n\t\t\t\tfrom timegrouped_rawdata d\n\t\t\t) x\n\t\t\twhere x.cume_dist >= :b9 and x.cume_dist <= :b8\n\t\t\tgroup by metric_id ,bsln_guid ,timegroup\n\t\t)\n\t)\n)\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/adding-and-dropping-virtual-columns-json-fields-based-data-guide-information-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/adding-and-dropping-virtual-columns-json-fields-based-data-guide-information.html\nDECLARE\n  dg CLOB;\nBEGIN\n  SELECT json_dataguide(data, DBMS_JSON.FORMAT_HIERARCHICAL) INTO dg\n    FROM j_purchaseorder;\n  DBMS_JSON.add_virtual_columns('J_PURCHASEORDER',\n                                'DATA',\n                                dg,\n                                resolveNameConflicts=>TRUE,\n                                colNamePrefix=>'DATA$',\n                                mixedCaseColumns=>TRUE);\nEND;\n/\nDESCRIBE j_purchaseorder;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/adding-and-dropping-virtual-columns-json-fields-based-data-guide-information-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/adding-and-dropping-virtual-columns-json-fields-based-data-guide-information.html\nDECLARE\n  dg CLOB;\nBEGIN\n  dg := '{\"type\" : \"object\",\n          \"properties\" :\n            {\"PO_Number\"    : {\"type\" : \"number\",\n                               \"o:length\" : 4,\n                               \"o:preferred_column_name\" : \"PO_Number\",\n                               \"o:hidden\" : false},\n             \"PO_Reference\" : {\"type\" : \"string\",\n                               \"o:length\" : 16,\n                               \"o:preferred_column_name\" : \"PO_Reference\",\n                               \"o:hidden\" : true}}}';\n  DBMS_JSON.add_virtual_columns('J_PURCHASEORDER', 'DATA', dg);\nEND;\n/\nDESCRIBE j_purchaseorder;\nSELECT column_name FROM user_tab_columns\n  WHERE table_name = 'J_PURCHASEORDER' ORDER BY 1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/adding-and-dropping-virtual-columns-json-fields-based-data-guide-information-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/adding-and-dropping-virtual-columns-json-fields-based-data-guide-information.html\nEXEC DBMS_JSON.add_virtual_columns('J_PURCHASEORDER', 'DATA');\nDESCRIBE j_purchaseorder;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/adding-and-dropping-virtual-columns-json-fields-based-data-guide-information-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/adding-and-dropping-virtual-columns-json-fields-based-data-guide-information.html\nEXEC DBMS_JSON.add_virtual_columns('J_PURCHASEORDER', 'DATA', 100);\nDESCRIBE j_purchaseorder;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/adding-and-dropping-virtual-columns-json-fields-based-data-guide-information-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/adding-and-dropping-virtual-columns-json-fields-based-data-guide-information.html\nEXEC DBMS_JSON.add_virtual_columns('J_PURCHASEORDER', 'DATA', 100, TRUE);\nDESCRIBE j_purchaseorder;\nSELECT column_name FROM user_tab_columns\n  WHERE table_name = 'J_PURCHASEORDER'\n  ORDER BY 1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/adding-and-dropping-virtual-columns-json-fields-based-data-guide-information-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/adding-and-dropping-virtual-columns-json-fields-based-data-guide-information.html\nEXEC DBMS_JSON.drop_virtual_columns('J_PURCHASEORDER', 'DATA');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/change-triggers-data-guide-enabled-search-index-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/change-triggers-data-guide-enabled-search-index.html\nEXEC DBMS_JSON.drop_virtual_columns('J_PURCHASEORDER', 'DATA');\nALTER INDEX po_search_idx REBUILD\n  PARAMETERS ('DATAGUIDE ON CHANGE add_vc');\nINSERT INTO j_purchaseorder\n  VALUES (\n    SYS_GUID(),\n    to_date('30-JUN-2015'),\n    '{\"PO_Number\"     : 4230,\n      \"PO_Reference\"  : \"JDEER-20140421\",\n      \"PO_LineItems\"  : [ {\"Part_Number\"  : 230912362345,\n                           \"Quantity\"     : 3.0} ]}');\nDESCRIBE j_purchaseorder;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/change-triggers-data-guide-enabled-search-index-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/change-triggers-data-guide-enabled-search-index.html\nEXEC DBMS_JSON.drop_virtual_columns('J_PURCHASEORDER', 'DATA');\nCREATE OR REPLACE PROCEDURE my_dataguide_trace(tableName VARCHAR2,\n                                               jcolName  VARCHAR2,\n                                               path      VARCHAR2,\n                                               type      NUMBER,\n                                               tlength   NUMBER)\n  IS\n    typename VARCHAR2(10);\n  BEGIN\n    IF    (type = DBMS_JSON.TYPE_NULL)    THEN typename := 'null';\n    ELSIF (type = DBMS_JSON.TYPE_BOOLEAN) THEN typename := 'boolean';\n    ELSIF (type = DBMS_JSON.TYPE_NUMBER)  THEN typename := 'number';\n    ELSIF (type = DBMS_JSON.TYPE_STRING)  THEN typename := 'string';\n    ELSIF (type = DBMS_JSON.TYPE_OBJECT)  THEN typename := 'object';\n    ELSIF (type = DBMS_JSON.TYPE_ARRAY)   THEN typename := 'array';\n    ELSE                                       typename := 'unknown';\n    END IF;\n    DBMS_OUTPUT.put_line('Updating ' || tableName || '(' || jcolName\n                         || '): Path = ' || path || ', Type = ' || type\n                         || ', Type Name = ' || typename\n                         || ', Type Length = ' || tlength);\n  END;\n/\nALTER INDEX po_search_idx REBUILD\n  PARAMETERS ('DATAGUIDE ON CHANGE my_dataguide_trace');\nINSERT INTO j_purchaseorder\n  VALUES (\n    SYS_GUID(),\n    to_date('30-MAR-2016'),\n    '{\"PO_ID\"     : 4230,\n      \"PO_Ref\"  : \"JDEER-20140421\",\n      \"PO_Items\"  : [ {\"Part_No\"       : 98981327234,\n                      \"Item_Quantity\" : 13} ]}');\nCOMMIT;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/columns-clause-sql-json-function-json_table-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/columns-clause-sql-json-function-json_table.html\nSELECT jt.ponumb\n  FROM j_purchaseorder,\n       json_table(data, '$'\n         COLUMNS (ponumb NUMBER PATH '$.PONumber.numberOnly()')) jt"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/creating-b-tree-indexes-json_value-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/creating-b-tree-indexes-json_value.html\nCREATE UNIQUE INDEX po_num_idx1 ON j_purchaseorder po\n  (po.data.PONumber.number());"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/creating-b-tree-indexes-json_value-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/creating-b-tree-indexes-json_value.html\nCREATE INDEX po_num_idx1 ON j_purchaseorder po\n  (po.data.PONumber.number(), 42);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/creating-b-tree-indexes-json_value-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/creating-b-tree-indexes-json_value.html\nCREATE UNIQUE INDEX po_num_idx2 ON j_purchaseorder\n  (json_value(data, '$.PONumber.number()' \n              ERROR ON ERROR));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/creating-b-tree-indexes-json_value-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/creating-b-tree-indexes-json_value.html\nCREATE UNIQUE INDEX po_ref_idx1 ON j_purchaseorder\n  (json_value(data, '$.Reference'\n              RETURNING VARCHAR2(200) ERROR ON ERROR\n              NULL ON EMPTY));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/creating-bitmap-indexes-json_value-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/creating-bitmap-indexes-json_value.html\nCREATE BITMAP INDEX cost_ctr_idx ON j_purchaseorder\n  (json_value(data, '$.CostCenter'));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/creating-multivalue-function-based-indexes-json_exists-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/creating-multivalue-function-based-indexes-json_exists.html\nCREATE TABLE parts_tab (id NUMBER, jparts JSON);\nINSERT INTO parts_tab VALUES\n  (1, '{\"parts\" : [{\"partno\"   : 3, \"subparts\" : [510, 580, 520]},\n                   {\"partno\"   : 4, \"subparts\" : 730}]}');\nINSERT INTO parts_tab VALUES\n  (2, '{\"parts\" : [{\"partno\"   : 7, \"subparts\" : [410, 420, 410]},\n                   {\"partno\"   : 4, \"subparts\" : [710, 730, 730]}]}');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/creating-multivalue-function-based-indexes-json_exists-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/creating-multivalue-function-based-indexes-json_exists.html\nCREATE MULTIVALUE INDEX mvi ON parts_tab t\n  (t.jparts.parts.subparts.numberOnly());"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/creating-multivalue-function-based-indexes-json_exists-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/creating-multivalue-function-based-indexes-json_exists.html\nCREATE MULTIVALUE INDEX cmvi_1 ON parts_tab\n  (json_table(jparts, '$.parts[*]'\n     ERROR ON ERROR NULL ON EMPTY NULL ON MISMATCH\n     COLUMNS (partNum NUMBER(10) PATH '$.partno',\n       NESTED PATH '$.subparts[*]'\n         COLUMNS (subpartNum NUMBER(20) PATH '$'))));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/creating-view-json-data-based-data-guide-information-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/creating-view-json-data-based-data-guide-information.html\nDESCRIBE myview\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/creating-view-json-data-based-data-guide-information-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/creating-view-json-data-based-data-guide-information.html\nDESCRIBE view2;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/creating-view-json-data-using-json_table-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/creating-view-json-data-using-json_table.html\nCREATE VIEW j_purchaseorder_detail_view\n  AS SELECT po.id, jt.*\n       FROM j_purchaseorder po,\n            json_table(po.data, '$'\n              COLUMNS (\n                po_number        NUMBER(10)         PATH '$.PONumber',\n                reference        VARCHAR2(30 CHAR)  PATH '$.Reference',\n                requestor        VARCHAR2(128 CHAR) PATH '$.Requestor',\n                userid           VARCHAR2(10 CHAR)  PATH '$.User',\n                costcenter       VARCHAR2(16)       PATH '$.CostCenter',\n                ship_to_name     VARCHAR2(20 CHAR)\n                                 PATH '$.ShippingInstructions.name',\n                ship_to_street   VARCHAR2(32 CHAR)\n                                 PATH '$.ShippingInstructions.Address.street',\n                ship_to_city     VARCHAR2(32 CHAR)\n                                 PATH '$.ShippingInstructions.Address.city',\n                ship_to_county   VARCHAR2(32 CHAR)\n                                 PATH '$.ShippingInstructions.Address.county',\n                ship_to_postcode VARCHAR2(10 CHAR)\n                                 PATH '$.ShippingInstructions.Address.postcode',\n                ship_to_state    VARCHAR2(2 CHAR)\n                                 PATH '$.ShippingInstructions.Address.state',\n                ship_to_zip      VARCHAR2(8 CHAR)\n                                 PATH '$.ShippingInstructions.Address.zipCode',\n                ship_to_country  VARCHAR2(32 CHAR)\n                                 PATH '$.ShippingInstructions.Address.country',\n                ship_to_phone    VARCHAR2(24 CHAR)\n                                 PATH '$.ShippingInstructions.Phone[0].number',\n                NESTED PATH '$.LineItems[*]'\n                  COLUMNS (\n                    itemno      NUMBER(38)         PATH '$.ItemNumber', \n                    description VARCHAR2(256 CHAR) PATH '$.Part.Description', \n                    upc_code    NUMBER             PATH '$.Part.UPCCode', \n                    quantity    NUMBER(12,4)       PATH '$.Quantity', \n                    unitprice   NUMBER(14,2)       PATH '$.Part.UnitPrice'))) jt;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/creating-view-json-data-using-json_table-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/creating-view-json-data-using-json_table.html\nCREATE MATERIALIZED VIEW j_purchaseorder_materialized_view\n  BUILD IMMEDIATE\n  REFRESH FAST ON STATEMENT WITH PRIMARY KEY\n  AS SELECT po.id, jt.*\n       FROM j_purchaseorder po,\n            json_table(po.data, '$'\n              COLUMNS (\n                po_number        NUMBER(10)         PATH '$.PONumber',\n                reference        VARCHAR2(30 CHAR)  PATH '$.Reference',\n                requestor        VARCHAR2(128 CHAR) PATH '$.Requestor',\n                userid           VARCHAR2(10 CHAR)  PATH '$.User',\n                costcenter       VARCHAR2(16)       PATH '$.CostCenter',\n                ship_to_name     VARCHAR2(20 CHAR)\n                                 PATH '$.ShippingInstructions.name',\n                ship_to_street   VARCHAR2(32 CHAR)\n                                 PATH '$.ShippingInstructions.Address.street',\n                ship_to_city     VARCHAR2(32 CHAR)\n                                 PATH '$.ShippingInstructions.Address.city',\n                ship_to_county   VARCHAR2(32 CHAR)\n                                 PATH '$.ShippingInstructions.Address.county',\n                ship_to_postcode VARCHAR2(10 CHAR)\n                                 PATH '$.ShippingInstructions.Address.postcode',\n                ship_to_state    VARCHAR2(2 CHAR)\n                                 PATH '$.ShippingInstructions.Address.state',\n                ship_to_zip      VARCHAR2(8 CHAR)\n                                 PATH '$.ShippingInstructions.Address.zipCode',\n                ship_to_country  VARCHAR2(32 CHAR)\n                                 PATH '$.ShippingInstructions.Address.country',\n                ship_to_phone    VARCHAR2(24 CHAR)\n                                 PATH '$.ShippingInstructions.Phone[0].number',\n                NESTED PATH '$.LineItems[*]'\n                  COLUMNS (\n                    itemno      NUMBER(38)         PATH '$.ItemNumber', \n                    description VARCHAR2(256 CHAR) PATH '$.Part.Description', \n                    upc_code    NUMBER             PATH '$.Part.UPCCode', \n                    quantity    NUMBER(12,4)       PATH '$.Quantity', \n                    unitprice   NUMBER(14,2)       PATH '$.Part.UnitPrice'))) jt;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/data-type-considerations-json_value-indexing-and-querying-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/data-type-considerations-json_value-indexing-and-querying.html\nSELECT count(*) FROM j_purchaseorder po\n  WHERE json_value(data, '$.PONumber' RETURNING NUMBER) > 1500;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/data-type-considerations-json_value-indexing-and-querying-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/data-type-considerations-json_value-indexing-and-querying.html\nSELECT count(*) FROM j_purchaseorder po\n  WHERE to_number(json_value(data, '$.PONumber')) > 1500;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/data-type-considerations-json_value-indexing-and-querying-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/data-type-considerations-json_value-indexing-and-querying.html\nSELECT count(*) FROM j_purchaseorder po\n  WHERE json_value(data, '$.PONumber') > 1500;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/error-clause-sql-query-functions-and-conditions-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/error-clause-sql-query-functions-and-conditions.html\nSELECT json_value('[{a:1},{a:2}]', '$.a');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/error-clause-sql-query-functions-and-conditions-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/error-clause-sql-query-functions-and-conditions.html\nALTER SESSION SET JSON_BEHAVIOR=\"ON_ERROR:ERROR\"\n\nSELECT json_value('[{a:1},{a:2}]', '$.a');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/error-clause-sql-query-functions-and-conditions-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/error-clause-sql-query-functions-and-conditions.html\nALTER SESSION SET JSON_BEHAVIOR=\"ON_ERROR:NULL\""
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/handling-dependent-objects-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/handling-dependent-objects.html\nSELECT MVIEW_NAME, COMPILE_STATE FROM USER_MVIEWS;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/handling-dependent-objects-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/handling-dependent-objects.html\nSELECT INDEX_NAME FROM USER_INDEXES\n  WHERE TABLE_NAME = 'J_PURCHASEORDER';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/handling-dependent-objects-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/handling-dependent-objects.html\nSELECT DBMS_METADATA.get_ddl('INDEX', po_num_idx1);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/handling-input-values-sql-json-generation-functions-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/handling-input-values-sql-json-generation-functions.html\nCREATE FUNCTION getX(n NUMBER) RETURN VARCHAR2 AS\nBEGIN\n  RETURN '{\"x\":'|| n ||'}';\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/handling-input-values-sql-json-generation-functions-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/handling-input-values-sql-json-generation-functions.html\nSELECT json_array(getX(5) FORMAT JSON);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/handling-input-values-sql-json-generation-functions-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/handling-input-values-sql-json-generation-functions.html\nSELECT json_array(getX(5) FORMAT JSON STRICT);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/indexing-multiple-json-fields-using-composite-b-tree-index-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/indexing-multiple-json-fields-using-composite-b-tree-index.html\nSELECT data FROM j_purchaseorder\n  WHERE json_value(data, '$.User')       = 'ABULL'\n    AND json_value(data, '$.CostCenter') = 'A50';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json-collections-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json-collections.html\nCREATE JSON COLLECTION TABLE employee\n  (salary AS (json_value(DATA, '$.salary.number()')),\n   CONSTRAINT sal_chk CHECK (salary > 0));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json-collections-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json-collections.html\nCREATE JSON COLLECTION TABLE j_purchaseorder;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json-collections-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json-collections.html\nCREATE JSON COLLECTION VIEW empview AS\n  SELECT JSON {'_id'         : employee_id,\n               last_name,             \n               'contactInfo' : {email, phone_number},\n               hire_date,\n               salary}\n    FROM hr.employees;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json-data-type-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json-data-type.html\nWITH jtab AS\n  (SELECT JSON(\n     '{ \"name\" : \"Alexis Bull\",\n        \"Address\": { \"street\" : \"200 Sporting Green\",\n                     \"city\" : \"South San Francisco\",\n                     \"state\" : \"CA\",\n                     \"zipCode\" : 99236,\n                     \"country\" : \"United States of America\" } }')\n     AS jcol)\n  SELECT j.jcol.Address.city FROM jtab j;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json-data-type-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json-data-type.html\nSELECT data FROM customers c\n  ORDER BY c.data.revenue;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json-data-type-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json-data-type.html\nSELECT data FROM customers c\n  ORDER BY json_scalar(c.data.revenue);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json-data-type-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json-data-type.html\nSELECT json_value(json_scalar(current_timestamp), '$.timestamp()');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json-data-type-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json-data-type.html\nSELECT json_serialize(data PRETTY ORDERED)\n  FROM j_purchaseorder po\n  WHERE po.data.PONumber = 1600;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json-data-type-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json-data-type.html\nSELECT * \n  FROM emp t\n  WHERE t.data.dept = 'SALES' ORDER BY t.data.name"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json-data-type-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json-data-type.html\nSELECT data FROM customers c\n  ORDER BY c.data.revenue;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json-data-type-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json-data-type.html\nSELECT data FROM customers c\n  ORDER BY json_scalar(c.data.revenue);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json-query-rewrite-use-materialized-view-json_table-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json-query-rewrite-use-materialized-view-json_table.html\nCREATE MATERIALIZED VIEW mv_for_query_rewrite\n  BUILD IMMEDIATE\n  REFRESH FAST ON STATEMENT WITH PRIMARY KEY\n  AS SELECT po.id, jt.*\n       FROM j_purchaseorder po,\n            json_table(po.data, '$' ERROR ON ERROR NULL ON EMPTY\n              COLUMNS (\n                po_number       NUMBER         PATH '$.PONumber',\n                userid          VARCHAR2(10)   PATH '$.User',\n                NESTED PATH '$.LineItems[*]'\n                  COLUMNS (\n                    itemno      NUMBER         PATH '$.ItemNumber',\n                    description VARCHAR2(256)  PATH '$.Part.Description',\n                    upc_code    NUMBER         PATH '$.Part.UPCCode',\n                    quantity    NUMBER         PATH '$.Quantity',\n                    unitprice   NUMBER         PATH '$.Part.UnitPrice'))) jt;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json-query-rewrite-use-materialized-view-json_table-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json-query-rewrite-use-materialized-view-json_table.html\nCREATE INDEX mv_idx ON mv_for_query_rewrite(userid,\n                                            upc_code,\n                                            quantity);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json-schema-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json-schema.html\nCREATE TABLE tab (jcol JSON VALIDATE '{\"type\" : \"object\"}');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json-schema-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json-schema.html\nCREATE TABLE tab (jcol JSON VALIDATE '{\"type\" : \"object\"}');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json-schema-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json-schema.html\nCREATE TABLE tab (jcol JSON CONSTRAINT jchk\n  CHECK (jcol IS JSON VALIDATE '{\"type\" : \"object\"}'));\nCREATE TABLE jtab(jcol JSON DOMAIN jd);\nCREATE DOMAIN jd AS JSON VALIDATE '{\"type\" : \"object\"}';\nSELECT * FROM USER_JSON_SCHEMA_COLUMNS;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json-schema-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json-schema.html\nSELECT data\n  FROM j_purchaseorder\n  WHERE data IS JSON VALIDATE\n    '{\"type\"       : \"object\",\n      \"properties\" : {\"PONumber\": {\"type\"    : \"number\",\n                                   \"minimum\" : 0}}}'"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json-schema-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json-schema.html\nCREATE TABLE mytable (\n  jcol JSON VALIDATE\n       '{\"type\"       : \"object\",\n         \"properties\" : {\"dateOfBirth\" : {\"extendedType\" : \"date\"}}}');\nINSERT INTO mytable VALUES ('{\"dateOfBirth\" : \"2018-04-11\"}');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json-schema-16.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json-schema.html\nCREATE TABLE mytable (\n  jcol JSON VALIDATE CAST\n       '{\"type\"       : \"object\",\n         \"properties\" : {\"dateOfBirth\" : {\"extendedType\" : \"date\"}}}');\nINSERT INTO mytable VALUES ('{\"dateOfBirth\" : \"2018-04-11\"}');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json-schema-18.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json-schema.html\nSELECT d.jcol.dateOfBirth.type() FROM mytable d;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json-schema-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json-schema.html\nCREATE TABLE tab (jcol JSON CONSTRAINT jchk\n  CHECK (jcol IS JSON VALIDATE '{\"type\" : \"object\"}'));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json-schema-22.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json-schema.html\nALTER TABLE employees\n  ADD CONSTRAINT min_salary CHECK (salary >= 2000) PRECHECK;\nALTER TABLE employees\n  ADD CONSTRAINT max_bonus CHECK ((salary * commission_pct) < 6000) PRECHECK;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json-schema-24.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json-schema.html\nALTER TABLE employees\n  ADD CONSTRAINT max_bonus CHECK ((salary * commission_pct) < 6000);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json-schema-25.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json-schema.html\nSELECT DBMS_JSON_SCHEMA.describe('EMPLOYEES');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json-schema-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json-schema.html\nCREATE DOMAIN jd AS JSON CONSTRAINT jchkd\n  CHECK (jd IS JSON VALIDATE '{\"type\" : \"object\"}');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json-schema-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json-schema.html\nCREATE TABLE jtab(jcol JSON DOMAIN jd);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json-schema-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json-schema.html\nCREATE DOMAIN jd AS JSON VALIDATE '{\"type\" : \"object\"}';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json-schema-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json-schema.html\nSELECT DBMS_JSON_SCHEMA.validate_report('{\"name\" : \"scott\",\n                                          \"role\" : \"developer\"}',\n                                        '{\"type\" : \"array\"}')\n  AS myreport;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json-schema-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json-schema.html\nCREATE TABLE tab (jcol JSON (OBJECT));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json-search-index-ad-hoc-queries-and-full-text-search-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json-search-index-ad-hoc-queries-and-full-text-search.html\nSELECT IDX_NAME, IDX_SYNC_TYPE, IDX_MAINTENANCE_TYPE FROM CTX_USER_INDEXES;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json-search-index-ad-hoc-queries-and-full-text-search-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json-search-index-ad-hoc-queries-and-full-text-search.html\nCREATE SEARCH INDEX po_search_idx ON j_purchaseorder (data)\n  FOR JSON;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json-search-index-ad-hoc-queries-and-full-text-search-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json-search-index-ad-hoc-queries-and-full-text-search.html\nSELECT data FROM j_purchaseorder\n  WHERE json_value(data, '$.User') = 'AKHOO';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json-search-index-ad-hoc-queries-and-full-text-search-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json-search-index-ad-hoc-queries-and-full-text-search.html\nCREATE SEARCH INDEX po_search_idx ON j_purchaseorder (data)\n  FOR JSON PARAMETERS ('MAINTENANCE AUTO');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json-search-index-ad-hoc-queries-and-full-text-search-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json-search-index-ad-hoc-queries-and-full-text-search.html\nCREATE SEARCH INDEX po_search_idx ON j_purchaseorder (data)\n  FOR JSON PARAMETERS ('SYNC (ON COMMIT)');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json-search-index-ad-hoc-queries-and-full-text-search-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json-search-index-ad-hoc-queries-and-full-text-search.html\nCREATE SEARCH INDEX po_search_idx ON j_purchaseorder (data)\n  FOR JSON PARAMETERS ('SEARCH_ON\n    TEXT INCLUDE ($.SpecialInstructions,\n                  $.LineItems.Part.Description)');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json-search-index-ad-hoc-queries-and-full-text-search-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json-search-index-ad-hoc-queries-and-full-text-search.html\nCREATE SEARCH INDEX po_search_idx ON j_purchaseorder (data)\n  FOR JSON PARAMETERS ('SEARCH_ON\n    TEXT INCLUDE    ($.SpecialInstructions,\n                     $.LineItems.Part.Description)\n    VALUE(NUMBER) INCLUDE  ($.PONumber, $.LineItems.Part.UnitPrice)\n    VALUE(VARCHAR2) INCLUDE ($.Reference, $.User,\n                             $.ShippingInstructions.name,\n                             $.ShippingInstructions.Address.zipCode)');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json-search-index-ad-hoc-queries-and-full-text-search-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json-search-index-ad-hoc-queries-and-full-text-search.html\nBEGIN\n  CTX_DDL.create_path_list('json_pl', CTX_DDL.PATHLIST_JSON, CTX_DDL.PATHLIST_INCLUDE);\n  CTX_DDL.add_path('json_pl', 'TEXT',     '$.SpecialInstructions');\n  CTX_DDL.add_path('json_pl', 'TEXT',     '$.LineItems.Part.Description');\n  CTX_DDL.add_path('json_pl', 'NUMBER',   '$.PONumber');\n  CTX_DDL.add_path('json_pl', 'NUMBER',   '$.LineItems.Part.UnitPrice');\n  CTX_DDL.add_path('json_pl', 'VARCHAR2', '$.Reference');\n  CTX_DDL.add_path('json_pl', 'VARCHAR2', '$.User');\n  CTX_DDL.add_path('json_pl', 'VARCHAR2', '$.ShippingInstructions.name');\n  CTX_DDL.add_path('json_pl', 'VARCHAR2', '$.ShippingInstructions.Address.zipCode');\nEND;\n/\nCREATE SEARCH INDEX po_search_idx ON j_purchaseorder (data)\n  FOR JSON PARAMETERS ('PATHLIST json_pl');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json-search-index-ad-hoc-queries-and-full-text-search-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json-search-index-ad-hoc-queries-and-full-text-search.html\nSELECT data FROM j_purchaseorder\n  WHERE json_exists(data,\n                    '$.ShippingInstructions.Address.country');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json-search-index-ad-hoc-queries-and-full-text-search-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json-search-index-ad-hoc-queries-and-full-text-search.html\nSELECT data FROM j_purchaseorder\n  WHERE json_exists(data, '$?(@.User == \"AKHOO\"\n                          && @.LineItems.Quantity > 8)');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_table-generalizes-sql-json-query-functions-and-conditions-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_table-generalizes-sql-json-query-functions-and-conditions.html\nSELECT json_value(data, '$.Requestor' RETURNING VARCHAR2(32)),\n       json_query(data, '$.ShippingInstructions.Phone'\n                  RETURNING VARCHAR2(100))\n  FROM j_purchaseorder\n  WHERE json_exists(data, '$.ShippingInstructions.Address.zipCode')\n    AND json_value(data,  '$.AllowPartialShipment'\n                   RETURNING BOOLEAN) = TRUE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_table-generalizes-sql-json-query-functions-and-conditions-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_table-generalizes-sql-json-query-functions-and-conditions.html\nSELECT jt.requestor, jt.phones\n  FROM j_purchaseorder,\n       json_table(data, '$'\n         COLUMNS (\n           requestor VARCHAR2(32 CHAR) PATH '$.Requestor',\n           phones    VARCHAR2(100 CHAR) FORMAT JSON\n                     PATH '$.ShippingInstructions.Phone',\n           partial   BOOLEAN PATH '$.AllowPartialShipment',\n           has_zip   BOOLEAN EXISTS\n                     PATH '$.ShippingInstructions.Address.zipCode')) jt\n  WHERE jt.partial AND jt.has_zip;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-operation-handlers-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-operation-handlers.html\nSELECT json_transform('{\"a\":\"cat\"}',\n                      INSERT '$.b' = PATH '$.a.number()'\n                      IGNORE ON ERROR);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-operation-handlers-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-operation-handlers.html\nSELECT json_transform('{\"a\":null, \"b\":[ 1,2,3 ]}',\n                      APPEND '$.b' = PATH '$.x'\n                      ERROR ON EMPTY);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-operation-handlers-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-operation-handlers.html\nSELECT json_transform('{\"created\":\"2025-04-09T22:07:06\"}',\n                      SET '$.created' = SYSDATE\n                      IGNORE ON EXISTING);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-operation-handlers-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-operation-handlers.html\nSELECT json_transform('{\"x\":null}',\n                      RENAME '$.a' = 'b'\n                      ERROR ON MISSING);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-operation-handlers-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-operation-handlers.html\nSELECT json_transform('{\"a\":\"notAnObject\"}',\n                      MERGE '$.a' = PATH '$var'\n                      IGNORE ON MISMATCH\n                      PASSING JSON('{\"b\":2}') AS \"var\");"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-operation-handlers-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-operation-handlers.html\nSELECT json_transform('{\"a\":\"dog\"}',\n                      APPEND '$.a' = 'cat'\n                      CREATE ON MISMATCH);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-operation-handlers-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-operation-handlers.html\nSELECT json_transform('{\"a\":\"dog\"}',\n                      APPEND '$.a' = 'cat'\n                      REPLACE ON MISMATCH);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-operator-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-operator.html\nSELECT json_transform('{\"a\":[ 1, 2, 3, 4 ], \"b\":[ 2, 5 ]}',\n                      MINUS '$.a' = PATH '$.b[*]')"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-operator-append-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-operator-append.html\nSELECT json_transform('{\"a\":[1,2,3]}',\n                      APPEND '$.a' = 'hello');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-operator-append-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-operator-append.html\nSELECT json_transform('{\"a\":[1,2,3]}',\n                      INSERT '$.a[last+1]' = 'hello');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-operator-append-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-operator-append.html\nSELECT json_transform('{\"a\": [ {\"b\": [ 1,2 ]},\n                               {\"b\": [ 3,4 ]} ]}',\n                      SET '$var' = json_array(5, 'cat'),\n                      APPEND '$.a[*].b' = PATH '$var[*]');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-operator-append-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-operator-append.html\nSELECT json_transform('{\"a\":[1,2,3]}',\n                      APPEND '$.b' = PATH '$.a[0,2]'\n                      CREATE ON MISSING);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-operator-copy-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-operator-copy.html\nSELECT json_transform('{\"a\":[], \"b\":[ {\"x\":1}, {\"x\":2}, {\"x\":3} ]}',\n                      COPY '$.a' = PATH '$.b.x',\n                      REMOVE '$.b');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-operator-insert-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-operator-insert.html\nSELECT json_transform('{}',\n                      INSERT '$.a' = 'hello')"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-operator-insert-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-operator-insert.html\nSELECT json_transform('{\"a\":1}',\n                      INSERT '$.a' = 'hello')"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-operator-insert-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-operator-insert.html\nSELECT json_transform('{\"a\":[1,2,3,4]}',\n                      INSERT '$.a[2]' = 'hello')"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-operator-intersect-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-operator-intersect.html\nSELECT json_transform('{\"a\":[ 1, 2, 3 ], \"b\":[ 2, 3, 4 ]}',\n                      INTERSECT '$.a' = PATH '$.b[*]')"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-operator-intersect-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-operator-intersect.html\nSELECT json_transform('{\"a\":[ 1,2 ], b:[ {c:3}, {c:4} ]}',\n                      PREPEND '$.a' = PATH '$.b[*].c')"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-operator-keep-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-operator-keep.html\nSELECT json_transform('{\"a\":1, \"b\":2, \"c\":3, \"d\":4}',\n                      KEEP '$.a', '$.d')"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-operator-keep-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-operator-keep.html\nSELECT json_transform('{\"a\":1, \"b\":2, \"c\":3, \"d\":4}',\n                      KEEP '$.*?(@ > 2)')"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-operator-merge-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-operator-merge.html\nSELECT json_transform('{\"a\":{\"x\":1, \"y\":2}, \"b\":{\"y\":3, \"z\":4}}',\n                      MERGE '$.a' = PATH '$.b')"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-operator-nested-path-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-operator-nested-path.html\nSELECT json_transform(\n         data, \n         NESTED PATH '$.LineItems[*]'\n           (SET '@.LineItemTotal' = PATH '@.Part.UnitPrice * @.Quantity'),\n         SET '$.OrderTotal' = PATH '$.LineItems[*].LineItemTotal.sum()',\n         REMOVE '$.LineItems[*].LineItemTotal')\n  FROM j_purchaseorder;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-operator-prepend-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-operator-prepend.html\nSELECT json_transform('{\"a\":[1,2]}',\n                      INSERT '$.a' = '0')"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-operator-prepend-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-operator-prepend.html\nSELECT json_transform('{\"a\": [ {\"b\": [ 1,2 ]},\n                               {\"b\": [ 3,4 ]} ]}',\n                      SET '$var' = json_array(5, 'cat'),\n                      PREPEND '$.a[*].b' = PATH '$var[*]');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-operator-prepend-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-operator-prepend.html\nSELECT json_transform('{\"a\":[ 1,2 ], b:[ {c:3}, {c:4} ]}',\n                      PREPEND '$.a' = PATH '$.b[*].c')"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-operator-remove-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-operator-remove.html\nSELECT json_transform('{\"a\":[0,1,2]}',\n                      REMOVE '$.a[0]')"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-operator-rename-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-operator-rename.html\nSELECT json_transform('{\"abc\":1}',\n                      RENAME '$.abc' = 'xyz',\n                      SET '$.xyz' = 2)"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-operator-replace-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-operator-replace.html\nSELECT json_transform('{\"a\":1}',\n                      REPLACE '$.a' = 2,\n                      REPLACE '$.b' = 3);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-operator-set-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-operator-set.html\nSELECT json_transform(JSON('{\"alpha\" : {\"a\":1, \"b\":2}}'),\n         SET '$.alpha.z' = 26)"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-operator-set-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-operator-set.html\nSELECT json_transform(JSON('{\"a\":1, \"b\":2}'),\n         SET '$.alpha.z' = 26)"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-operator-set-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-operator-set.html\nSELECT json_transform(JSON('{\"alpha\" : [ 1,2 ]}'),\n         SET '$.alpha.z' = 26)"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-operator-set-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-operator-set.html\nSELECT json_transform('{\"a\":1}',\n                      SET '$.b' = 2);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-operator-set-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-operator-set.html\nSELECT json_transform('{\"a\":1}',\n                      SET '$.a' = 2);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-operator-set-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-operator-set.html\nSELECT json_transform('{\"a\":[1,2,3]}',\n                      SET '$.a[1]' = 5);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-operator-set-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-operator-set.html\nSELECT json_transform('{\"a\":[1,2,3]}',\n                      SET '$.a[6]' = 5);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-operator-sort-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-operator-sort.html\nSELECT json_transform('{\"a\":[ 1, null, 2, \"cat\", true, 3.1416 ]}',\n                      SORT '$.a' DESC);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-operator-sort-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-operator-sort.html\nSELECT json_transform(data,\n                      SORT '$.LineItems'\n                        ORDER BY '$.Part.UnitPrice' DESC,\n                                 '$.ItemNumber' DESC\n                      RETURNING VARCHAR2(4000))\n  FROM j_purchaseorder;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-operator-union-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-operator-union.html\nSELECT json_transform('{\"a\":[ 1, 2, 3 ], \"b\":[ 2, 5, 3, 4 ]}',\n                      UNION '$.a' = PATH '$.b')"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-right-hand-side-rhs-path-expressions-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-right-hand-side-rhs-path-expressions.html\nSELECT json_transform('{\"a\":[ 1,2,3 ]}',\n                      SET '$.b' = PATH '$.a[*].sum()');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-right-hand-side-rhs-path-expressions-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-right-hand-side-rhs-path-expressions.html\nSELECT json_transform('{\"a\":1}',\n             SET '$var1' = 2,\n             SET '$var2' = PATH '$.a',\n             SET '$.b'   = PATH '$var1 + $var2 + $var3'\n             PASSING 5 AS \"var3\");"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-right-hand-side-rhs-path-expressions-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-right-hand-side-rhs-path-expressions.html\nSELECT json_transform('{\"salary\":1000, \"commission\":150}',\n                      SET '$.bonus' = PATH '$.salary * $bonusFactor',\n                      SET '$.compensation' = PATH '($.salary + $.bonus)\n                                                   + $.commission'\n                      PASSING 0.05 AS \"bonusFactor\");"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-right-hand-side-rhs-path-expressions-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-right-hand-side-rhs-path-expressions.html\nSELECT json_transform('{\"items\":[ {\"quantity\":2, \"unitPrice\":3},\n                                           {\"quantity\":2, \"unitPrice\":7} ]}',\n                      SET '$priceVar' = PATH '0.00',\n                      NESTED PATH '$.items[*]'\n                        (SET '$priceVar' =\n                             PATH '$priceVar + (@.unitPrice * @.quantity)'),\n                      SET '$.totalPrice' = PATH '$priceVar');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-right-hand-side-rhs-path-expressions-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-right-hand-side-rhs-path-expressions.html\nSELECT json_transform('{travel:[ {\"name\":\"Jack\", \"approval\":[ 2023, 2024 ]},\n                                 {\"name\":\"Jill\", \"approval\":[ 2024 ]} ]}',\n                      SET '$var' = JSON('[ 2025,2026 ]'),\n                      APPEND '$.travel.approval' = PATH '$var[*]');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/json_transform-right-hand-side-rhs-path-expressions-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/json_transform-right-hand-side-rhs-path-expressions.html\nSELECT json_transform('{\"a\":[ 1,2 ], b:[ {c:3}, {c:4} ]}',\n                      PREPEND '$.a' = PATH '$.b[*].c')"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/loading-external-json-data-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/loading-external-json-data.html\nCREATE OR REPLACE DIRECTORY order_entry_dir\n  AS 'folder-containing-json-file';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/loading-external-json-data-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/loading-external-json-data.html\nCREATE TABLE json_file_contents (data JSON)\n  ORGANIZATION EXTERNAL\n    (TYPE ORACLE_BIGDATA\n     ACCESS PARAMETERS (com.oracle.bigdata.fileformat = jsondoc)\n     LOCATION (order_entry_dir:'PurchaseOrders.json'))\n  PARALLEL\n  REJECT LIMIT UNLIMITED;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/loading-external-json-data-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/loading-external-json-data.html\nDROP TABLE j_purchaseorder;\nCREATE TABLE j_purchaseorder\n  (id          VARCHAR2 (32) NOT NULL PRIMARY KEY,\n   date_loaded TIMESTAMP (6) WITH TIME ZONE,\n   data        JSON);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/loading-external-json-data-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/loading-external-json-data.html\nINSERT INTO j_purchaseorder (id, date_loaded, data)\n  SELECT SYS_GUID(), SYSTIMESTAMP, data\n    FROM json_file_contents;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/loading-external-json-data-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/loading-external-json-data.html\nCREATE JSON COLLECTION TABLE purchaseorders;\nINSERT INTO purchaseorders SELECT * FROM json_file_contents;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/mismatch-clause-sql-json-query-functions-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/mismatch-clause-sql-json-query-functions.html\nCREATE TYPE person_T AS OBJECT (\n  first     VARCHAR2(30),\n  last      VARCHAR2(30),\n  birthyear NUMBER);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/mismatch-clause-sql-json-query-functions-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/mismatch-clause-sql-json-query-functions.html\nSELECT json_value('{\"first\":     \"Grace\",\n                    \"middle\":    \"Brewster\",\n                    \"last\":      \"Hopper\",\n                    \"birthyear\": \"1906\"}',\n                  '$'\n                  RETURNING person_t);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/mismatch-clause-sql-json-query-functions-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/mismatch-clause-sql-json-query-functions.html\nSELECT json_value('{\"first\":     \"Grace\",\n                    \"middle\":    \"Brewster\",\n                    \"last\":      \"Hopper\",\n                    \"birthyear\": \"1906\"}',\n                  '$'\n                  RETURNING person_t\n                  ERROR ON MISMATCH (EXTRA DATA));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/mismatch-clause-sql-json-query-functions-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/mismatch-clause-sql-json-query-functions.html\nSELECT json_value('{\"first\":     \"Grace\",\n                    \"middle\":    \"Brewster\",\n                    \"last\":      \"Hopper\",\n                    \"birthyear\": \"1906\"}',\n                  '$'\n                  RETURNING person_t\n                  ERROR ON MISMATCH (EXTRA DATA)\n                  ERROR ON MISMATCH (MISSING DATA)\n                  IGNORE ON MISMATCH (TYPE ERROR));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/multiple-data-guides-document-set-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/multiple-data-guides-document-set.html\nINSERT INTO j_purchaseorder\n  VALUES (\n    SYS_GUID(),\n    to_date('30-JUN-2015'),\n    '{\"PO_Number\"     : 4230,\n      \"PO_Reference\"  : \"JDEER-20140421\",\n      \"PO_LineItems\"  : [ {\"Part_Number\"  : 230912362345,\n                          \"Quantity\"     : 3.0} ]}');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/multiple-data-guides-document-set-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/multiple-data-guides-document-set.html\nINSERT INTO j_purchaseorder\n  VALUES (\n    SYS_GUID(),\n    to_date('30-MAR-2016'),\n    '{\"PO_ID\"     : 4230,\n      \"PO_Ref\"  : \"JDEER-20140421\",\n      \"PO_Items\"  : [ {\"Part_No\"       : 98981327234,\n                      \"Item_Quantity\" : 13} ]}');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/multiple-data-guides-document-set-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/multiple-data-guides-document-set.html\nSELECT extract(YEAR FROM date_loaded), json_dataguide(data)\n  FROM j_purchaseorder\n  GROUP BY extract(YEAR FROM date_loaded)\n  ORDER BY extract(YEAR FROM date_loaded) DESC;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/oracle-sql-condition-json_textcontains-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/oracle-sql-condition-json_textcontains.html\nSELECT data FROM j_purchaseorder\n  WHERE json_textcontains(data,\n                          '$.LineItems.Part.Description',\n                          'Magic');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/oracle-sql-condition-json_textcontains-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/oracle-sql-condition-json_textcontains.html\nSELECT po.data.PONumber, SCORE(1)\n  FROM  j_purchaseorder po\n  WHERE json_textcontains (po.data,\n                           '$.LineItems.Part.Description',\n                           'run',\n                           1)\n  ORDER BY SCORE(1) DESC;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/oracle-sql-function-json_mergepatch-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/oracle-sql-function-json_mergepatch.html\nUPDATE j_purchaseorder SET data =\n  json_mergepatch(data, '{\"Special Instructions\":null}');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/oracle-sql-function-json_mergepatch-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/oracle-sql-function-json_mergepatch.html\nSELECT json_mergepatch(data, '{\"Special Instructions\":null}'\n                       RETURNING CLOB PRETTY)\n  FROM j_purchaseorder;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/oracle-sql-function-json_transform-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/oracle-sql-function-json_transform.html\nUPDATE j_purchaseorder po\n  SET data = json_transform(data,\n                            SET '$.costCenter' = 'Z20')\n  WHERE po.data.User = 'ABULL';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/oracle-sql-function-json_transform-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/oracle-sql-function-json_transform.html\nUPDATE j_purchaseorder\n  SET data = json_transform(data,\n                            SET '$.lastUpdated' = SYSTIMESTAMP);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/oracle-sql-function-json_transform-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/oracle-sql-function-json_transform.html\nSELECT json_transform(data,\n                      REMOVE '$.\"Special Instructions\"'\n                      RETURNING CLOB PRETTY)\n  FROM j_purchaseorder;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/overview-json-generation-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/overview-json-generation.html\nSELECT json_arrayagg(department_name)FROM departments;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/overview-json-generation-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/overview-json-generation.html\nSELECT JSON(json_objectagg(department_name VALUE department_id))\n  FROM departments;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/overview-json-generation-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/overview-json-generation.html\nSELECT json_objectagg(department_name VALUE department_id\n                      RETURNING JSON)\n  FROM departments;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/overview-json-oracle-database-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/overview-json-oracle-database.html\nSELECT po.data.Requestor FROM j_purchaseorder po;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/overview-memory-json-data-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/overview-memory-json-data.html\nSHOW PARAMETER INMEMORY_VIRTUAL_COLUMNS\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/partitioning-json-data-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/partitioning-json-data.html\nCREATE JSON COLLECTION TABLE orders\n  (po_num_vc NUMBER GENERATED ALWAYS AS\n    (json_value (DATA, '$.PONumber.number()'\n     ERROR ON ERROR))\n    MATERIALIZED)\n  PARTITION BY RANGE (po_num_vc)\n   (PARTITION p1 VALUES LESS THAN (1000),\n    PARTITION p2 VALUES LESS THAN (2000));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/partitioning-json-data-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/partitioning-json-data.html\nSELECT DATA FROM orders p\n  WHERE p.data.PONumber.number() = 1234;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/passing-clause-sql-functions-and-conditions-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/passing-clause-sql-functions-and-conditions.html\nSELECT count(*) FROM j_purchaseorder\nWHERE json_exists(data, '$.PONumber?(@.numberOnly() > $d)'\nPASSING to_number(:1) AS \"d\");"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/passing-clause-sql-functions-and-conditions-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/passing-clause-sql-functions-and-conditions.html\nSELECT count(*) FROM j_purchaseorder\nWHERE json_exists(data, '$.PONumber?(@ > $d)'\nPASSING to_number(:1) AS \"d\" TYPE(STRICT));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/performing-migration-check-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/performing-migration-check.html\nSELECT data FROM table_owner.j_purchaseorder\n  WHERE ROWID IN (SELECT pt.ERROR_ROW_ID\n\t             FROM my_precheck_table pt\n\t             WHERE pt.schema_name = table_owner\n\t               AND pt.table_name = j_purchaseorder\n\t               AND pt.column_name = data);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/persistent-data-guide-information-part-json-search-index-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/persistent-data-guide-information-part-json-search-index.html\nALTER TABLE table_name ENABLE CONSTRAINT is_json_check_constraint_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/persistent-data-guide-information-part-json-search-index-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/persistent-data-guide-information-part-json-search-index.html\nCREATE SEARCH INDEX po_dg_only_idx\n  ON j_purchaseorder (data) FOR JSON\n    PARAMETERS ('DATAGUIDE ON SEARCH_ON NONE');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/persistent-data-guide-information-part-json-search-index-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/persistent-data-guide-information-part-json-search-index.html\nALTER INDEX po_search_idx REBUILD PARAMETERS ('DATAGUIDE ON');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/persistent-data-guide-information-part-json-search-index-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/persistent-data-guide-information-part-json-search-index.html\nEXEC DBMS_STATS.gather_index_stats(docuser, po_search_idx, NULL, 100);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/populate-json-type-column-querying-textual-json-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/populate-json-type-column-querying-textual-json.html\nCREATE TABLE j_purchaseorder_new PARALLEL NOLOGGING AS\nSELECT id id, date_loaded date_loaded, JSON(data) data\n  FROM j_purchaseorder;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/populate-json-type-column-querying-textual-json-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/populate-json-type-column-querying-textual-json.html\nINSERT /*+ PARALLEL APPEND */\n  INTO j_purchaseorder_new (id, date_loaded, data)\n  SELECT id, date_loaded, JSON(data)\n    FROM j_purchaseorder;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/populate-json-type-column-querying-textual-json-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/populate-json-type-column-querying-textual-json.html\nDROP TABLE j_purchaseorder;\nALTER TABLE j_purchaseorder_new RENAME TO j_purchaseorder;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/populating-json-data-memory-column-store-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/populating-json-data-memory-column-store.html\nSELECT COUNT(1) FROM j_purchaseorder\n  WHERE json_exists(data,\n                    '$.ShippingInstructions?(\n                       @.Address.zipCode == 99236)');\nALTER TABLE j_purchaseorder INMEMORY;\nSELECT COUNT(1) FROM j_purchaseorder\n  WHERE json_exists(data,\n                    '$.ShippingInstructions?(\n                       @.Address.zipCode == 99236)');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/populating-json-data-memory-column-store-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/populating-json-data-memory-column-store.html\nALTER TABLE j_purchaseorder INMEMORY TEXT (data);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/querying-data-guide-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/querying-data-guide.html\nWITH dg_t AS (SELECT json_dataguide(data) dg_doc\n                FROM j_purchaseorder)\n  SELECT jt.*\n    FROM dg_t,\n         json_table(dg_doc, '$[*]'\n           COLUMNS\n             jpath   VARCHAR2(40) PATH '$.\"o:path\"',\n             type    VARCHAR2(10) PATH '$.\"type\"',\n             tlength NUMBER       PATH '$.\"o:length\"') jt\n   ORDER BY jt.jpath;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/querying-data-guide-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/querying-data-guide.html\nWITH dg_t AS\n  (SELECT DBMS_JSON.get_index_dataguide('J_PURCHASEORDER',\n                                        'DATA',\n                                        DBMS_JSON.FORMAT_FLAT) dg_doc\n)\n SELECT jt.*\n   FROM dg_t,\n        json_table(dg_doc, '$[*]'\n          COLUMNS\n            jpath     VARCHAR2(40) PATH '$.\"o:path\"',\n            type      VARCHAR2(10) PATH '$.\"type\"',\n            tlength   NUMBER       PATH '$.\"o:length\"',\n            frequency NUMBER       PATH '$.\"o:frequency\"') jt\n   WHERE jt.frequency > 80;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/read-only-views-based-json-generation-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/read-only-views-based-json-generation.html\ndescribe department_view;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/read-only-views-based-json-generation-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/read-only-views-based-json-generation.html\nCREATE VIEW department_view AS \n  SELECT  dep.department_id id,\n          JSON {'id'                : dep.department_id,\n                'departmentName'    : dep.department_name,\n                'departmentAddress' : JSON {'street'  : loc.street_address,\n                                            'zip'     : loc.postal_code,\n                                            'city'    : loc.city,\n                                            'state'   : loc.state_province,\n                                            'country' : loc.country_id},\n                'employees'         : [ SELECT\n                                          JSON {'id'    : emp.employee_id,\n                                                'name'  : emp.first_name || ' ' || emp.last_name,\n                                                'title' : (SELECT job_title \n                                                             FROM jobs job \n                                                             WHERE job.job_id = emp.job_id)}\n                                          FROM employees emp \n                                          WHERE emp.department_id = dep.department_id ]} data\n    FROM departments dep, locations loc\n    WHERE dep.location_id = loc.location_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/read-only-views-based-json-generation-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/read-only-views-based-json-generation.html\nSELECT json_serialize(data pretty) FROM department_view WHERE id = 90;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/simple-dot-notation-access-json-data-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/simple-dot-notation-access-json-data.html\nSELECT po.data.PONumber FROM j_purchaseorder po;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/simple-dot-notation-access-json-data-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/simple-dot-notation-access-json-data.html\nSELECT po.data.PONumber.number() FROM j_purchaseorder po;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/simple-dot-notation-access-json-data-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/simple-dot-notation-access-json-data.html\nSELECT t.data.name FROM fruit t;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/simple-dot-notation-access-json-data-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/simple-dot-notation-access-json-data.html\nSELECT t.data.name.string() FROM fruit t;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/simple-dot-notation-access-json-data-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/simple-dot-notation-access-json-data.html\nALTER SESSION SET JSON_BEHAVIOR=\"ON_ERROR:ERROR\";"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/simple-dot-notation-access-json-data-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/simple-dot-notation-access-json-data.html\nSELECT po.data.PONumber FROM j_purchaseorder po;\nSELECT json_value(data, '$.PONumber') FROM j_purchaseorder;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/simple-dot-notation-access-json-data-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/simple-dot-notation-access-json-data.html\nSELECT po.data.PONumber.number() FROM j_purchaseorder po;\nSELECT json_value(data, '$.PONumber.number()')\n  FROM j_purchaseorder;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/simple-dot-notation-access-json-data-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/simple-dot-notation-access-json-data.html\nSELECT po.data.ShippingInstructions.Phone\n  FROM j_purchaseorder po;\nSELECT json_query(data, '$.ShippingInstructions.Phone')\n  FROM j_purchaseorder;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/simple-dot-notation-access-json-data-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/simple-dot-notation-access-json-data.html\nSELECT po.data.ShippingInstructions.Phone.type\n  FROM j_purchaseorder po;\nSELECT json_query(data, '$.ShippingInstructions.Phone.type'\n                  WITH WRAPPER)\n  FROM j_purchaseorder;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/specifying-preferred-name-field-column-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/specifying-preferred-name-field-column.html\nBEGIN\n  DBMS_JSON.rename_column(\n    'J_PURCHASEORDER', 'DATA',\n    '$.PONumber',\n    DBMS_JSON.TYPE_NUMBER, 'PONumber');\n  DBMS_JSON.rename_column(\n    'J_PURCHASEORDER', 'DATA',\n    '$.ShippingInstructions.Phone',\n    DBMS_JSON.TYPE_STRING, 'Phone');\n  DBMS_JSON.rename_column(\n    'J_PURCHASEORDER', 'DATA',\n    '$.ShippingInstructions.Phone.type',\n    DBMS_JSON.TYPE_STRING, 'PhoneType');\n  DBMS_JSON.rename_column(\n    'J_PURCHASEORDER', 'DATA',\n    '$.ShippingInstructions.Phone.number',\n    DBMS_JSON.TYPE_STRING, 'PhoneNumber');\n  DBMS_JSON.rename_column(\n    'J_PURCHASEORDER', 'DATA',\n    '$.LineItems.ItemNumber',\n    DBMS_JSON.TYPE_NUMBER, 'ItemNumber');\n  DBMS_JSON.rename_column(\n    'J_PURCHASEORDER', 'DATA',\n    '$.LineItems.Part.Description',\n    DBMS_JSON.TYPE_STRING, 'PartDescription');\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/sql-json-condition-json_exists-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/sql-json-condition-json_exists.html\nSELECT json_exists('{a : null}', '$.a');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/sql-json-condition-json_exists-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/sql-json-condition-json_exists.html\nSELECT po.data FROM j_purchaseorder po\n  WHERE json_exists(po.data,                    \n                    '$.LineItems.Part?(@.UPCCode == $v1)'\n                    PASSING '85391628927' AS \"v1\");"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/sql-json-conditions-is-json-and-is-not-json-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/sql-json-conditions-is-json-and-is-not-json.html\nCREATE TABLE j_purchaseorder\n  (id          VARCHAR2 (32) NOT NULL PRIMARY KEY,\n   date_loaded TIMESTAMP (6) WITH TIME ZONE,\n   data        VARCHAR2 (32767)\n   CONSTRAINT ensure_json CHECK (data is json (STRICT)));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/sql-json-function-json_array-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/sql-json-function-json_array.html\nSELECT json_object('title'       VALUE job_title, \n                   'salaryRange' VALUE json_array(min_salary, max_salary)\n                   RETURNING JSON)\n  FROM jobs;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/sql-json-function-json_array-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/sql-json-function-json_array.html\nSELECT JSON { 'title'       VALUE job_title, \n              'salaryRange' VALUE [ min_salary, max_salary ] }\n  FROM jobs;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/sql-json-function-json_array-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/sql-json-function-json_array.html\nSELECT JSON [ SELECT JSON {'id'   : employee_id,\n                           'name' : last_name,\n                           'sal'  : salary}\n                FROM employees\n                WHERE salary > 12000\n                ORDER BY salary ] by_salary;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/sql-json-function-json_arrayagg-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/sql-json-function-json_arrayagg.html\nSELECT json_object('id'         VALUE mgr.employee_id, \n                   'manager'    VALUE (mgr.first_name || ' '|| mgr.last_name),\n                   'numReports' VALUE count(rpt.employee_id),\n                   'reports'    VALUE json_arrayagg(rpt.employee_id\n                                                    ORDER BY rpt.employee_id))\n  FROM  employees mgr, employees rpt\n  WHERE mgr.employee_id = rpt.manager_id\n  GROUP BY mgr.employee_id, mgr.last_name, mgr.first_name\n  HAVING count(rpt.employee_id) > 6;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/sql-json-function-json_arrayagg-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/sql-json-function-json_arrayagg.html\nSELECT json_object(\n         'region'    : region_name,\n         'countries' :\n         (SELECT json_arrayagg(json_object('id'   : country_id,\n                                           'name' : country_name))\n            FROM countries c\n            WHERE c.region_id = r.region_id))\n  FROM regions r;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/sql-json-function-json_object-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/sql-json-function-json_object.html\nSELECT json_object('id'          : employee_id,\n                   'name'        : first_name || ' ' || last_name,\n                   'contactInfo' : json_object('mail'  : email,\n                                               'phone' : phone_number),\n                   'hireDate'    : hire_date,\n                   'pay'         : salary\n                   RETURNING JSON) \n  FROM hr.employees\n  WHERE salary > 15000;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/sql-json-function-json_object-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/sql-json-function-json_object.html\nSELECT JSON { * }\n  FROM hr.employees\n  WHERE salary > 15000;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/sql-json-function-json_object-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/sql-json-function-json_object.html\nSELECT JSON_OBJECT('city'     : city,\n                   'province' : state_province ABSENT ON NULL) \n  FROM hr.locations\n  WHERE city LIKE 'S%';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/sql-json-function-json_object-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/sql-json-function-json_object.html\nSELECT JSON {'city'     : city,\n             'province' : state_province ABSENT ON NULL} \n  FROM hr.locations\n  WHERE city LIKE 'S%';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/sql-json-function-json_object-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/sql-json-function-json_object.html\nCREATE TABLE po_ship\n  AS SELECT json_value(data, '$.ShippingInstructions'\n                       RETURNING shipping_t)\n  shipping\n  FROM j_purchaseorder;\nDESCRIBE po_ship;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/sql-json-function-json_object-16.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/sql-json-function-json_object.html\nSELECT json_object(shipping RETURNING JSON)\n  FROM po_ship;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/sql-json-function-json_object-18.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/sql-json-function-json_object.html\nSELECT JSON {shipping} FROM po_ship;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/sql-json-function-json_object-19.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/sql-json-function-json_object.html\nCREATE OR REPLACE TYPE my_mailing_address_type\n  AS OBJECT(Street VARCHAR2(80),\n            City   VARCHAR2(80),\n            State  CHAR(2),\n            Zip    VARCHAR2(10));\n\nCREATE TABLE t1 (col1 my_mailing_address_type);\n\nINSERT INTO t1 VALUES (my_mailing_address_type('street1', 'city1', 'CA',\n    '12345'));\n\nSELECT json_object(col1) FROM t1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/sql-json-function-json_object-21.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/sql-json-function-json_object.html\nSELECT json_object(col1 WITH TYPENAME) FROM t1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/sql-json-function-json_object-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/sql-json-function-json_object.html\nSELECT JSON { last_name,\n              'contactInfo' : JSON { email, phone_number },\n              hire_date,\n              salary}\n  FROM hr.employees\n  WHERE employee_id = 101;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/sql-json-function-json_object-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/sql-json-function-json_object.html\nSELECT json_object(* RETURNING JSON)\n  FROM hr.employees\n  WHERE salary > 15000;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/sql-json-function-json_objectagg-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/sql-json-function-json_objectagg.html\nSELECT json_objectagg(department_name VALUE department_id)\n  FROM departments;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/sql-json-function-json_query-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/sql-json-function-json_query.html\nALTER SESSION SET JSON_BEHAVIOR = \"json_query_ret_varchar:true\";"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/sql-json-function-json_query-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/sql-json-function-json_query.html\nSELECT json_query(data, '$.ShippingInstructions.Phone[*].type'\n                  WITH WRAPPER)\n  FROM j_purchaseorder;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/sql-json-function-json_table-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/sql-json-function-json_table.html\nSELECT jt.*\n  FROM j_purchaseorder po,\n       json_table(po.data\n         COLUMNS (\"Special Instructions\",\n                  NESTED LineItems[*]\n                    COLUMNS (ItemNumber NUMBER,\n                             Description PATH Part.Description))\n       ) AS \"JT\";"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/sql-json-function-json_table-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/sql-json-function-json_table.html\nSELECT jt.*\n  FROM j_purchaseorder po,\n       json_table(po.data, \n         '$'\n         COLUMNS (\n           \"Special Instructions\" VARCHAR2(4000)\n                                  PATH '$.\"Special Instructions\"',\n           NESTED PATH '$.LineItems[*]'\n             COLUMNS (\n               ItemNumber  NUMBER        PATH '$.ItemNumber',\n               Description VARCHAR(4000) PATH '$.Part.Description'))\n       ) AS \"JT\";"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/sql-json-path-expression-item-methods-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/sql-json-path-expression-item-methods.html\nSELECT json_query('[ \"alpha\", 42, \"10.4\" ]', '$[*].string()'\n                  WITH ARRAY WRAPPER);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/sql-json-path-expression-item-methods-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/sql-json-path-expression-item-methods.html\nSELECT json_value('[ 19, \"Oracle\", {\"a\":1}, [1,2,3] ]', '$.type()');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/sql-json-path-expression-item-methods-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/sql-json-path-expression-item-methods.html\nSELECT json_query('[ 19, \"Oracle\", {\"a\":1}, [1,2,3] ]', '$.type()'\n                  WITH ARRAY WRAPPER);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/sql-json-path-expression-item-methods-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/sql-json-path-expression-item-methods.html\nSELECT json_query('[ 19, \"Oracle\", {\"a\":1}, [1,2,3] ]', '$.type()');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/sql-json-path-expression-item-methods-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/sql-json-path-expression-item-methods.html\nCREATE TABLE tab (data JSON);\nINSERT INTO tab VALUES ('{a : [ 1, 2, 3.5 ]}');\nSELECT t.data.a[*].sum() from tab t;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/sql-json-path-expression-item-methods-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/sql-json-path-expression-item-methods.html\nSELECT json_value(data, \n                  '$.LineItems[*].Quantity.avg()')\n  FROM j_purchaseorder;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/sql-json-path-expression-item-methods-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/sql-json-path-expression-item-methods.html\nSELECT avg(json_value(data, \n                      '$.LineItems[*].Quantity.avg()'))\n  FROM j_purchaseorder;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/sql-json-path-expression-syntax-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/sql-json-path-expression-syntax.html\n@.z in (\"a\", \"b\", c\")\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/sql-json-path-expression-syntax-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/sql-json-path-expression-syntax.html\nSELECT po.data FROM j_purchaseorder po\n  WHERE json_exists(po.data,                    \n                    '$.LineItems.Part?(@.UPCCode == $v1)'\n                    PASSING '85391628927' AS \"v1\");"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/sql-json-path-expression-syntax-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/sql-json-path-expression-syntax.html\n@.locations?( @.country in (\"France\", \"Germany\") )\n\n@.locations?( !(@.country in (\"France\", \"Germany\")) )\n\n@.locations?( exists(@.country)\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/sql-nested-clause-instead-json_table-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/sql-nested-clause-instead-json_table.html\nSELECT id, requestor, type, \"number\"\n  FROM j_purchaseorder NESTED\n       data\n         COLUMNS (Requestor,\n                  NESTED ShippingInstructions.Phone[*]\n                    COLUMNS (type, \"number\"));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/sql-nested-clause-instead-json_table-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/sql-nested-clause-instead-json_table.html\nSELECT *\n  FROM j_purchaseorder NESTED\n       data.ShippingInstructions.Phone[*]\n         COLUMNS (type, \"number\")"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/tables-json-columns-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/tables-json-columns.html\nCREATE TABLE j_purchaseorder\n  (id          VARCHAR2 (32) NOT NULL PRIMARY KEY,\n   date_loaded TIMESTAMP (6) WITH TIME ZONE,\n   data        JSON);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/tables-json-columns-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/tables-json-columns.html\nCREATE TABLE j_purchaseorder\n  (id          VARCHAR2 (32) NOT NULL PRIMARY KEY,\n   date_loaded TIMESTAMP (6) WITH TIME ZONE,\n   data        VARCHAR2 (23767)\n   CONSTRAINT ensure_json CHECK (data is json));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/tables-json-columns-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/tables-json-columns.html\nINSERT INTO j_purchaseorder\n  VALUES (\n    SYS_GUID(),\n    to_date('30-DEC-2014'),\n    '{\"PONumber\"             : 1600,\n      \"Reference\"            : \"ABULL-20140421\",\n      \"Requestor\"            : \"Alexis Bull\",\n      \"User\"                 : \"ABULL\",\n      \"CostCenter\"           : \"A50\",\n      \"ShippingInstructions\" :\n        {\"name\"    : \"Alexis Bull\",\n         \"Address\" : {\"street\"  : \"200 Sporting Green\",\n                      \"city\"    : \"South San Francisco\",\n                      \"state\"   : \"CA\",\n                      \"zipCode\" : 99236,\n                      \"country\" : \"United States of America\"},\n         \"Phone\"   : [{\"type\" : \"Office\", \"number\" : \"909-555-7307\"},\n                      {\"type\" : \"Mobile\", \"number\" : \"415-555-1234\"}]},\n      \"Special Instructions\" : null,\n      \"AllowPartialShipment\" : true,\n      \"LineItems\"            :\n        [{\"ItemNumber\" : 1,\n          \"Part\"       : {\"Description\" : \"One Magic Christmas\",\n                          \"UnitPrice\"   : 19.95,\n                          \"UPCCode\"     : 13131092899},\n          \"Quantity\"   : 9.0},\n         {\"ItemNumber\" : 2,\n          \"Part\"       : {\"Description\" : \"Lethal Weapon\",\n                          \"UnitPrice\"   : 19.95,\n                          \"UPCCode\"     : 85391628927},\n          \"Quantity\"   : 5.0}]}');\nINSERT INTO j_purchaseorder\n  VALUES (\n    SYS_GUID(),\n    to_date('30-DEC-2014'),\n    '{\"PONumber\"             : 672,\n      \"Reference\"            : \"SBELL-20141017\",\n      \"Requestor\"            : \"Sarah Bell\",\n      \"User\"                 : \"SBELL\",\n      \"CostCenter\"           : \"A50\",\n      \"ShippingInstructions\" : {\"name\"    : \"Sarah Bell\",\n                                \"Address\" : {\"street\"  : \"200 Sporting Green\",\n                                             \"city\"    : \"South San Francisco\",\n                                             \"state\"   : \"CA\",\n                                             \"zipCode\" : 99236,\n                                             \"country\" : \"United States of America\"},\n                                \"Phone\"   : \"983-555-6509\"},\n      \"Special Instructions\" : \"Courier\",\n      \"LineItems\"            :\n        [{\"ItemNumber\" : 1,\n          \"Part\"       : {\"Description\" : \"Making the Grade\",\n                          \"UnitPrice\"   : 20,\n                          \"UPCCode\"     : 27616867759},\n          \"Quantity\"   : 8.0},\n         {\"ItemNumber\" : 2,\n          \"Part\"       : {\"Description\" : \"Nixon\",\n                          \"UnitPrice\"   : 19.95,\n                          \"UPCCode\"     : 717951002396},\n          \"Quantity\"   : 5},\n         {\"ItemNumber\" : 3,\n          \"Part\"       : {\"Description\" : \"Eric Clapton: Best Of 1981-1999\",\n                          \"UnitPrice\"   : 19.95,\n                          \"UPCCode\"     : 75993851120},\n          \"Quantity\"   : 5.0}]}');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/tables-json-columns-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/tables-json-columns.html\nCREATE TABLE j_purchaseorder\n  (id          VARCHAR2 (32) NOT NULL PRIMARY KEY,\n   date_loaded TIMESTAMP (6) WITH TIME ZONE,\n   data        JSON (OBJECT));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/type-clause-sql-functions-and-conditions-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/type-clause-sql-functions-and-conditions.html\nALTER SESSION SET JSON_BEHAVIOR=\n  \"lax_json_value:false;lax_json_query:false;lax_json_table:false;lax_json_exists:false\";"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/type-clause-sql-functions-and-conditions-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/type-clause-sql-functions-and-conditions.html\nSELECT json_value('{\"a\" : \"42\"}', '$.a' RETURNING NUMBER);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/type-clause-sql-functions-and-conditions-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/type-clause-sql-functions-and-conditions.html\nSELECT jt.* FROM json_table('{\"a\" : 314, \"b\" : \"42\"}',\n                  '$' COLUMNS (a NUMBER PATH '$.a',\n                               b NUMBER PATH '$.b')) jt;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/type-clause-sql-functions-and-conditions-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/type-clause-sql-functions-and-conditions.html\nSELECT json_query('{\"a\" : [ 314, \"42\", \"alpha\" ]}',\n                  '$.a?(@ == 42)');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/type-clause-sql-functions-and-conditions-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/type-clause-sql-functions-and-conditions.html\nSELECT json_exists('{\"a\" : {\"b\" : \"42\"}}',\n                   '$.a?(@.b in (42, 314))');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/type-clause-sql-functions-and-conditions-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/type-clause-sql-functions-and-conditions.html\nSELECT json_transform('{\"a\" : \"42\"}',\n                      INSERT '$.b' = PATH '$?(@.a > 0).a + 1');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/type-clause-sql-functions-and-conditions-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/type-clause-sql-functions-and-conditions.html\nSELECT json_transform('{\"a\" : \"42\"}',\n                      INSERT '$.b' = PATH '$?(@.a > 0).a + 1'\n                      TYPE(LAX));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/types-filter-condition-comparisons-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/types-filter-condition-comparisons.html\nSELECT * \n  FROM emp t\n  WHERE t.data.dept = 'SALES' ORDER BY t.data.name"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/use-bind-variables-json_transform-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/use-bind-variables-json_transform.html\nCREATE JSON COLLECTION TABLE customers;\nINSERT INTO customers VALUES ('{\"_id\"    : 1234,\n                                \"name\"   : \"Jane Doe\",\n                                \"email\"  : \"jane@example.com\",\n                                \"tags\"   : [ \"newsletter\" ],\n                                \"status\" : \"gold\",\n                                \"joined\" : \"2024\"}');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/use-bind-variables-json_transform-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/use-bind-variables-json_transform.html\nUPDATE customers c\n  SET c.data =\n      json_transform(c.data,\n                     APPEND '$?(@status == \"gold\").tags' = 'free shipping')\n  WHERE json_exists(c.data, '$?(@joined < 2025)');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/use-bind-variables-json_transform-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/use-bind-variables-json_transform.html\nVAR status VARCHAR2(20);\nVAR tag VARCHAR2(20);\nVAR year NUMBER;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/using-filters-json_exists-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/using-filters-json_exists.html\nSELECT po.data FROM j_purchaseorder po\n  WHERE json_exists(po.data, '$.LineItems.Part.UPCCode');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/using-filters-json_exists-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/using-filters-json_exists.html\nSELECT po.data FROM j_purchaseorder po\n  WHERE json_exists(po.data,\n                    '$?(@.LineItems.Part.UPCCode == 85391628927)');\nSELECT po.data FROM j_purchaseorder po\n  WHERE json_exists(po.data,\n                    '$.LineItems?(@.Part.UPCCode == 85391628927)');\nSELECT po.data FROM j_purchaseorder po\n  WHERE json_exists(po.data,\n                    '$.LineItems.Part?(@.UPCCode == 85391628927)');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/using-filters-json_exists-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/using-filters-json_exists.html\nSELECT po.data FROM j_purchaseorder po\n  WHERE json_exists(po.data,\n                    '$?(@.LineItems.Part.UPCCode == 85391628927\n                        && @.LineItems.Quantity > 3)');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/using-filters-json_exists-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/using-filters-json_exists.html\nSELECT po.data FROM j_purchaseorder po\n  WHERE json_exists(po.data,\n                    '$.LineItems[*]?(@.Part.UPCCode == 85391628927\n                                     && @.Quantity > 3)');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/using-filters-json_exists-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/using-filters-json_exists.html\nSELECT po.data FROM j_purchaseorder po\n  WHERE json_exists(po.data,\n                    '$?(@.User == \"ABULL\"\n                        && exists(@.LineItems[*]?(\n                                    @.Part.UPCCode == 85391628927\n                                    && @.Quantity > 3)))');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/using-geojson-geographic-data-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/using-geojson-geographic-data.html\nCREATE TABLE j_geo\n  (id      VARCHAR2 (32) NOT NULL,\n   geo_doc VARCHAR2 (4000) CHECK (geo_doc is json));\nINSERT INTO j_geo\n  VALUES (1,\n          '{\"type\"     : \"FeatureCollection\",\n            \"features\" : [{\"type\"       : \"Feature\",\n                           \"geometry\"   : {\"type\" : \"Point\",\n                                           \"coordinates\" : [-122.236111, 37.482778]},\n                           \"properties\" : {\"Name\" : \"Redwood City\"}},\n                          {\"type\"       : \"Feature\",\n                           \"geometry\"   : {\"type\" : \"LineString\",\n                                           \"coordinates\" : [[102.0, 0.0],\n                                                            [103.0, 1.0],\n                                                            [104.0, 0.0],\n                                                            [105.0, 1.0]]},\n                           \"properties\" : {\"prop0\" : \"value0\",\n                                           \"prop1\" : 0.0}},\n                          {\"type\"       : \"Feature\",\n                           \"geometry\"   : {\"type\" : \"Polygon\",\n                                           \"coordinates\" : [[[100.0, 0.0],\n                                                             [101.0, 0.0],\n                                                             [101.0, 1.0],\n                                                             [100.0, 1.0],\n                                                             [100.0, 0.0]]]},\n                           \"properties\" : {\"prop0\" : \"value0\",\n                                           \"prop1\" : {\"this\" : \"that\"}}}]}');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/using-geojson-geographic-data-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/using-geojson-geographic-data.html\nSELECT json_value(geo_doc, '$.features[0].geometry'\n                  RETURNING SDO_GEOMETRY \n                  ERROR ON ERROR)\n  FROM j_geo;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/using-geojson-geographic-data-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/using-geojson-geographic-data.html\nSELECT jt.*\n  FROM j_geo,\n       json_table(geo_doc, '$.features[*]'\n         COLUMNS (sdo_val SDO_GEOMETRY PATH '$.geometry')) jt;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/using-geojson-geographic-data-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/using-geojson-geographic-data.html\nCREATE INDEX geo_first_feature_idx\n  ON j_geo (json_value(geo_doc, '$.features[0].geometry'\n                       RETURNING SDO_GEOMETRY))\n  INDEXTYPE IS MDSYS.SPATIAL_INDEX;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/using-geojson-geographic-data-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/using-geojson-geographic-data.html\nSELECT id,\n       json_value(geo_doc, '$.features[0].properties.Name') \"Name\",\n       SDO_GEOM.sdo_distance(\n         json_value(geo_doc, '$.features[0].geometry'\n                    RETURNING SDO_GEOMETRY),\n         SDO_GEOMETRY(2001,\n                      4326,\n                      SDO_POINT_TYPE(-122.416667, 37.783333, NULL),\n                      NULL,\n                      NULL),\n         100, -- Tolerance in meters\n         'unit=KM') \"Distance in kilometers\"\n  FROM  j_geo\n  WHERE sdo_within_distance(\n          json_value(geo_doc, '$.features[0].geometry'\n                     RETURNING SDO_GEOMETRY),\n          SDO_GEOMETRY(2001,\n                       4326,\n                       SDO_POINT_TYPE(-122.416667, 37.783333, NULL),\n                       NULL,\n                       NULL),\n          'distance=100 unit=KM')\n        = 'TRUE';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/using-json_table-json-arrays-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/using-json_table-json-arrays.html\nSELECT jt.*\n  FROM j_purchaseorder,\n       json_table(data, '$'\n         COLUMNS (requestor VARCHAR2(32 CHAR) PATH '$.Requestor',\n                  ph_arr    VARCHAR2(100 CHAR) FORMAT JSON\n                            PATH '$.ShippingInstructions.Phone')\n                 ) AS \"JT\";"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/using-json_table-json-arrays-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/using-json_table-json-arrays.html\nSELECT jt.*\n  FROM j_purchaseorder,\n       json_table(data, '$.ShippingInstructions.Phone[*]'\n         COLUMNS (phone_type VARCHAR2(10) PATH '$.type',\n                  phone_num  VARCHAR2(20) PATH '$.number')) AS \"JT\";"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/using-json_table-json-arrays-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/using-json_table-json-arrays.html\nSELECT jt.*\n  FROM j_purchaseorder,\n       json_table(data, '$'\n         COLUMNS (\n           requestor  VARCHAR2(32 CHAR) PATH '$.Requestor',\n           phone_type VARCHAR2(50 CHAR) FORMAT JSON WITH WRAPPER\n                      PATH '$.ShippingInstructions.Phone[*].type',\n           phone_num  VARCHAR2(50 CHAR) FORMAT JSON WITH WRAPPER\n                      PATH '$.ShippingInstructions.Phone[*].number')) AS \"JT\";"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/using-json_table-json-arrays-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/using-json_table-json-arrays.html\nSELECT jt.*\n  FROM j_purchaseorder po,\n       json_table(po.data, '$'\n         COLUMNS (Requestor VARCHAR2(4000) PATH '$.Requestor',\n                  NESTED\n                    PATH '$.ShippingInstructions.Phone[*]'\n                    COLUMNS (type     VARCHAR2(4000) PATH '$.type',\n                             \"number\" VARCHAR2(4000) PATH '$.number'))\n       ) AS \"JT\";"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/using-json_value-function-based-index-json_exists-queries-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/using-json_value-function-based-index-json_exists-queries.html\nSELECT count(*) FROM j_purchaseorder \n  WHERE json_exists(data, '$.PONumber?(@ > 1500)');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/using-json_value-function-based-index-json_exists-queries-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/using-json_value-function-based-index-json_exists-queries.html\nSELECT count(*) FROM j_purchaseorder \n  WHERE json_exists(data, '$.PONumber?(@ > $d)'\n                    PASSING 1500 AS \"d\");"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/using-json_value-function-based-index-json_exists-queries-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/using-json_value-function-based-index-json_exists-queries.html\nSELECT count(*) FROM j_purchaseorder \n  WHERE json_exists(data, '$.PONumber?(@.number() > $d)'\n                    PASSING 1500 AS \"d\");"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/using-json_value-function-based-index-json_exists-queries-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/using-json_value-function-based-index-json_exists-queries.html\nSELECT count(*) FROM j_purchaseorder\n  WHERE json_exists(data,\n                    '$?(@.PONumber > 1500\n                        && @.Reference == \"ABULL-20140421\")');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/using-json_value-function-based-index-json_table-queries-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/using-json_value-function-based-index-json_table-queries.html\nSELECT jt.*\n  FROM j_purchaseorder po,\n       json_table(po.data, '$'\n         COLUMNS po_number  NUMBER(5) PATH '$.PONumber',\n                 reference  VARCHAR2(30 CHAR) PATH '$.Reference',\n                 requestor  VARCHAR2(32 CHAR) PATH '$.Requestor',\n                 userid     VARCHAR2(10 CHAR) PATH '$.User',\n                 costcenter VARCHAR2(16 CHAR) PATH '$.CostCenter') jt\n  WHERE po_number = 1600;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/using-multivalue-function-based-index-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/using-multivalue-function-based-index.html\nSELECT count(*) FROM parts_tab\n  WHERE json_exists(jparts, '$.parts.subparts?(@.numberOnly() == 730)');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/using-multivalue-function-based-index-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/using-multivalue-function-based-index.html\nSELECT count(*) FROM parts_tab t\n  WHERE json_exists(jparts, '$.parts.subparts?(@.number() == 730)');\nSELECT count(*) FROM parts_tab t\n  WHERE json_exists(jparts, '$.parts.subparts?(@ == 730)');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/using-multivalue-function-based-index-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/using-multivalue-function-based-index.html\nSELECT a FROM parts_tab\n  WHERE json_exists(jparts,'$.parts[*]?(@.partno == 4 &&\n                                        @.subparts == 730)');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/using-multivalue-function-based-index-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/using-multivalue-function-based-index.html\nSELECT a FROM parts_tab\n  WHERE json_exists(jparts,'$.parts[*]?(@.partno == 4 &&\n                                        @.subparts[1] == 730)');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/using-online-redefinition-migrate-json-data-type-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/using-online-redefinition-migrate-json-data-type.html\nEXEC DBMS_REDEFINITION.can_redef_table('table_owner', 'j_purchaseorder');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/using-online-redefinition-migrate-json-data-type-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/using-online-redefinition-migrate-json-data-type.html\nCREATE TABLE j_purchaseorder_new (id VARCHAR2(32),\n                                  date_loaded TIMESTAMP(6) WITH TIME ZONE,\n                                  data JSON);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/using-online-redefinition-migrate-json-data-type-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/using-online-redefinition-migrate-json-data-type.html\nALTER TABLE j_purchaseorder_new ADD (vc_user GENERATED ALWAYS AS\n  (json_value(data, '$.User' RETURNING VARCHAR2(20))));\nALTER TABLE j_purchaseorder_new ADD (vc_costcenter GENERATED ALWAYS AS\n  (json_value(data, '$.CostCenter' RETURNING VARCHAR2(6))));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/using-online-redefinition-migrate-json-data-type-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/using-online-redefinition-migrate-json-data-type.html\nBEGIN\n  DBMS_REDEFINITION.start_redef_table('table_owner',\n                                      'j_purchaseorder',\n                                      'j_purchaseorder_new',\n                                      'ID ID, DATE_LOADED DATE_LOADED, JSON(DATA) PO_DOCUMENT',\n                                      REFRESH_DEP_MVIEWS => 'Y',\n                                      ENABLE_ROLLBACK => FALSE);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/using-online-redefinition-migrate-json-data-type-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/using-online-redefinition-migrate-json-data-type.html\nDECLARE\nn_errors INTEGER;\nBEGIN\n  DBMS_REDEFINITION.copy_table_dependents('table_owner',\n                                          'j_purchaseorder',\n                                          'j_purchaseorder_new',\n                                          NUM_ERRORS => n_errors,\n                                          IGNORE_ERRORS => FALSE);\n  DBMS_OUTPUT.put_line(n_errors);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/using-online-redefinition-migrate-json-data-type-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/using-online-redefinition-migrate-json-data-type.html\nBEGIN\n  DBMS_REDEFINITION.finish_redef_table('table_owner',\n                                       'j_purchaseorder',\n                                       'j_purchaseorder_new',\n                                       DML_LOCK_TIMEOUT => 0);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/using-oracle-data-pump-migrate-json-data-type-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/using-oracle-data-pump-migrate-json-data-type.html\nCREATE TABLE j_purchaseorder_new (id VARCHAR2(32),\n                                  date_loaded TIMESTAMP(6) WITH TIME ZONE,\n                                  data        JSON);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/using-pl-sql-object-types-json-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/using-pl-sql-object-types-json.html\nDECLARE\n  je JSON_ELEMENT_T;\n  jo JSON_OBJECT_T;\nBEGIN\n  je := JSON_ELEMENT_T.parse('{\"name\":\"Radio controlled plane\"}');\n  IF (je.is_Object) THEN\n    jo := treat(je AS JSON_OBJECT_T);\n    jo.put('price', 149.99);\n  END IF;\n  DBMS_OUTPUT.put_line(je.to_string);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/using-pl-sql-object-types-json-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/using-pl-sql-object-types-json.html\nDECLARE\n  jo          JSON_OBJECT_T;\n  ja          JSON_ARRAY_T;\n  keys        JSON_KEY_LIST;\n  keys_string VARCHAR2(100);\nBEGIN\n  ja := new JSON_ARRAY_T;\n  jo := JSON_OBJECT_T.parse('{\"name\":\"Beda\", \n                              \"jobTitle\":\"codmonki\", \n                              \"projects\":[ \"json\", \"xml\" ]}');\n  keys := jo.get_keys;\n  FOR i IN 1..keys.COUNT LOOP\n     ja.append(keys(i));\n  END LOOP;\n  keys_string := ja.to_string;\n  DBMS_OUTPUT.put_line(keys_string);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/using-pl-sql-object-types-json-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/using-pl-sql-object-types-json.html\nCREATE OR REPLACE FUNCTION add_totals(purchaseOrder IN VARCHAR2) RETURN VARCHAR2 IS\n  po_obj        JSON_OBJECT_T;\n  li_arr        JSON_ARRAY_T;\n  li_item       JSON_ELEMENT_T;\n  li_obj        JSON_OBJECT_T;\n  unitPrice     NUMBER;\n  quantity      NUMBER;\n  totalPrice    NUMBER := 0;\n  totalQuantity NUMBER := 0;\nBEGIN\n  po_obj := JSON_OBJECT_T.parse(purchaseOrder);\n  li_arr := po_obj.get_Array('LineItems');\n  FOR i IN 0 .. li_arr.get_size - 1 LOOP\n    li_obj := JSON_OBJECT_T(li_arr.get(i));\n    quantity := li_obj.get_Number('Quantity');\n    unitPrice := li_obj.get_Object('Part').get_Number('UnitPrice');\n    totalPrice := totalPrice + (quantity * unitPrice);\n    totalQuantity := totalQuantity + quantity;\n  END LOOP;\n  po_obj.put('totalQuantity', totalQuantity);\n  po_obj.put('totalPrice', totalPrice);\n  RETURN po_obj.to_string;\nEND;\n/\nSELECT data FROM j_purchaseorder po\n  WHERE po.data.PONumber = 1600;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/using-sql-json-function-json_value-boolean-json-value-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/using-sql-json-function-json_value-boolean-json-value.html\nSELECT json_value(data, '$.AllowPartialShipment')\n  FROM j_purchaseorder;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/using-sql-json-function-json_value-boolean-json-value-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/using-sql-json-function-json_value-boolean-json-value.html\nSELECT json_value(data, '$.AllowPartialShipment'\n                  RETURNING BOOLEAN)\n  FROM j_purchaseorder;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/adjsn/using-sql-json-function-json_value-boolean-json-value-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/adjsn/using-sql-json-function-json_value-boolean-json-value.html\nSELECT json_value(data, '$.AllowPartialShipment'\n                  RETURNING NUMBER\n                  ALLOW BOOLEAN TO NUMBER CONVERSION)\n  FROM j_purchaseorder;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/ALTER-FUNCTION-statement-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/ALTER-FUNCTION-statement.html\nALTER FUNCTION oe.get_bal COMPILE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/ALTER-LIBRARY-statement-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/ALTER-LIBRARY-statement.html\nALTER LIBRARY IF EXISTS hr.my_ext_lib COMPILE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/ALTER-PACKAGE-statement-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/ALTER-PACKAGE-statement.html\nALTER PACKAGE emp_mgmt COMPILE PACKAGE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/ALTER-PACKAGE-statement-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/ALTER-PACKAGE-statement.html\nALTER PACKAGE hr.emp_mgmt COMPILE BODY;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/ALTER-PROCEDURE-statement-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/ALTER-PROCEDURE-statement.html\nALTER PROCEDURE IF EXISTS hr.remove_emp COMPILE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/ALTER-TRIGGER-statement-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/ALTER-TRIGGER-statement.html\nALTER TRIGGER update_job_history DISABLE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/ALTER-TRIGGER-statement-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/ALTER-TRIGGER-statement.html\nALTER TRIGGER update_job_history ENABLE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/ALTER-TYPE-statement-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/ALTER-TYPE-statement.html\nSELECT Version# \nFROM DBA_TYPE_VERSIONS\nWHERE Owner = schema\nAND Name = 'type_name'\nAND Type = 'TYPE'"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/ALTER-TYPE-statement-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/ALTER-TYPE-statement.html\nALTER TYPE data_typ1 \n   ADD MEMBER FUNCTION qtr(der_qtr DATE) \n   RETURN CHAR CASCADE;\nCREATE OR REPLACE TYPE BODY data_typ1 IS \n  MEMBER FUNCTION prod (invent NUMBER) RETURN NUMBER IS \n  BEGIN \n  RETURN (year + invent); \n  END; \n     MEMBER FUNCTION qtr(der_qtr DATE) RETURN CHAR IS \n     BEGIN \n       IF (der_qtr < TO_DATE('01-APR', 'DD-MON')) THEN \n         RETURN 'FIRST'; \n       ELSIF (der_qtr < TO_DATE('01-JUL', 'DD-MON')) THEN \n         RETURN 'SECOND'; \n       ELSIF (der_qtr < TO_DATE('01-OCT', 'DD-MON')) THEN \n         RETURN 'THIRD'; \n       ELSE \n         RETURN 'FOURTH'; \n       END IF; \n     END; \n   END;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/ALTER-TYPE-statement-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/ALTER-TYPE-statement.html\ncreate type Usr.My_ADT authid Definer is object(a1 number)\n\n-- Show version number of ADT:\nselect Version#||Chr(10)||Text t\nfrom DBA_Type_Versions\nwhere Owner = 'USR'\nand Type_Name = 'MY_ADT'\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/ALTER-TYPE-statement-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/ALTER-TYPE-statement.html\ntype     My_ADT authid Definer is object(a1 number)\n\nselect Version#||Chr(10)||Text t\nfrom DBA_Type_Versions\nwhere Owner = 'USR'\nand Type_Name = 'MY_ADT'\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/ALTER-TYPE-statement-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/ALTER-TYPE-statement.html\ntype     My_ADT authid Definer is object(a1 number)\n\ntype     My_ADT authid Definer is object(a1 number)\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/ALTER-TYPE-statement-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/ALTER-TYPE-statement.html\nselect Version#||Chr(10)||Text t\nfrom DBA_Type_Versions\nwhere Owner = 'USR'\nand Type_Name = 'MY_ADT'\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/ALTER-TYPE-statement-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/ALTER-TYPE-statement.html\ntype     My_ADT authid Definer is object(a1 number)\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/ALTER-TYPE-statement-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/ALTER-TYPE-statement.html\nCREATE TABLE text (\n   doc_id       NUMBER,\n   description  textdoc_tab)\n   NESTED TABLE description STORE AS text_store;\nALTER TYPE textdoc_typ \n   ADD ATTRIBUTE (author VARCHAR2) CASCADE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/ALTER-TYPE-statement-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/ALTER-TYPE-statement.html\nALTER TYPE phone_list_typ_demo\n  MODIFY LIMIT 10 CASCADE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/ALTER-TYPE-statement-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/ALTER-TYPE-statement.html\nALTER TYPE phone_list_typ\n  MODIFY ELEMENT TYPE VARCHAR(64) CASCADE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/ALTER-TYPE-statement-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/ALTER-TYPE-statement.html\nALTER TYPE cust_address_typ2 COMPILE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/ALTER-TYPE-statement-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/ALTER-TYPE-statement.html\nCREATE TYPE link1 AS OBJECT\n  (a NUMBER); \n/\nCREATE TYPE link2 AS OBJECT\n  (a NUMBER, \n   b link1, \n   MEMBER FUNCTION p(c1 NUMBER) RETURN NUMBER); \n/\nCREATE TYPE BODY link2 AS\n   MEMBER FUNCTION p(c1 NUMBER) RETURN NUMBER IS \n      BEGIN  \n         dbms_output.put_line(c1);\n         RETURN c1; \n      END; \n   END; \n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/ALTER-TYPE-statement-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/ALTER-TYPE-statement.html\nALTER TYPE link1 ADD ATTRIBUTE (b NUMBER) INVALIDATE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/ALTER-TYPE-statement-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/ALTER-TYPE-statement.html\nALTER TYPE link2 COMPILE SPECIFICATION;\nALTER TYPE link2 COMPILE BODY;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/ALTER-TYPE-statement-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/ALTER-TYPE-statement.html\nALTER TYPE link2 COMPILE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/CONTINUE-statement-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/CONTINUE-statement.html\nDECLARE\n  x NUMBER := 0;\nBEGIN\n  LOOP -- After CONTINUE statement, control resumes here\n    DBMS_OUTPUT.PUT_LINE ('Inside loop:  x = ' || TO_CHAR(x));\n    x := x + 1;\n    IF x < 3 THEN\n      CONTINUE;\n    END IF;\n    DBMS_OUTPUT.PUT_LINE\n      ('Inside loop, after CONTINUE:  x = ' || TO_CHAR(x));\n    EXIT WHEN x = 5;\n  END LOOP;\n\n  DBMS_OUTPUT.PUT_LINE (' After loop:  x = ' || TO_CHAR(x));\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/CONTINUE-statement-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/CONTINUE-statement.html\nDECLARE\n  x NUMBER := 0;\nBEGIN\n  LOOP -- After CONTINUE statement, control resumes here\n    DBMS_OUTPUT.PUT_LINE ('Inside loop:  x = ' || TO_CHAR(x));\n    x := x + 1;\n    CONTINUE WHEN x < 3;\n    DBMS_OUTPUT.PUT_LINE\n      ('Inside loop, after CONTINUE:  x = ' || TO_CHAR(x));\n    EXIT WHEN x = 5;\n  END LOOP;\n  DBMS_OUTPUT.PUT_LINE (' After loop:  x = ' || TO_CHAR(x));\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/COVERAGE-pragma-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/COVERAGE-pragma.html\nCREATE OR REPLACE PROCEDURE outer IS\n   PRAGMA COVERAGE ('NOT_FEASIBLE_START');\n   x NUMBER := 7;\n   PROCEDURE inner IS\n   BEGIN\n     IF x < 6 THEN\n        x := 19;\n     ELSE\n        PRAGMA COVERAGE ('NOT_FEASIBLE'); -- 1\n        x := 203;\n     END IF;\n   END;\nBEGIN\n   DBMS_OUTPUT.PUT_LINE ('X= ');\n   PRAGMA COVERAGE ('NOT_FEASIBLE_END');\n   DBMS_OUTPUT.PUT_LINE (x);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/CREATE-FUNCTION-statement-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/CREATE-FUNCTION-statement.html\nCREATE FUNCTION IF NOT EXISTS get_bal(acc_no IN NUMBER) \n   RETURN NUMBER \n   IS acc_bal NUMBER(11,2);\n   BEGIN \n      SELECT order_total \n      INTO acc_bal \n      FROM orders \n      WHERE customer_id = acc_no; \n      RETURN(acc_bal); \n    END;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/CREATE-FUNCTION-statement-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/CREATE-FUNCTION-statement.html\nSELECT get_bal(165) FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/CREATE-FUNCTION-statement-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/CREATE-FUNCTION-statement.html\nCREATE FUNCTION SecondMax (input NUMBER) RETURN NUMBER\n    PARALLEL_ENABLE AGGREGATE USING SecondMaxImpl;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/CREATE-FUNCTION-statement-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/CREATE-FUNCTION-statement.html\nSELECT SecondMax(salary) \"SecondMax\", department_id\n      FROM employees\n      GROUP BY department_id\n      HAVING SecondMax(salary) > 9000\n      ORDER BY \"SecondMax\", department_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/CREATE-FUNCTION-statement-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/CREATE-FUNCTION-statement.html\nCREATE OR REPLACE FUNCTION text_length(a CLOB) \n   RETURN NUMBER DETERMINISTIC IS\nBEGIN \n  RETURN DBMS_LOB.GETLENGTH(a);\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/CREATE-FUNCTION-statement-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/CREATE-FUNCTION-statement.html\nCREATE OR REPLACE FUNCTION hello_inline(\n  \"who\" VARCHAR2\n) RETURN VARCHAR2\nAS MLE LANGUAGE JAVASCRIPT\n{{\n  return `Hello, ${who}`;\n}};\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/CREATE-FUNCTION-statement-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/CREATE-FUNCTION-statement.html\nBEGIN\n  DBMS_OUTPUT.PUT_LINE(hello_inline('Jane'));\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/CREATE-FUNCTION-statement-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/CREATE-FUNCTION-statement.html\nCREATE OR REPLACE MLE MODULE hello_mod\nLANGUAGE JAVASCRIPT AS \n  export function hello(who){\n    return `Hello, ${who}`;\n  }\n/\nCREATE OR REPLACE FUNCTION hello(\n  \"p_who\" VARCHAR2\n) RETURN VARCHAR2\nAS MLE MODULE hello_mod\nSIGNATURE 'hello';\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/CREATE-FUNCTION-statement-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/CREATE-FUNCTION-statement.html\nBEGIN\n  DBMS_OUTPUT.PUT_LINE(hello('Emma'));\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/CREATE-LIBRARY-statement-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/CREATE-LIBRARY-statement.html\nCREATE LIBRARY IF NOT EXISTS ext_lib AS 'ddl_1' IN ddl_dir;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/CREATE-LIBRARY-statement-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/CREATE-LIBRARY-statement.html\nCREATE OR REPLACE LIBRARY ext_lib AS 'ddl_1' IN ddl_dir CREDENTIAL ddl_cred;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/CREATE-LIBRARY-statement-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/CREATE-LIBRARY-statement.html\nCREATE LIBRARY ext_lib AS '/OR/lib/ext_lib.so';\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/CREATE-LIBRARY-statement-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/CREATE-LIBRARY-statement.html\nCREATE OR REPLACE LIBRARY ext_lib IS '/OR/newlib/ext_lib.so';\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/CREATE-LIBRARY-statement-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/CREATE-LIBRARY-statement.html\nCREATE LIBRARY app_lib as '${ORACLE_HOME}/lib/app_lib.so'\n   AGENT 'sales.hq.example.com';\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/CREATE-PACKAGE-BODY-statement-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/CREATE-PACKAGE-BODY-statement.html\nCREATE OR REPLACE PACKAGE BODY emp_mgmt AS \n   tot_emps NUMBER; \n   tot_depts NUMBER; \nFUNCTION hire \n   (last_name VARCHAR2, job_id VARCHAR2, \n    manager_id NUMBER, salary NUMBER, \n    commission_pct NUMBER, department_id NUMBER) \n   RETURN NUMBER IS new_empno NUMBER; \nBEGIN \n   SELECT employees_seq.NEXTVAL \n      INTO new_empno \n      FROM DUAL; \n   INSERT INTO employees \n      VALUES (new_empno, 'First', 'Last','first.example@example.com',\n              '(415)555-0100',\n              TO_DATE('18-JUN-2002','DD-MON-YYYY'),\n              'IT_PROG',90000000,00, 100,110);\n      tot_emps := tot_emps + 1; \n   RETURN(new_empno); \nEND; \nFUNCTION create_dept(department_id NUMBER, location_id NUMBER) \n   RETURN NUMBER IS \n      new_deptno NUMBER; \n   BEGIN \n      SELECT departments_seq.NEXTVAL \n         INTO new_deptno \n         FROM dual; \n      INSERT INTO departments \n         VALUES (new_deptno, 'department name', 100, 1700); \n      tot_depts := tot_depts + 1; \n      RETURN(new_deptno); \n   END; \nPROCEDURE remove_emp (employee_id NUMBER) IS \n   BEGIN \n      DELETE FROM employees \n      WHERE employees.employee_id = remove_emp.employee_id; \n      tot_emps := tot_emps - 1; \n   END; \nPROCEDURE remove_dept(department_id NUMBER) IS \n   BEGIN \n      DELETE FROM departments \n      WHERE departments.department_id = remove_dept.department_id; \n      tot_depts := tot_depts - 1; \n      SELECT COUNT(*) INTO tot_emps FROM employees; \n   END; \nPROCEDURE increase_sal(employee_id NUMBER, salary_incr NUMBER) IS \n   curr_sal NUMBER; \n   BEGIN \n      SELECT salary INTO curr_sal FROM employees \n      WHERE employees.employee_id = increase_sal.employee_id; \n      IF curr_sal IS NULL \n         THEN RAISE no_sal; \n      ELSE \n         UPDATE employees \n         SET salary = salary + salary_incr \n         WHERE employee_id = employee_id; \n      END IF; \n   END; \nPROCEDURE increase_comm(employee_id NUMBER, comm_incr NUMBER) IS \n   curr_comm NUMBER; \n   BEGIN \n      SELECT commission_pct \n      INTO curr_comm \n      FROM employees \n      WHERE employees.employee_id = increase_comm.employee_id; \n      IF curr_comm IS NULL \n         THEN RAISE no_comm; \n      ELSE \n         UPDATE employees \n         SET commission_pct = commission_pct + comm_incr; \n      END IF; \n   END; \nEND emp_mgmt;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/CREATE-PACKAGE-statement-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/CREATE-PACKAGE-statement.html\nCREATE PACKAGE IF NOT EXISTS emp_mgmt AS \n   FUNCTION hire (last_name VARCHAR2, job_id VARCHAR2, \n      manager_id NUMBER, salary NUMBER, \n      commission_pct NUMBER, department_id NUMBER) \n      RETURN NUMBER; \n   FUNCTION create_dept(department_id NUMBER, location_id NUMBER) \n      RETURN NUMBER; \n   PROCEDURE remove_emp(employee_id NUMBER); \n   PROCEDURE remove_dept(department_id NUMBER); \n   PROCEDURE increase_sal(employee_id NUMBER, salary_incr NUMBER); \n   PROCEDURE increase_comm(employee_id NUMBER, comm_incr NUMBER); \n   no_comm EXCEPTION; \n   no_sal EXCEPTION; \nEND emp_mgmt;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/CREATE-PROCEDURE-statement-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/CREATE-PROCEDURE-statement.html\nCREATE PROCEDURE IF NOT EXISTS remove_emp (employee_id NUMBER) AS\n   tot_emps NUMBER;\n   BEGIN\n      DELETE FROM employees\n      WHERE employees.employee_id = remove_emp.employee_id;\n   tot_emps := tot_emps - 1;\n   END;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/CREATE-PROCEDURE-statement-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/CREATE-PROCEDURE-statement.html\nCREATE PROCEDURE find_root\n   ( x IN REAL ) \n   IS LANGUAGE C\n      NAME c_find_root\n      LIBRARY c_utils\n      PARAMETERS ( x BY REFERENCE );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/CREATE-PROCEDURE-statement-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/CREATE-PROCEDURE-statement.html\nCREATE OR REPLACE PROCEDURE hello_inline(\n  \"who\" VARCHAR2\n)\nAS MLE LANGUAGE JAVASCRIPT\n{{\n  console.log(`Hello, ${who}`);\n}};\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/CREATE-PROCEDURE-statement-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/CREATE-PROCEDURE-statement.html\nEXEC hello_inline('Angela');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/CREATE-PROCEDURE-statement-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/CREATE-PROCEDURE-statement.html\nCREATE OR REPLACE MLE MODULE hello_mod\nLANGUAGE JAVASCRIPT AS \n  export function hello(who){\n    console.log(`Hello, ${who}`);\n  }\n/\nCREATE OR REPLACE PROCEDURE hello(\n  \"p_who\" VARCHAR2\n)\nAS MLE MODULE hello_mod\nSIGNATURE 'hello';\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/CREATE-PROCEDURE-statement-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/CREATE-PROCEDURE-statement.html\nEXEC hello('Chris');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/CREATE-TYPE-statement-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/CREATE-TYPE-statement.html\nCREATE TYPE customer_typ_demo AS OBJECT\n    ( customer_id        NUMBER(6)\n    , cust_first_name    VARCHAR2(20)\n    , cust_last_name     VARCHAR2(20)\n    , cust_address       CUST_ADDRESS_TYP\n    , phone_numbers      PHONE_LIST_TYP\n    , nls_language       VARCHAR2(3)\n    , nls_territory      VARCHAR2(30)\n    , credit_limit       NUMBER(9,2)\n    , cust_email         VARCHAR2(30)\n    , cust_orders        ORDER_LIST_TYP\n    ) ;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/CREATE-TYPE-statement-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/CREATE-TYPE-statement.html\nCREATE TYPE data_typ1 AS OBJECT \n   ( year NUMBER, \n     MEMBER FUNCTION prod(invent NUMBER) RETURN NUMBER \n   ); \n/\nCREATE TYPE BODY data_typ1 IS   \n      MEMBER FUNCTION prod (invent NUMBER) RETURN NUMBER IS \n         BEGIN \n             RETURN (year + invent);\n         END; \n      END;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/CREATE-TYPE-statement-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/CREATE-TYPE-statement.html\nCREATE TYPE demo_typ1 AS OBJECT (a1 NUMBER, a2 NUMBER);\n/\nCREATE TABLE demo_tab1 (b1 NUMBER, b2 demo_typ1);\nINSERT INTO demo_tab1 VALUES (1, demo_typ1(2,3));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/CREATE-TYPE-statement-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/CREATE-TYPE-statement.html\nCREATE TYPE demo_typ2 AS OBJECT (a1 NUMBER, \n   MEMBER FUNCTION get_square RETURN NUMBER);\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/CREATE-TYPE-statement-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/CREATE-TYPE-statement.html\nCREATE TABLE demo_tab2(col demo_typ2);\nINSERT INTO demo_tab2 VALUES (demo_typ2(2));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/CREATE-TYPE-statement-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/CREATE-TYPE-statement.html\nCREATE TYPE BODY demo_typ2 IS\n   MEMBER FUNCTION get_square\n   RETURN NUMBER\n   IS x NUMBER;\n   BEGIN\n      SELECT c.col.a1*c.col.a1 INTO x\n      FROM demo_tab2 c;\n      RETURN (x);\n   END;\nEND;\n/\nSELECT t.col.get_square() FROM demo_tab2 t;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/CREATE-TYPE-statement-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/CREATE-TYPE-statement.html\nCREATE OR REPLACE TYPE department_t AS OBJECT (\n   deptno number(10),\n   dname CHAR(30));\n/\nCREATE OR REPLACE TYPE employee_t AS OBJECT(\n   empid RAW(16),\n   ename CHAR(31),\n   dept REF department_t,\n      STATIC function construct_emp\n      (name VARCHAR2, dept REF department_t)\n      RETURN employee_t\n);\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/CREATE-TYPE-statement-16.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/CREATE-TYPE-statement.html\nCREATE OR REPLACE TYPE BODY employee_t IS\n   STATIC FUNCTION construct_emp\n   (name varchar2, dept REF department_t)\n   RETURN employee_t IS\n      BEGIN\n         return employee_t(SYS_GUID(),name,dept);\n      END;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/CREATE-TYPE-statement-17.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/CREATE-TYPE-statement.html\nCREATE TABLE emptab OF employee_t;\nINSERT INTO emptab\n   VALUES (employee_t.construct_emp('John Smith', NULL));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/CREATE-TYPE-statement-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/CREATE-TYPE-statement.html\nCREATE TYPE corporate_customer_typ_demo UNDER customer_typ\n    ( account_mgr_id     NUMBER(6)\n    );\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/CREATE-TYPE-statement-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/CREATE-TYPE-statement.html\nCREATE TYPE person_t AS OBJECT (name VARCHAR2(100), ssn NUMBER) \n   NOT FINAL;\n/\nCREATE TYPE employee_t UNDER person_t \n   (department_id NUMBER, salary NUMBER) NOT FINAL;\n/\nCREATE TYPE part_time_emp_t UNDER employee_t (num_hrs NUMBER);\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/CREATE-TYPE-statement-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/CREATE-TYPE-statement.html\nCREATE TYPE phone_list_typ_demo AS VARRAY(5) OF VARCHAR2(25);\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/CREATE-TYPE-statement-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/CREATE-TYPE-statement.html\nCREATE TYPE plsint AS OBJECT (I PLS_INTEGER) NOT PERSISTABLE;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/CREATE-TYPE-statement-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/CREATE-TYPE-statement.html\nCREATE TYPE tab_plsint AS TABLE OF (PLS_INTEGER) NOT PERSISTABLE;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/CREATE-TYPE-statement-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/CREATE-TYPE-statement.html\nCREATE TYPE textdoc_typ AS OBJECT\n    ( document_typ      VARCHAR2(32)\n    , formatted_doc     BLOB\n    ) ;\n/\nCREATE TYPE textdoc_tab AS TABLE OF textdoc_typ;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/CREATE-TYPE-statement-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/CREATE-TYPE-statement.html\nCREATE TYPE cust_address_typ2 AS OBJECT\n       ( street_address     VARCHAR2(40)\n       , postal_code        VARCHAR2(10)\n       , city               VARCHAR2(30)\n       , state_province     VARCHAR2(10)\n       , country_id         CHAR(2)\n       , phone              phone_list_typ_demo\n       );\n/\nCREATE TYPE cust_nt_address_typ\n   AS TABLE OF cust_address_typ2;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/DEPRECATE-pragma-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/DEPRECATE-pragma.html\nALTER SESSION SET PLSQL_WARNINGS='ENABLE:(6019,6020,6021,6022)';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/DEPRECATE-pragma-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/DEPRECATE-pragma.html\nCREATE PACKAGE pack1 AS\nPRAGMA DEPRECATE(pack1);\n PROCEDURE foo;\n PROCEDURE bar;\nEND pack1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/DEPRECATE-pragma-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/DEPRECATE-pragma.html\nCREATE PACKAGE trans_data AUTHID DEFINER AS\n   TYPE Transrec IS RECORD (\n     accounttype VARCHAR2(30) ,\n     ownername VARCHAR2(30) ,\n     balance REAL\n   );\n   min_balance constant real := 10.0;\n   PRAGMA DEPRECATE(min_balance , 'Minimum balance requirement has been removed.');\n   insufficient_funds EXCEPTION;\n   PRAGMA DEPRECATE (insufficient_funds , 'Exception no longer raised.');\nEND trans_data;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/DEPRECATE-pragma-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/DEPRECATE-pragma.html\nCREATE PACKAGE pack11 AUTHID DEFINER AS\n $IF DBMS_DB_VERSION.VER_LE_11 \n $THEN\n    PROCEDURE proc1;\n $ELSE\n    PROCEDURE proc1;\n    PRAGMA DEPRECATE(proc1);\n $END\n PROCEDURE proc2;\n PROCEDURE proc3;\nEND pack11;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/DEPRECATE-pragma-18.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/DEPRECATE-pragma.html\nTYPE type15_basetype AS OBJECT \n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/DEPRECATE-pragma-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/DEPRECATE-pragma.html\nCREATE PACKAGE pack5 AUTHID DEFINER AS\nPRAGMA DEPRECATE(pack5 , 'Package pack5 has been deprecated, use new_pack5 instead.');\n PROCEDURE foo;\n PROCEDURE bar;\nEND pack5;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/DEPRECATE-pragma-32.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/DEPRECATE-pragma.html\nCREATE PACKAGE pkg13\nAS\n  PRAGMA DEPRECATE ('pkg13', 'Package pkg13 is deprecated, use pkg03');\n  Y NUMBER;\nEND pkg13;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/DEPRECATE-pragma-34.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/DEPRECATE-pragma.html\nCREATE PACKAGE pkg17\nIS\n  PRAGMA DEPRECATE (\"pkg17\");\nEND pkg17;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/DEPRECATE-pragma-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/DEPRECATE-pragma.html\nCREATE PACKAGE pack7 AUTHID DEFINER AS\n  PROCEDURE foo;\n  PRAGMA DEPRECATE (foo, 'pack7.foo is deprecated, use pack7.bar instead.');\n  PROCEDURE bar;\nEND pack7;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/DEPRECATE-pragma-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/DEPRECATE-pragma.html\nCREATE PACKAGE pack2 AS\n  PROCEDURE proc1(n1 NUMBER, n2 NUMBER, n3 NUMBER);\n  -- Only the overloaded procedure with 2 arguments is deprecated\n  PROCEDURE proc1(n1 NUMBER, n2 NUMBER);\n      PRAGMA DEPRECATE(proc1);\n END pack2;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/DROP-FUNCTION-statement-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/DROP-FUNCTION-statement.html\nDROP FUNCTION IF EXISTS oe.SecondMax;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/DROP-LIBRARY-statement-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/DROP-LIBRARY-statement.html\nDROP LIBRARY IF EXISTS ext_lib;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/DROP-PACKAGE-statement-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/DROP-PACKAGE-statement.html\nDROP PACKAGE emp_mgmt;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/DROP-PROCEDURE-statement-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/DROP-PROCEDURE-statement.html\nDROP PROCEDURE IF EXISTS hr.remove_emp;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/DROP-TRIGGER-statement-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/DROP-TRIGGER-statement.html\nDROP TRIGGER hr.salary_check;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/DROP-TYPE-BODY-statement-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/DROP-TYPE-BODY-statement.html\nDROP TYPE BODY data_typ1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/DROP-TYPE-statement-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/DROP-TYPE-statement.html\nDROP TYPE IF EXISTS person_t FORCE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/EXECUTE-IMMEDIATE-statement-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/EXECUTE-IMMEDIATE-statement.html\nEXECUTE IMMEDIATE 'SELECT S.NEXTVAL FROM DUAL'\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/EXIT-statement-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/EXIT-statement.html\nDECLARE\n  x NUMBER := 0;\nBEGIN\n  LOOP\n    DBMS_OUTPUT.PUT_LINE ('Inside loop:  x = ' || TO_CHAR(x));\n    x := x + 1;\n    IF x > 3 THEN\n      EXIT;\n    END IF;\n  END LOOP;\n  -- After EXIT, control resumes here\n  DBMS_OUTPUT.PUT_LINE(' After loop:  x = ' || TO_CHAR(x));\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/EXIT-statement-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/EXIT-statement.html\nDECLARE\n  x NUMBER := 0;\nBEGIN\n  LOOP\n    DBMS_OUTPUT.PUT_LINE('Inside loop:  x = ' || TO_CHAR(x));\n    x := x + 1;  -- prevents infinite loop\n    EXIT WHEN x > 3;\n  END LOOP;\n  -- After EXIT statement, control resumes here\n  DBMS_OUTPUT.PUT_LINE('After loop:  x = ' || TO_CHAR(x));\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/FOR-LOOP-statement-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/FOR-LOOP-statement.html\nDECLARE\n  v_employees employees%ROWTYPE;\n  CURSOR c1 is SELECT * FROM employees;\nBEGIN\n  OPEN c1;\n  -- Fetch entire row into v_employees record:\n  FOR i IN 1..10 LOOP\n    FETCH c1 INTO v_employees;\n    EXIT WHEN c1%NOTFOUND;\n    -- Process data here\n  END LOOP;\n  CLOSE c1;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/FOR-LOOP-statement-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/FOR-LOOP-statement.html\nDECLARE\n  v_employees employees%ROWTYPE;\n  CURSOR c1 is SELECT * FROM employees;\nBEGIN\n  OPEN c1;\n\n  -- Fetch entire row into v_employees record:\n  <<outer_loop>>\n  FOR i IN 1..10 LOOP\n    -- Process data here\n    FOR j IN 1..10 LOOP\n      FETCH c1 INTO v_employees;\n      EXIT outer_loop WHEN c1%NOTFOUND;\n      -- Process data here\n    END LOOP;\n  END LOOP outer_loop;\n\n  CLOSE c1;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/FOR-LOOP-statement-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/FOR-LOOP-statement.html\nDECLARE\n  v_employees employees%ROWTYPE;\n  CURSOR c1 is SELECT * FROM employees;\nBEGIN\n  OPEN c1;\n\n  -- Fetch entire row into v_employees record:\n  <<outer_loop>>\n  FOR i IN 1..10 LOOP\n    -- Process data here\n    FOR j IN 1..10 LOOP\n      FETCH c1 INTO v_employees;\n      CONTINUE outer_loop WHEN c1%NOTFOUND;\n      -- Process data here\n    END LOOP;\n  END LOOP outer_loop;\n\n  CLOSE c1;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/GOTO-statement-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/GOTO-statement.html\nDECLARE\n  p  VARCHAR2(30);\n  n  PLS_INTEGER := 37;\nBEGIN\n  FOR j in 2..ROUND(SQRT(n)) LOOP\n    IF n MOD j = 0 THEN\n      p := ' is not a prime number';\n      GOTO print_now;\n    END IF;\n  END LOOP;\n\n  p := ' is a prime number';\n\n  <<print_now>>\n  DBMS_OUTPUT.PUT_LINE(TO_CHAR(n) || p);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/GOTO-statement-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/GOTO-statement.html\nDECLARE\n  done  BOOLEAN;\nBEGIN\n  FOR i IN 1..50 LOOP\n    IF done THEN\n      GOTO end_loop;\n    END IF;\n    <<end_loop>>\n    NULL;\n  END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/GOTO-statement-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/GOTO-statement.html\nDECLARE\n  v_last_name  VARCHAR2(25);\n  v_emp_id     NUMBER(6) := 120;\nBEGIN\n  <<get_name>>\n  SELECT last_name INTO v_last_name\n  FROM employees\n  WHERE employee_id = v_emp_id;\n\n  BEGIN\n    DBMS_OUTPUT.PUT_LINE (v_last_name);\n    v_emp_id := v_emp_id + 5;\n\n    IF v_emp_id < 120 THEN\n      GOTO get_name;\n    END IF;\n  END;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/GOTO-statement-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/GOTO-statement.html\nDECLARE\n  valid BOOLEAN := TRUE;\nBEGIN\n  GOTO update_row;\n\n  IF valid THEN\n  <<update_row>>\n    NULL;\n  END IF;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/PIPELINED-clause-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/PIPELINED-clause.html\nSELECT * FROM function_name()"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/SQLERRM-function-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/SQLERRM-function.html\nBEGIN\n  DBMS_OUTPUT.PUT_LINE('SQLERRM(-6511): ' || TO_CHAR(SQLERRM(-6511)));\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/SQLERRM-function-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/SQLERRM-function.html\nBEGIN\n  DBMS_OUTPUT.PUT_LINE('SQLERRM(-50000): ' || TO_CHAR(SQLERRM(-50000)));\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/SQL_MACRO-clause-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/SQL_MACRO-clause.html\nCREATE FUNCTION date_string(dat DATE) \n                    RETURN VARCHAR2 SQL_MACRO(SCALAR) IS\nBEGIN\n   RETURN q'{\n             TO_CHAR(dat, 'YYYY-MM-DD')\n          }';\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/SQL_MACRO-clause-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/SQL_MACRO-clause.html\nVARIABLE surname VARCHAR2(100)\n\nEXEC :surname := 'ellison'\n\nWITH e AS (SELECT emp.*, :surname lname FROM emp WHERE deptno IN (10,20))\nSELECT deptno,\n       emp_doc(first_name => ename, last_name => lname, hire_date => hiredate) doc\nFROM e\nORDER BY ename;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/SQL_MACRO-clause-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/SQL_MACRO-clause.html\nCREATE PACKAGE env AS\n   FUNCTION current_user RETURN VARCHAR2 SQL_MACRO(SCALAR);\n   FUNCTION current_edition_name RETURN VARCHAR2 SQL_MACRO(SCALAR);\n   FUNCTION module RETURN VARCHAR2 SQL_MACRO(SCALAR);\n   FUNCTION action RETURN VARCHAR2 SQL_MACRO(SCALAR);\nEND;\n/\nCREATE PACKAGE BODY env AS\n   FUNCTION current_user RETURN VARCHAR2 SQL_MACRO(SCALAR) IS\n     BEGIN\n        RETURN q'{SYS_CONTEXT('userenv','SESSION_USER')}';\n     END;\n   FUNCTION current_edition_name RETURN VARCHAR2 SQL_MACRO(SCALAR) IS\n     BEGIN\n        RETURN q'{SYS_CONTEXT('userenv','CURRENT_EDITION_NAME')}';\n     END;\n   FUNCTION module RETURN VARCHAR2 SQL_MACRO(SCALAR) IS\n     BEGIN\n        RETURN q'{SYS_CONTEXT('userenv','MODULE')}';\n     END;\n   FUNCTION action RETURN VARCHAR2 SQL_MACRO(SCALAR) IS\n     BEGIN\n        RETURN q'{SYS_CONTEXT('userenv','ACTION')}';\n     END;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/SQL_MACRO-clause-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/SQL_MACRO-clause.html\nSELECT env.current_user, env.module, env.action FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/SQL_MACRO-clause-16.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/SQL_MACRO-clause.html\nCREATE FUNCTION budget(job VARCHAR2) RETURN VARCHAR2 SQL_MACRO IS\nBEGIN\n   RETURN q'{SELECT deptno, SUM(sal) budget \n             FROM scott.emp\n             WHERE job = budget.job\n             GROUP BY deptno}';\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/SQL_MACRO-clause-17.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/SQL_MACRO-clause.html\nSELECT * FROM budget('MANAGER');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/SQL_MACRO-clause-19.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/SQL_MACRO-clause.html\nCREATE FUNCTION take (n NUMBER, t DBMS_TF.table_t) \n                      RETURN VARCHAR2 SQL_MACRO IS\nBEGIN\n   RETURN 'SELECT * FROM t FETCH FIRST take.n ROWS ONLY';\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/SQL_MACRO-clause-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/SQL_MACRO-clause.html\nCREATE FUNCTION name_string(first_name VARCHAR2,\n                                 last_name VARCHAR2)\n                     RETURN VARCHAR2 SQL_MACRO(SCALAR) IS\nBEGIN\n   RETURN q'{\n          TRIM(INITCAP(first_name) || ' ' || INITCAP(last_name))\n          }';\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/SQL_MACRO-clause-20.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/SQL_MACRO-clause.html\nSELECT * FROM take(2, dept);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/SQL_MACRO-clause-22.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/SQL_MACRO-clause.html\nVAR row_count NUMBER\n\nEXEC :row_count := 5\n\nWITH t AS (SELECT * FROM emp NATURAL JOIN dept ORDER BY ename)\nSELECT ename, dname FROM take(:row_count, t);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/SQL_MACRO-clause-24.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/SQL_MACRO-clause.html\nCREATE PACKAGE gen IS \n   FUNCTION range(stop NUMBER)\n            RETURN VARCHAR2 SQL_MACRO(TABLE);\n\n   FUNCTION range(first NUMBER DEFAULT 0, stop NUMBER, step NUMBER DEFAULT 1)\n            RETURN VARCHAR2 SQL_MACRO(TABLE);\n\n   FUNCTION tab(tab TABLE, replication_factor NATURAL)\n            RETURN TABLE PIPELINED ROW POLYMORPHIC USING gen;\n\n   FUNCTION describe(tab IN OUT DBMS_TF.TABLE_T, replication_factor NATURAL)\n            RETURN DBMS_TF.DESCRIBE_T;\n\n   PROCEDURE fetch_rows(replication_factor NATURALN);\nEND gen;\n/\nCREATE PACKAGE BODY gen IS \n   FUNCTION range(stop NUMBER)\n            RETURN VARCHAR2 SQL_MACRO(TABLE) IS\n   BEGIN \n      RETURN q'{SELECT ROWNUM-1 n FROM gen.tab(DUAL, stop)}'; \n   END;\n\n   FUNCTION range(first NUMBER DEFAULT 0, stop NUMBER, step NUMBER DEFAULT 1)\n           RETURN VARCHAR2 SQL_MACRO(TABLE) IS\n   BEGIN\n      RETURN q'{\n             SELECT first+n*step n FROM gen.range(ROUND((stop-first)/NULLIF(step,0)))\n             }';\n   END;\n\n   FUNCTION describe(tab IN OUT DBMS_TF.TABLE_T, replication_factor NATURAL) \n            RETURN DBMS_TF.DESCRIBE_T AS\n   BEGIN \n      RETURN DBMS_TF.DESCRIBE_T(row_replication => true);\n   END;\n\n  PROCEDURE fetch_rows(replication_factor NATURALN) as\n  BEGIN \n    DBMS_TF.ROW_REPLICATION(replication_factor); \n  END;\nEND gen;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/SQL_MACRO-clause-25.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/SQL_MACRO-clause.html\nSELECT * FROM gen.range(5);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/SQL_MACRO-clause-27.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/SQL_MACRO-clause.html\nSELECT * FROM gen.range(5, 10);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/SQL_MACRO-clause-29.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/SQL_MACRO-clause.html\nSELECT * FROM gen.range(0, 1, step=>0.1);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/SQL_MACRO-clause-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/SQL_MACRO-clause.html\nCREATE FUNCTION email_string(first_name VARCHAR2,\n                                  last_name VARCHAR2,\n                                  host_name VARCHAR2 DEFAULT 'example.com')\n                    RETURN VARCHAR2 SQL_MACRO(SCALAR) IS\nBEGIN\n   RETURN q'{\n          REPLACE(LOWER(name_string(first_name, last_name)),' ','.') || '@' || host_name\n          }';\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/SQL_MACRO-clause-31.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/SQL_MACRO-clause.html\nSELECT * FROM gen.range(+5,-6,-2);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/SQL_MACRO-clause-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/SQL_MACRO-clause.html\nCREATE FUNCTION emp_json(first_name VARCHAR2 DEFAULT NULL,\n                              last_name VARCHAR2 DEFAULT NULL,\n                              hire_date DATE DEFAULT NULL,\n                              phone_num VARCHAR2 DEFAULT NULL)\n                    RETURN VARCHAR2 SQL_MACRO(SCALAR) IS\nBEGIN\n   RETURN q'{\n          JSON_OBJECT(\n             'name'      : name_string(first_name, last_name),\n             'email'     : email_string(first_name, last_name),\n             'phone'     : phone_num,\n             'hire_date' : date_string(hire_date)\n             ABSENT ON NULL)\n          }';\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/SQL_MACRO-clause-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/SQL_MACRO-clause.html\nCREATE FUNCTION emp_xml(first_name VARCHAR2 DEFAULT NULL,\n                             last_name VARCHAR2 DEFAULT NULL,\n                             hire_date DATE DEFAULT NULL,\n                             phone_num VARCHAR2 DEFAULT NULL)\n                    RETURN VARCHAR2 SQL_MACRO(SCALAR) IS\nBEGIN\n   RETURN q'{\n       XMLELEMENT(\"xml\",\n                  CASE WHEN first_name || last_name IS NOT NULL THEN\n                     XMLELEMENT(\"name\", name_string(first_name, last_name))\n                  END,\n                  CASE WHEN first_name || last_name IS NOT NULL THEN\n                     XMLELEMENT(\"email\", email_string(first_name, last_name))\n                  END,\n                  CASE WHEN hire_date IS NOT NULL THEN\n                     XMLELEMENT(\"hire_date\", date_string(hire_date))\n                  END,\n                  CASE WHEN phone_num IS NOT NULL THEN\n                     XMLELEMENT(\"phone\", phone_num)\n                  END)\n           }';\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/SQL_MACRO-clause-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/SQL_MACRO-clause.html\nCREATE FUNCTION emp_doc(first_name VARCHAR2 DEFAULT NULL,\n                             last_name VARCHAR2 DEFAULT NULL,\n                             hire_date DATE DEFAULT NULL,\n                             phone_num VARCHAR2 DEFAULT NULL,\n                             doc_type VARCHAR2 DEFAULT 'json')\n                    RETURN VARCHAR2 SQL_MACRO(SCALAR) IS\nBEGIN\n   RETURN q'{\n     DECODE(LOWER(doc_type),\n            'json', emp_json(first_name, last_name, hire_date, phone_num),\n            'xml', emp_xml(first_name, last_name, hire_date, phone_num))\n         }';\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/SQL_MACRO-clause-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/SQL_MACRO-clause.html\nSELECT department_id,\n            emp_doc(first_name => e.first_name, hire_date => e.hire_date) doc\nFROM hr.employees e\nWHERE department_id = 30\nORDER BY last_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/SQL_MACRO-clause-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/SQL_MACRO-clause.html\nSELECT deptno,\n            emp_doc(first_name => ename, hire_date => hiredate, doc_type => 'xml') doc\nFROM scott.emp\nORDER BY ename;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/Supresses-warning-pragma-6009-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/Supresses-warning-pragma-6009.html\nALTER SESSION SET PLSQL_WARNINGS='ENABLE:(6009)';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/Supresses-warning-pragma-6009-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/Supresses-warning-pragma-6009.html\nCREATE PROCEDURE p1\nAUTHID DEFINER\nIS\n    PRAGMA SUPPRESSES_WARNING_6009(p1);\nBEGIN\n    RAISE_APPLICATION_ERROR(-20000, 'Unexpected error raised');\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/Supresses-warning-pragma-6009-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/Supresses-warning-pragma-6009.html\nCREATE OR REPLACE TYPE newid AUTHID DEFINER\nAS OBJECT(\n  ID1 NUMBER,\n  MEMBER PROCEDURE incr,\n  MEMBER PROCEDURE log_error,\n  PRAGMA SUPPRESSES_WARNING_6009(log_error)\n);\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/Supresses-warning-pragma-6009-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/Supresses-warning-pragma-6009.html\nCREATE OR REPLACE TYPE BODY newid\nAS\n  MEMBER PROCEDURE incr\n  IS\n  BEGIN\n     DBMS_OUTPUT.PUT_LINE('Computing value');\n  EXCEPTION\n     WHEN OTHERS THEN\n        log_error;\n  END;\n\n  MEMBER PROCEDURE log_error\n  IS\n  BEGIN\n    RAISE_APPLICATION_ERROR(-20000, 'Unexpected error');\n  END;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/Supresses-warning-pragma-6009-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/Supresses-warning-pragma-6009.html\nCREATE PROCEDURE p2\nAUTHID DEFINER\nIS\nBEGIN\n  DBMS_OUTPUT.PUT_LINE('In procedure p2');\nEXCEPTION\n  WHEN OTHERS THEN\n    p1;                \nEND p2;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/Supresses-warning-pragma-6009-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/Supresses-warning-pragma-6009.html\nCREATE FUNCTION f1(id NUMBER) RETURN NUMBER\nAUTHID DEFINER\nIS\n  PRAGMA SUPPRESSES_WARNING_6009(f1);\n  x NUMBER;\nBEGIN\n  x := id + 1;\nRETURN x;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/Supresses-warning-pragma-6009-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/Supresses-warning-pragma-6009.html\nCREATE FUNCTION f2(numval NUMBER) RETURN NUMBER\nAUTHID DEFINER\nIS\n  i NUMBER;\nBEGIN\n  i := numval + 1;\n  RETURN i;\nEXCEPTION\n  WHEN OTHERS THEN\n    RETURN f1(i);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/Supresses-warning-pragma-6009-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/Supresses-warning-pragma-6009.html\nCREATE PACKAGE pk1 IS\n   PROCEDURE p1(x NUMBER);\n   PROCEDURE p1;\n   PRAGMA SUPPRESSES_WARNING_6009(p1);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/Supresses-warning-pragma-6009-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/Supresses-warning-pragma-6009.html\nCREATE OR REPLACE PACKAGE BODY pk1 IS\n   PROCEDURE p1(x NUMBER) IS\n   BEGIN\n      DBMS_OUTPUT.PUT_LINE('In the first overload');\n   END;\n\n   PROCEDURE p1 IS\n   BEGIN\n      DBMS_OUTPUT.PUT_LINE('In the second overload');\n      RAISE_APPLICATION_ERROR(-20000, 'Unexpected error');\n   END;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/Supresses-warning-pragma-6009-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/Supresses-warning-pragma-6009.html\nCREATE OR REPLACE PROCEDURE p6 AUTHID DEFINER IS\nj NUMBER := 5;\nBEGIN\n   j := j + 2;\nEXCEPTION\n   WHEN OTHERS THEN\n       pk1.p1;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/Supresses-warning-pragma-6009-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/Supresses-warning-pragma-6009.html\nCREATE OR REPLACE PACKAGE pk2 IS\n   PROCEDURE p5;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/Supresses-warning-pragma-6009-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/Supresses-warning-pragma-6009.html\nCREATE OR REPLACE PACKAGE BODY pk2 IS\n   PROCEDURE pn; /* Forward declaration */\n   PRAGMA SUPPRESSES_WARNING_6009(pn);\n\n   PROCEDURE p5 IS\n   BEGIN\n      DBMS_OUTPUT.PUT_LINE('Computing');\n   EXCEPTION \n      WHEN OTHERS THEN\n         pn;\n   END;\n\n   PROCEDURE pn IS\n   BEGIN\n      RAISE_APPLICATION_ERROR(-20000, 'Unexpected error');\n   END;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/WHILE-LOOP-statement-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/WHILE-LOOP-statement.html\nDECLARE\n  done  BOOLEAN := FALSE;\nBEGIN\n  WHILE done LOOP\n    DBMS_OUTPUT.PUT_LINE ('This line does not print.');\n    done := TRUE;  -- This assignment is not made.\n  END LOOP;\n\n  WHILE NOT done LOOP\n    DBMS_OUTPUT.PUT_LINE ('Hello, world!');\n    done := TRUE;\n  END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/assigning-values-collection-variables-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/assigning-values-collection-variables.html\nDECLARE\n  TYPE triplet IS VARRAY(3) OF VARCHAR2(15);\n  TYPE trio    IS VARRAY(3) OF VARCHAR2(15);\n\n  group1 triplet := triplet('Jones', 'Wong', 'Marceau');\n  group2 triplet;\n  group3 trio;\nBEGIN\n  group2 := group1;  -- succeeds\n  group3 := group1;  -- fails\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/assigning-values-collection-variables-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/assigning-values-collection-variables.html\nDECLARE\n  TYPE dnames_tab IS TABLE OF VARCHAR2(30);\n\n  dept_names dnames_tab := dnames_tab(\n    'Shipping','Sales','Finance','Payroll');  -- Initialized to non-null value\n\n  empty_set dnames_tab;  -- Not initialized, therefore null\n\n  PROCEDURE print_dept_names_status IS\n  BEGIN\n    IF dept_names IS NULL THEN\n      DBMS_OUTPUT.PUT_LINE('dept_names is null.');\n    ELSE\n      DBMS_OUTPUT.PUT_LINE('dept_names is not null.');\n    END IF;\n  END  print_dept_names_status;\n\nBEGIN\n  print_dept_names_status;\n  dept_names := empty_set;  -- Assign null collection to dept_names.\n  print_dept_names_status;\n  dept_names := dnames_tab (\n    'Shipping','Sales','Finance','Payroll');  -- Re-initialize dept_names\n  print_dept_names_status;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/assigning-values-collection-variables-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/assigning-values-collection-variables.html\nDECLARE\n  TYPE nested_typ IS TABLE OF NUMBER;\n\n  nt1    nested_typ := nested_typ(1,2,3);\n  nt2    nested_typ := nested_typ(3,2,1);\n  nt3    nested_typ := nested_typ(2,3,1,3);\n  nt4    nested_typ := nested_typ(1,2,4);\n  answer nested_typ;\n\n  PROCEDURE print_nested_table (nt nested_typ) IS\n    output VARCHAR2(128);\n  BEGIN\n    IF nt IS NULL THEN\n      DBMS_OUTPUT.PUT_LINE('Result: null set');\n    ELSIF nt.COUNT = 0 THEN\n      DBMS_OUTPUT.PUT_LINE('Result: empty set');\n    ELSE\n      FOR i IN nt.FIRST .. nt.LAST LOOP  -- For first to last element\n        output := output || nt(i) || ' ';\n      END LOOP;\n      DBMS_OUTPUT.PUT_LINE('Result: ' || output);\n    END IF;\n  END print_nested_table;\n\nBEGIN\n  answer := nt1 MULTISET UNION nt4;\n  print_nested_table(answer);\n  answer := nt1 MULTISET UNION nt3;\n  print_nested_table(answer);\n  answer := nt1 MULTISET UNION DISTINCT nt3;\n  print_nested_table(answer);\n  answer := nt2 MULTISET INTERSECT nt3;\n  print_nested_table(answer);\n  answer := nt2 MULTISET INTERSECT DISTINCT nt3;\n  print_nested_table(answer);\n  answer := SET(nt3);\n  print_nested_table(answer);\n  answer := nt3 MULTISET EXCEPT nt2;\n  print_nested_table(answer);\n  answer := nt3 MULTISET EXCEPT DISTINCT nt2;\n  print_nested_table(answer);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/assigning-values-record-variables-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/assigning-values-record-variables.html\nCREATE PACKAGE pkg IS\n  TYPE rec_t IS RECORD\n   (year PLS_INTEGER := 2,\n    name VARCHAR2 (100) );\nEND;\n/\nDECLARE\n  v_rec1 pkg.rec_t := pkg.rec_t(1847,'ONE EIGHT FOUR SEVEN');\n  v_rec2 pkg.rec_t := pkg.rec_t(year => 1, name => 'ONE');\n  v_rec3 pkg.rec_t := pkg.rec_t(NULL,NULL);\n\nPROCEDURE print_rec ( pi_rec pkg.rec_t := pkg.rec_t(1847+1,  'a'||'b')) IS\n  v_rec1 pkg.rec_t := pkg.rec_t(2847,'TWO EIGHT FOUR SEVEN');\nBEGIN\n  DBMS_OUTPUT.PUT_LINE(NVL(v_rec1.year,0) ||' ' ||NVL(v_rec1.name,'N/A'));\n  DBMS_OUTPUT.PUT_LINE(NVL(pi_rec.year,0) ||' ' ||NVL(pi_rec.name,'N/A'));\nEND;\nBEGIN\n  print_rec(v_rec1);\n  print_rec(v_rec2);\n  print_rec(v_rec3);\n  print_rec();\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/assigning-values-record-variables-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/assigning-values-record-variables.html\nDECLARE\n  TYPE RecordTyp IS RECORD (\n    last employees.last_name%TYPE,\n    id   employees.employee_id%TYPE\n  );\n  rec1 RecordTyp;\nBEGIN\n  SELECT last_name, employee_id INTO rec1\n  FROM employees\n  WHERE job_id = 'AD_PRES';\n\n  DBMS_OUTPUT.PUT_LINE ('Employee #' || rec1.id || ' = ' || rec1.last);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/assigning-values-record-variables-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/assigning-values-record-variables.html\nFETCH cursor INTO record_variable_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/assigning-values-record-variables-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/assigning-values-record-variables.html\nDECLARE\n  TYPE EmpRecTyp IS RECORD (\n    emp_id  employees.employee_id%TYPE,\n    salary  employees.salary%TYPE\n  );\n\n  CURSOR desc_salary RETURN EmpRecTyp IS\n    SELECT employee_id, salary\n    FROM employees\n    ORDER BY salary DESC;\n\n  highest_paid_emp       EmpRecTyp;\n  next_highest_paid_emp  EmpRecTyp;\n\n  FUNCTION nth_highest_salary (n INTEGER) RETURN EmpRecTyp IS\n    emp_rec  EmpRecTyp;\n  BEGIN\n    OPEN desc_salary;\n    FOR i IN 1..n LOOP\n      FETCH desc_salary INTO emp_rec;\n    END LOOP;\n    CLOSE desc_salary;\n    RETURN emp_rec;\n  END nth_highest_salary;\n\nBEGIN\n  highest_paid_emp := nth_highest_salary(1);\n  next_highest_paid_emp := nth_highest_salary(2);\n\n  DBMS_OUTPUT.PUT_LINE(\n    'Highest Paid: #' ||\n    highest_paid_emp.emp_id || ', $' ||\n    highest_paid_emp.salary \n  );\n  DBMS_OUTPUT.PUT_LINE(\n    'Next Highest Paid: #' ||\n    next_highest_paid_emp.emp_id || ', $' ||\n    next_highest_paid_emp.salary\n  );\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/assigning-values-record-variables-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/assigning-values-record-variables.html\nDECLARE\n  TYPE EmpRec IS RECORD (\n    last_name  employees.last_name%TYPE,\n    salary     employees.salary%TYPE\n  );\n  emp_info    EmpRec;\n  old_salary  employees.salary%TYPE;\nBEGIN\n  SELECT salary INTO old_salary\n   FROM employees\n   WHERE employee_id = 100;\n\n  UPDATE employees\n    SET salary = salary * 1.1\n    WHERE employee_id = 100\n    RETURNING last_name, salary INTO emp_info;\n\n  DBMS_OUTPUT.PUT_LINE (\n    'Salary of ' || emp_info.last_name || ' raised from ' ||\n    old_salary || ' to ' || emp_info.salary\n  );\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/assigning-values-record-variables-17.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/assigning-values-record-variables.html\nDECLARE\n  TYPE age_rec IS RECORD (\n    years  INTEGER DEFAULT 35,\n    months INTEGER DEFAULT 6\n  );\n\n  TYPE name_rec IS RECORD (\n    first  employees.first_name%TYPE DEFAULT 'John',\n    last   employees.last_name%TYPE DEFAULT 'Doe',\n    age    age_rec\n  );\n\n  name name_rec;\n\n  PROCEDURE print_name AS\n  BEGIN\n    DBMS_OUTPUT.PUT(NVL(name.first, 'NULL') || ' '); \n    DBMS_OUTPUT.PUT(NVL(name.last,  'NULL') || ', ');\n    DBMS_OUTPUT.PUT(NVL(TO_CHAR(name.age.years), 'NULL') || ' yrs ');\n    DBMS_OUTPUT.PUT_LINE(NVL(TO_CHAR(name.age.months), 'NULL') || ' mos');\n  END;\n\nBEGIN\n  print_name;\n  name := NULL;\n  print_name;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/assigning-values-record-variables-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/assigning-values-record-variables.html\nDECLARE\n  TYPE name_rec IS RECORD (\n    first  employees.first_name%TYPE DEFAULT 'John',\n    last   employees.last_name%TYPE DEFAULT 'Doe'\n  );\n\n  name1 name_rec;\n  name2 name_rec;\n\nBEGIN\n  name1.first := 'Jane'; name1.last := 'Smith'; \n  DBMS_OUTPUT.PUT_LINE('name1: ' || name1.first || ' ' || name1.last);\n  name2 := name1;\n  DBMS_OUTPUT.PUT_LINE('name2: ' || name2.first || ' ' || name2.last); \nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/assigning-values-record-variables-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/assigning-values-record-variables.html\nDECLARE\n  TYPE name_rec IS RECORD (\n    first  employees.first_name%TYPE DEFAULT 'John',\n    last   employees.last_name%TYPE DEFAULT 'Doe'\n  );\n\n  CURSOR c IS\n    SELECT first_name, last_name\n    FROM employees;\n\n  target name_rec;\n  source c%ROWTYPE;\n\nBEGIN\n  source.first_name := 'Jane'; source.last_name := 'Smith';\n\n  DBMS_OUTPUT.PUT_LINE (\n    'source: ' || source.first_name || ' ' || source.last_name\n  );\n\n target := source;\n\n DBMS_OUTPUT.PUT_LINE (\n   'target: ' || target.first || ' ' || target.last\n );\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/assigning-values-record-variables-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/assigning-values-record-variables.html\nDECLARE\n  TYPE name_rec IS RECORD (\n    first  employees.first_name%TYPE,\n    last   employees.last_name%TYPE\n  );\n\n  TYPE phone_rec IS RECORD (\n    name  name_rec,                    -- nested record\n    phone employees.phone_number%TYPE\n  );\n\n  TYPE email_rec IS RECORD (\n    name  name_rec,                    -- nested record\n    email employees.email%TYPE\n  );\n\n  phone_contact phone_rec;\n  email_contact email_rec;\n\nBEGIN\n  phone_contact.name.first := 'John';\n  phone_contact.name.last := 'Smith';\n  phone_contact.phone := '1-650-555-1234';\n\n  email_contact.name := phone_contact.name;\n  email_contact.email := (\n    email_contact.name.first || '.' ||\n    email_contact.name.last  || '@' ||\n    'example.com' \n  );\n\n  DBMS_OUTPUT.PUT_LINE (email_contact.email);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/assigning-values-record-variables-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/assigning-values-record-variables.html\nSELECT select_list INTO record_variable_name FROM table_or_view_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/assigning-values-variables-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/assigning-values-variables.html\nDECLARE  -- You can assign initial values here\n  wages          NUMBER;\n  hours_worked   NUMBER := 40;\n  hourly_salary  NUMBER := 22.50;\n  bonus          NUMBER := 150;\n  country        VARCHAR2(128);\n  counter        NUMBER := 0;\n  done           BOOLEAN;\n  valid_id       BOOLEAN;\n  emp_rec1       employees%ROWTYPE;\n  emp_rec2       employees%ROWTYPE;\n  TYPE commissions IS TABLE OF NUMBER INDEX BY PLS_INTEGER;\n  comm_tab       commissions;\n\nBEGIN  -- You can assign values here too\n  wages := (hours_worked * hourly_salary) + bonus;\n  country := 'France';\n  country := UPPER('Canada');\n  done := (counter > 100);\n  valid_id := TRUE;\n  emp_rec1.first_name := 'Antonio';\n  emp_rec1.last_name := 'Ortiz';\n  emp_rec1 := emp_rec2;\n  comm_tab(5) := 20000 * 0.15;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/assigning-values-variables-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/assigning-values-variables.html\nDECLARE\n  bonus   NUMBER(8,2);\nBEGIN\n  SELECT salary * 0.10 INTO bonus\n  FROM employees\n  WHERE employee_id = 100;\n\n  DBMS_OUTPUT.PUT_LINE('bonus = ' || TO_CHAR(bonus));\nEND;\n\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/assigning-values-variables-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/assigning-values-variables.html\nDECLARE\n  emp_salary  NUMBER(8,2);\n\n  PROCEDURE adjust_salary (\n    emp        NUMBER, \n    sal IN OUT NUMBER,\n    adjustment NUMBER\n  ) IS\n  BEGIN\n    sal := sal + adjustment;\n  END;\n\nBEGIN\n  SELECT salary INTO emp_salary\n  FROM employees\n  WHERE employee_id = 100;\n\n  DBMS_OUTPUT.PUT_LINE\n   ('Before invoking procedure, emp_salary: ' || emp_salary);\n\n  adjust_salary (100, emp_salary, 1000);\n\n  DBMS_OUTPUT.PUT_LINE\n   ('After invoking procedure, emp_salary: ' || emp_salary);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/assigning-values-variables-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/assigning-values-variables.html\nDECLARE\n  done    BOOLEAN;              -- Initial value is NULL by default\n  counter NUMBER := 0;\nBEGIN\n  done := FALSE;                -- Assign literal value\n  WHILE done != TRUE            -- Compare to literal value\n    LOOP\n      counter := counter + 1;\n      done := (counter > 500);  -- Assign value of BOOLEAN expression\n    END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/autonomous-transactions-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/autonomous-transactions.html\nSET TRANSACTION ISOLATION LEVEL SERIALIZABLE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/autonomous-transactions-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/autonomous-transactions.html\nCREATE OR REPLACE PACKAGE emp_actions AUTHID DEFINER AS  -- package specification\n  FUNCTION raise_salary (emp_id NUMBER, sal_raise NUMBER)\n  RETURN NUMBER;\nEND emp_actions;\n/\nCREATE OR REPLACE PACKAGE BODY emp_actions AS  -- package body\n  -- code for function raise_salary\n  FUNCTION raise_salary (emp_id NUMBER, sal_raise NUMBER)\n  RETURN NUMBER IS\n    PRAGMA AUTONOMOUS_TRANSACTION;\n    new_sal NUMBER(8,2);\n  BEGIN\n    UPDATE employees SET salary =\n      salary + sal_raise WHERE employee_id = emp_id;\n    COMMIT;\n    SELECT salary INTO new_sal FROM employees\n      WHERE employee_id = emp_id;\n    RETURN new_sal;\n  END raise_salary;\nEND emp_actions;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/autonomous-transactions-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/autonomous-transactions.html\nCREATE OR REPLACE PROCEDURE lower_salary\n  (emp_id NUMBER, amount NUMBER)\nAUTHID DEFINER AS\n  PRAGMA AUTONOMOUS_TRANSACTION;\nBEGIN\n  UPDATE employees\n  SET salary =  salary - amount\n  WHERE employee_id = emp_id;\n\n  COMMIT;\nEND lower_salary;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/autonomous-transactions-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/autonomous-transactions.html\nDROP TABLE emp;\nCREATE TABLE emp AS SELECT * FROM employees;\nDECLARE\n  PRAGMA AUTONOMOUS_TRANSACTION;\n  emp_id NUMBER(6)   := 200;\n  amount NUMBER(6,2) := 200;\nBEGIN\n  UPDATE employees\n  SET salary =  salary - amount\n  WHERE employee_id = emp_id;\n\n  COMMIT;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/autonomous-transactions-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/autonomous-transactions.html\nDROP TABLE emp;\nCREATE TABLE emp AS SELECT * FROM employees;\nDROP TABLE log;\nCREATE TABLE log (\n  log_id   NUMBER(6),\n  up_date  DATE,\n  new_sal  NUMBER(8,2),\n  old_sal  NUMBER(8,2)\n);\nCREATE OR REPLACE TRIGGER log_sal\n  BEFORE UPDATE OF salary ON emp FOR EACH ROW\nDECLARE\n  PRAGMA AUTONOMOUS_TRANSACTION;\nBEGIN\n  INSERT INTO log (\n    log_id,\n    up_date,\n    new_sal,\n    old_sal\n  )\n  VALUES (\n    :old.employee_id,\n    SYSDATE,\n    :new.salary,\n    :old.salary\n  );\n  COMMIT;\nEND;\n/\nUPDATE emp\nSET salary = salary * 1.05\nWHERE employee_id = 115;\nCOMMIT;\nUPDATE emp\nSET salary = salary * 1.05\nWHERE employee_id = 116;\nROLLBACK;\nSELECT * FROM log\nWHERE log_id = 115 OR log_id = 116;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/autonomous-transactions-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/autonomous-transactions.html\nDROP TABLE temp;\nCREATE TABLE temp (\n  temp_id NUMBER(6),\n  up_date DATE\n);\nCREATE OR REPLACE TRIGGER drop_temp_table\n  AFTER INSERT ON log\nDECLARE \n  PRAGMA AUTONOMOUS_TRANSACTION;\nBEGIN\n  EXECUTE IMMEDIATE 'DROP TABLE temp';\n  COMMIT;\nEND;\n/\nSELECT * FROM temp;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/autonomous-transactions-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/autonomous-transactions.html\nINSERT INTO log (log_id, up_date, new_sal, old_sal)\nVALUES (999, SYSDATE, 5000, 4500);\nSELECT * FROM temp;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/autonomous-transactions-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/autonomous-transactions.html\nDROP TABLE debug_output;\nCREATE TABLE debug_output (message VARCHAR2(200));\nCREATE OR REPLACE PACKAGE debugging AUTHID DEFINER AS\n  FUNCTION log_msg (msg VARCHAR2) RETURN VARCHAR2;\nEND debugging;\n/\nCREATE OR REPLACE PACKAGE BODY debugging AS\n  FUNCTION log_msg (msg VARCHAR2) RETURN VARCHAR2 IS\n    PRAGMA AUTONOMOUS_TRANSACTION;\n  BEGIN\n    INSERT INTO debug_output (message) VALUES (msg);\n    COMMIT;\n    RETURN msg;\n  END;\nEND debugging;\n/\nDECLARE\n  my_emp_id    NUMBER(6);\n  my_last_name VARCHAR2(25);\n  my_count     NUMBER;\nBEGIN\n  my_emp_id := 120;\n\n  SELECT debugging.log_msg(last_name)\n  INTO my_last_name\n  FROM employees\n  WHERE employee_id = my_emp_id;\n\n  /* Even if you roll back in this scope,\n     the insert into 'debug_output' remains committed,\n     because it is part of an autonomous transaction. */\n\n  ROLLBACK;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/avoiding-inner-capture-select-and-dml-statements-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/avoiding-inner-capture-select-and-dml-statements.html\nCREATE OR REPLACE TYPE type1 AS OBJECT (a NUMBER);\n/\nDROP TABLE tab1;\nCREATE TABLE tab1 (tab2 type1);\nINSERT INTO tab1 (tab2) VALUES (type1(10));\nDROP TABLE tab2;\nCREATE TABLE tab2 (x NUMBER);\nINSERT INTO tab2 (x) VALUES (10);\nSELECT * FROM tab1 hr\nWHERE EXISTS (SELECT * FROM hr.tab2 WHERE x = hr.tab2.a);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/avoiding-inner-capture-select-and-dml-statements-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/avoiding-inner-capture-select-and-dml-statements.html\nUPDATE ot1 o SET o = (t1(20)) WHERE o.x = 10;\nDECLARE\n  n_ref  REF t1;\nBEGIN\n  SELECT REF(o) INTO n_ref FROM ot1 o WHERE VALUE(o) = t1(30);\nEND;\n/\nDECLARE\n  n t1;\nBEGIN\n  SELECT VALUE(o) INTO n FROM ot1 o WHERE VALUE(o) = t1(30);\nEND;\n/\nDECLARE\n  n NUMBER;\nBEGIN\n  SELECT o.x INTO n FROM ot1 o WHERE o.x = 30;\nEND;\n/\nDELETE FROM ot1 o WHERE VALUE(o) = (t1(20));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/avoiding-inner-capture-select-and-dml-statements-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/avoiding-inner-capture-select-and-dml-statements.html\nALTER TABLE tab2 ADD (a NUMBER);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/avoiding-inner-capture-select-and-dml-statements-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/avoiding-inner-capture-select-and-dml-statements.html\nSELECT * FROM hr.tab1 p1\nWHERE EXISTS (SELECT * FROM hr.tab2 p2 WHERE p2.x = p1.tab2.a);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/avoiding-inner-capture-select-and-dml-statements-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/avoiding-inner-capture-select-and-dml-statements.html\nCREATE OR REPLACE TYPE t1 AS OBJECT (x NUMBER);\n/\nDROP TABLE tb1;\nCREATE TABLE tb1 (col1 t1);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/avoiding-inner-capture-select-and-dml-statements-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/avoiding-inner-capture-select-and-dml-statements.html\nBEGIN\n  INSERT INTO tb1 VALUES ( t1(10) );\n  INSERT INTO tb1 VALUES ( t1(20) );\n  INSERT INTO tb1 VALUES ( t1(30) );\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/avoiding-inner-capture-select-and-dml-statements-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/avoiding-inner-capture-select-and-dml-statements.html\nUPDATE tb1 SET col1.x = 10 WHERE col1.x = 20;\nUPDATE tb1 SET tb1.col1.x = 10 WHERE tb1.col1.x = 20;\nUPDATE hr.tb1 SET hr.tb1.col1.x = 10 WHERE hr.tb1.col1.x = 20;\nDELETE FROM tb1 WHERE tb1.col1.x = 10;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/avoiding-inner-capture-select-and-dml-statements-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/avoiding-inner-capture-select-and-dml-statements.html\nUPDATE hr.tb1 t SET t.col1.x = 10 WHERE t.col1.x = 20;\nDECLARE\n  y NUMBER;\nBEGIN\n  SELECT t.col1.x INTO y FROM tb1 t WHERE t.col1.x = 30;\nEND;\n/\nDELETE FROM tb1 t WHERE t.col1.x = 10;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/avoiding-inner-capture-select-and-dml-statements-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/avoiding-inner-capture-select-and-dml-statements.html\nCREATE OR REPLACE TYPE t1 AS OBJECT (x number);\n/\nDROP TABLE ot1;\nCREATE TABLE ot1 OF t1;\nBEGIN\n  INSERT INTO ot1 VALUES (t1(10));\n  INSERT INTO ot1 VALUES (20);\n  INSERT INTO ot1 VALUES (30);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/avoiding-inner-capture-select-and-dml-statements-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/avoiding-inner-capture-select-and-dml-statements.html\nUPDATE ot1 SET VALUE(ot1.x) = t1(20) WHERE VALUE(ot1.x) = t1(10);\nDELETE FROM ot1 WHERE VALUE(ot1) = (t1(10));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/basic-LOOP-statement-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/basic-LOOP-statement.html\nDECLARE\n  s  PLS_INTEGER := 0;\n  i  PLS_INTEGER := 0;\n  j  PLS_INTEGER;\nBEGIN\n  <<outer_loop>>\n  LOOP\n    i := i + 1;\n    j := 0;\n    <<inner_loop>>\n    LOOP\n      j := j + 1;\n      s := s + i * j; -- Sum several products\n      EXIT inner_loop WHEN (j > 5);\n      EXIT outer_loop WHEN ((i * j) > 15);\n    END LOOP inner_loop;\n  END LOOP outer_loop;\n  DBMS_OUTPUT.PUT_LINE\n    ('The sum of products equals: ' || TO_CHAR(s));\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/basic-LOOP-statement-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/basic-LOOP-statement.html\nDECLARE\n  i PLS_INTEGER := 0;\n  j PLS_INTEGER := 0;\n\nBEGIN\n  LOOP\n    i := i + 1;\n    DBMS_OUTPUT.PUT_LINE ('i = ' || i);\n\n    LOOP\n      j := j + 1;\n      DBMS_OUTPUT.PUT_LINE ('j = ' || j);\n      EXIT WHEN (j > 3);\n    END LOOP;\n\n    DBMS_OUTPUT.PUT_LINE ('Exited inner loop');\n\n    EXIT WHEN (i > 2);\n  END LOOP;\n\n  DBMS_OUTPUT.PUT_LINE ('Exited outer loop');\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/bulk-sql-and-bulk-binding-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/bulk-sql-and-bulk-binding.html\nDELETE FROM employees_temp WHERE department_id = 10;\nDELETE FROM employees_temp WHERE department_id = 30;\nDELETE FROM employees_temp WHERE department_id = 70;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/bulk-sql-and-bulk-binding-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/bulk-sql-and-bulk-binding.html\nDROP TABLE employees_temp;\nCREATE TABLE employees_temp AS SELECT * FROM employees;\nDECLARE\n  TYPE NumList IS VARRAY(20) OF NUMBER;\n  depts NumList := NumList(10, 30, 70);  -- department numbers\nBEGIN\n  FOR i IN depts.FIRST..depts.LAST LOOP\n    DELETE FROM employees_temp\n    WHERE department_id = depts(i);\n  END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/bulk-sql-and-bulk-binding-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/bulk-sql-and-bulk-binding.html\nSELECT cust_name \"Customer\", amount \"Big order amount\"\nFROM big_orders\nORDER BY cust_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/bulk-sql-and-bulk-binding-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/bulk-sql-and-bulk-binding.html\nSELECT cust_name \"Customer\", amount \"Rejected order amount\"\nFROM rejected_orders\nORDER BY cust_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/bulk-sql-and-bulk-binding-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/bulk-sql-and-bulk-binding.html\nDELETE FROM employees_temp WHERE department_id = depts(10);\nDELETE FROM employees_temp WHERE department_id = depts(30);\nDELETE FROM employees_temp WHERE department_id = depts(70);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/bulk-sql-and-bulk-binding-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/bulk-sql-and-bulk-binding.html\nDROP TABLE emp_temp;\nCREATE TABLE emp_temp (\n  deptno NUMBER(2),\n  job VARCHAR2(18)\n);\nCREATE OR REPLACE PROCEDURE p AUTHID DEFINER AS\n  TYPE NumList IS TABLE OF NUMBER;\n\n  depts          NumList := NumList(10, 20, 30);\n  error_message  VARCHAR2(100);\n\nBEGIN\n  -- Populate table:\n\n  INSERT INTO emp_temp (deptno, job) VALUES (10, 'Clerk');\n  INSERT INTO emp_temp (deptno, job) VALUES (20, 'Bookkeeper');\n  INSERT INTO emp_temp (deptno, job) VALUES (30, 'Analyst');\n  COMMIT;\n\n  -- Append 9-character string to each job:\n\n  FORALL j IN depts.FIRST..depts.LAST\n    UPDATE emp_temp SET job = job || ' (Senior)'\n    WHERE deptno = depts(j);\n\nEXCEPTION\n  WHEN OTHERS THEN\n    error_message := SQLERRM;\n    DBMS_OUTPUT.PUT_LINE (error_message);\n\n    COMMIT;  -- Commit results of successful updates\n    RAISE;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/bulk-sql-and-bulk-binding-17.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/bulk-sql-and-bulk-binding.html\nBEGIN\n  p;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/bulk-sql-and-bulk-binding-19.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/bulk-sql-and-bulk-binding.html\nSELECT * FROM emp_temp;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/bulk-sql-and-bulk-binding-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/bulk-sql-and-bulk-binding.html\nDROP TABLE employees_temp;\nCREATE TABLE employees_temp AS SELECT * FROM employees;\nDECLARE\n  TYPE NumList IS VARRAY(20) OF NUMBER;\n  depts NumList := NumList(10, 30, 70);  -- department numbers\nBEGIN\n  FORALL i IN depts.FIRST..depts.LAST\n    DELETE FROM employees_temp\n    WHERE department_id = depts(i);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/bulk-sql-and-bulk-binding-22.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/bulk-sql-and-bulk-binding.html\nCREATE OR REPLACE PROCEDURE p AUTHID DEFINER AS\n  TYPE NumList IS TABLE OF NUMBER;\n  depts        NumList := NumList(10, 20, 30);\n\n  error_message  VARCHAR2(100);\n  bad_stmt_no    PLS_INTEGER;\n  bad_deptno     emp_temp.deptno%TYPE;\n  bad_job        emp_temp.job%TYPE;\n\n  dml_errors  EXCEPTION;\n  PRAGMA EXCEPTION_INIT(dml_errors, -24381);\nBEGIN\n  -- Populate table:\n\n  INSERT INTO emp_temp (deptno, job) VALUES (10, 'Clerk');\n  INSERT INTO emp_temp (deptno, job) VALUES (20, 'Bookkeeper');\n  INSERT INTO emp_temp (deptno, job) VALUES (30, 'Analyst');\n  COMMIT;\n\n  -- Append 9-character string to each job:\n\n  FORALL j IN depts.FIRST..depts.LAST SAVE EXCEPTIONS\n    UPDATE emp_temp SET job = job || ' (Senior)'\n    WHERE deptno = depts(j); \n\nEXCEPTION\n  WHEN dml_errors THEN\n    FOR i IN 1..SQL%BULK_EXCEPTIONS.COUNT LOOP\n      error_message := SQLERRM(-(SQL%BULK_EXCEPTIONS(i).ERROR_CODE));\n      DBMS_OUTPUT.PUT_LINE (error_message);\n\n      bad_stmt_no := SQL%BULK_EXCEPTIONS(i).ERROR_INDEX;\n      DBMS_OUTPUT.PUT_LINE('Bad statement #: ' || bad_stmt_no);\n\n      bad_deptno := depts(bad_stmt_no);\n      DBMS_OUTPUT.PUT_LINE('Bad department #: ' || bad_deptno);\n\n      SELECT job INTO bad_job FROM emp_temp WHERE deptno = bad_deptno;\n\n      DBMS_OUTPUT.PUT_LINE('Bad job: ' || bad_job);\n    END LOOP;\n\n    COMMIT;  -- Commit results of successful updates\n\n    WHEN OTHERS THEN\n      DBMS_OUTPUT.PUT_LINE('Unrecognized error.');\n      RAISE;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/bulk-sql-and-bulk-binding-24.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/bulk-sql-and-bulk-binding.html\nBEGIN\n  p;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/bulk-sql-and-bulk-binding-26.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/bulk-sql-and-bulk-binding.html\nSELECT * FROM emp_temp;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/bulk-sql-and-bulk-binding-28.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/bulk-sql-and-bulk-binding.html\nDROP TABLE emp_temp;\nCREATE TABLE emp_temp AS SELECT * FROM employees;\nDECLARE\n  TYPE NumList IS TABLE OF NUMBER;\n  depts NumList := NumList(30, 50, 60);\nBEGIN\n  FORALL j IN depts.FIRST..depts.LAST\n    DELETE FROM emp_temp WHERE department_id = depts(j);\n\n  FOR i IN depts.FIRST..depts.LAST LOOP\n    DBMS_OUTPUT.PUT_LINE (\n      'Statement #' || i || ' deleted ' ||\n      SQL%BULK_ROWCOUNT(i) || ' rows.'\n    );\n  END LOOP;\n\n  DBMS_OUTPUT.PUT_LINE('Total rows deleted: ' || SQL%ROWCOUNT);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/bulk-sql-and-bulk-binding-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/bulk-sql-and-bulk-binding.html\nDROP TABLE parts1;\nCREATE TABLE parts1 (\n  pnum INTEGER,\n  pname VARCHAR2(15)\n);\nDROP TABLE parts2;\nCREATE TABLE parts2 (\n  pnum INTEGER,\n  pname VARCHAR2(15)\n);\nDECLARE\n  TYPE NumTab IS TABLE OF parts1.pnum%TYPE INDEX BY PLS_INTEGER;\n  TYPE NameTab IS TABLE OF parts1.pname%TYPE INDEX BY PLS_INTEGER;\n  pnums   NumTab;\n  pnames  NameTab;\n  iterations  CONSTANT PLS_INTEGER := 50000;\n  t1  INTEGER;\n  t2  INTEGER;\n  t3  INTEGER;\nBEGIN\n  FOR j IN 1..iterations LOOP  -- populate collections\n    pnums(j) := j;\n    pnames(j) := 'Part No. ' || TO_CHAR(j);\n  END LOOP;\n\n  t1 := DBMS_UTILITY.get_time;\n\n  FOR i IN 1..iterations LOOP\n    INSERT INTO parts1 (pnum, pname)\n    VALUES (pnums(i), pnames(i));\n  END LOOP;\n\n  t2 := DBMS_UTILITY.get_time;\n\n  FORALL i IN 1..iterations\n    INSERT INTO parts2 (pnum, pname)\n    VALUES (pnums(i), pnames(i));\n\n  t3 := DBMS_UTILITY.get_time;\n\n  DBMS_OUTPUT.PUT_LINE('Execution Time (secs)');\n  DBMS_OUTPUT.PUT_LINE('---------------------');\n  DBMS_OUTPUT.PUT_LINE('FOR LOOP: ' || TO_CHAR((t2 - t1)/100));\n  DBMS_OUTPUT.PUT_LINE('FORALL:   ' || TO_CHAR((t3 - t2)/100));\n  COMMIT;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/bulk-sql-and-bulk-binding-30.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/bulk-sql-and-bulk-binding.html\nDROP TABLE emp_by_dept;\nCREATE TABLE emp_by_dept AS\n  SELECT employee_id, department_id\n  FROM employees\n  WHERE 1 = 0;\nDECLARE\n  TYPE dept_tab IS TABLE OF departments.department_id%TYPE;\n  deptnums  dept_tab;\nBEGIN\n  SELECT department_id BULK COLLECT INTO deptnums FROM departments;\n\n  FORALL i IN 1..deptnums.COUNT\n    INSERT INTO emp_by_dept (employee_id, department_id)\n      SELECT employee_id, department_id\n      FROM employees\n      WHERE department_id = deptnums(i)\n      ORDER BY department_id, employee_id;\n\n  FOR i IN 1..deptnums.COUNT LOOP\n    -- Count how many rows were inserted for each department; that is,\n    -- how many employees are in each department.\n    DBMS_OUTPUT.PUT_LINE (\n      'Dept '||deptnums(i)||': inserted '||\n      SQL%BULK_ROWCOUNT(i)||' records'\n    );\n  END LOOP;\n  DBMS_OUTPUT.PUT_LINE('Total records inserted: ' || SQL%ROWCOUNT);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/bulk-sql-and-bulk-binding-32.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/bulk-sql-and-bulk-binding.html\nDECLARE\n  TYPE NumTab IS TABLE OF employees.employee_id%TYPE;\n  TYPE NameTab IS TABLE OF employees.last_name%TYPE;\n\n  enums NumTab;\n  names NameTab;\n\n  PROCEDURE print_first_n (n POSITIVE) IS\n  BEGIN\n    IF enums.COUNT = 0 THEN\n      DBMS_OUTPUT.PUT_LINE ('Collections are empty.');\n    ELSE\n      DBMS_OUTPUT.PUT_LINE ('First ' || n || ' employees:');\n\n      FOR i IN 1 .. n LOOP\n        DBMS_OUTPUT.PUT_LINE (\n          '  Employee #' || enums(i) || ': ' || names(i));\n      END LOOP;\n    END IF;\n  END;\n\nBEGIN\n  SELECT employee_id, last_name\n  BULK COLLECT INTO enums, names\n  FROM employees\n  ORDER BY employee_id;\n\n  print_first_n(3);\n  print_first_n(6);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/bulk-sql-and-bulk-binding-34.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/bulk-sql-and-bulk-binding.html\nDECLARE\n  CURSOR c1 IS\n    SELECT first_name, last_name, hire_date\n    FROM employees;\n\n  TYPE NameSet IS TABLE OF c1%ROWTYPE;\n\n  stock_managers  NameSet;  -- nested table of records\n\nBEGIN \n  -- Assign values to nested table of records:\n\n  SELECT first_name, last_name, hire_date\n    BULK COLLECT INTO stock_managers\n    FROM employees\n    WHERE job_id = 'ST_MAN'\n    ORDER BY hire_date;\n\n  -- Print nested table of records:\n\n    FOR i IN stock_managers.FIRST .. stock_managers.LAST LOOP\n      DBMS_OUTPUT.PUT_LINE (\n        stock_managers(i).hire_date || ' ' ||\n        stock_managers(i).last_name  || ', ' ||\n        stock_managers(i).first_name\n      );\n    END LOOP;END;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/bulk-sql-and-bulk-binding-37.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/bulk-sql-and-bulk-binding.html\nCREATE OR REPLACE TYPE numbers_type IS\n  TABLE OF INTEGER\n/\nCREATE OR REPLACE PROCEDURE p (i IN INTEGER) AUTHID DEFINER IS\n  numbers1  numbers_type := numbers_type(1,2,3,4,5);\nBEGIN\n  DBMS_OUTPUT.PUT_LINE('Before SELECT statement');\n  DBMS_OUTPUT.PUT_LINE('numbers1.COUNT() = ' || numbers1.COUNT());\n\n  FOR j IN 1..numbers1.COUNT() LOOP\n    DBMS_OUTPUT.PUT_LINE('numbers1(' || j || ') = ' || numbers1(j));\n  END LOOP;\n\n  --Self-selecting BULK COLLECT INTO clause:\n\n  SELECT a.COLUMN_VALUE\n  BULK COLLECT INTO numbers1\n  FROM TABLE(numbers1) a\n  WHERE a.COLUMN_VALUE > p.i\n  ORDER BY a.COLUMN_VALUE;\n\n  DBMS_OUTPUT.PUT_LINE('After SELECT statement');\n  DBMS_OUTPUT.PUT_LINE('numbers1.COUNT() = ' || numbers1.COUNT());\nEND p;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/bulk-sql-and-bulk-binding-38.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/bulk-sql-and-bulk-binding.html\nBEGIN\n  p(2);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/bulk-sql-and-bulk-binding-40.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/bulk-sql-and-bulk-binding.html\nBEGIN\n  p(10);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/bulk-sql-and-bulk-binding-42.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/bulk-sql-and-bulk-binding.html\nCREATE OR REPLACE TYPE numbers_type IS\n  TABLE OF INTEGER\n/\nCREATE OR REPLACE PROCEDURE p (i IN INTEGER) AUTHID DEFINER IS\n  numbers1  numbers_type := numbers_type(1,2,3,4,5);\n\n  CURSOR c IS\n    SELECT a.COLUMN_VALUE\n    FROM TABLE(numbers1) a\n    WHERE a.COLUMN_VALUE > p.i\n    ORDER BY a.COLUMN_VALUE;\n  BEGIN\n    DBMS_OUTPUT.PUT_LINE('Before FETCH statement');\n    DBMS_OUTPUT.PUT_LINE('numbers1.COUNT() = ' || numbers1.COUNT());\n\n    FOR j IN 1..numbers1.COUNT() LOOP\n      DBMS_OUTPUT.PUT_LINE('numbers1(' || j || ') = ' || numbers1(j));\n    END LOOP;\n\n  OPEN c;\n  FETCH c BULK COLLECT INTO numbers1;\n  CLOSE c;\n\n  DBMS_OUTPUT.PUT_LINE('After FETCH statement');\n  DBMS_OUTPUT.PUT_LINE('numbers1.COUNT() = ' || numbers1.COUNT());\n\n  IF numbers1.COUNT() > 0 THEN\n    FOR j IN 1..numbers1.COUNT() LOOP\n      DBMS_OUTPUT.PUT_LINE('numbers1(' || j || ') = ' || numbers1(j));\n    END LOOP;\n  END IF;\nEND p;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/bulk-sql-and-bulk-binding-43.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/bulk-sql-and-bulk-binding.html\nBEGIN\n  p(2);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/bulk-sql-and-bulk-binding-45.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/bulk-sql-and-bulk-binding.html\nBEGIN\n  p(10);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/bulk-sql-and-bulk-binding-47.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/bulk-sql-and-bulk-binding.html\nCREATE OR REPLACE TYPE numbers_type IS\n  TABLE OF INTEGER\n/\nCREATE OR REPLACE PROCEDURE p (i IN INTEGER) AUTHID DEFINER IS\n  numbers1  numbers_type := numbers_type(1,2,3,4,5);\n numbers2  numbers_type := numbers_type(0,0,0,0,0);\n\nBEGIN\n  DBMS_OUTPUT.PUT_LINE('Before SELECT statement');\n\n  DBMS_OUTPUT.PUT_LINE('numbers1.COUNT() = ' || numbers1.COUNT());\n\n  FOR j IN 1..numbers1.COUNT() LOOP\n    DBMS_OUTPUT.PUT_LINE('numbers1(' || j || ') = ' || numbers1(j));\n  END LOOP;\n\n  DBMS_OUTPUT.PUT_LINE('numbers2.COUNT() = ' || numbers2.COUNT());\n\n  FOR j IN 1..numbers2.COUNT() LOOP\n    DBMS_OUTPUT.PUT_LINE('numbers2(' || j || ') = ' || numbers2(j));\n  END LOOP;\n\n  SELECT a.COLUMN_VALUE\n  BULK COLLECT INTO numbers2      -- numbers2 appears here\n  FROM TABLE(numbers1) a        -- numbers1 appears here\n  WHERE a.COLUMN_VALUE > p.i\n  ORDER BY a.COLUMN_VALUE;\n\n  DBMS_OUTPUT.PUT_LINE('After SELECT statement');\n  DBMS_OUTPUT.PUT_LINE('numbers1.COUNT() = ' || numbers1.COUNT());\n\n  IF numbers1.COUNT() > 0 THEN\n    FOR j IN 1..numbers1.COUNT() LOOP\n      DBMS_OUTPUT.PUT_LINE('numbers1(' || j || ') = ' || numbers1(j));\n    END LOOP;\n  END IF;\n\n  DBMS_OUTPUT.PUT_LINE('numbers2.COUNT() = ' || numbers2.COUNT());\n\n  IF numbers2.COUNT() > 0 THEN\n    FOR j IN 1..numbers2.COUNT() LOOP\n      DBMS_OUTPUT.PUT_LINE('numbers2(' || j || ') = ' || numbers2(j));\n    END LOOP;\n  END IF;\nEND p;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/bulk-sql-and-bulk-binding-48.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/bulk-sql-and-bulk-binding.html\nBEGIN\n  p(2);\n END;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/bulk-sql-and-bulk-binding-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/bulk-sql-and-bulk-binding.html\nDROP TABLE employees_temp;\nCREATE TABLE employees_temp AS SELECT * FROM employees;\nDECLARE\n  TYPE NumList IS VARRAY(10) OF NUMBER;\n  depts NumList := NumList(5,10,20,30,50,55,57,60,70,75);\nBEGIN\n  FORALL j IN 4..7\n    DELETE FROM employees_temp WHERE department_id = depts(j);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/bulk-sql-and-bulk-binding-50.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/bulk-sql-and-bulk-binding.html\nBEGIN\n  p(10);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/bulk-sql-and-bulk-binding-52.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/bulk-sql-and-bulk-binding.html\nDECLARE\n  TYPE SalList IS TABLE OF employees.salary%TYPE;\n  sals SalList;\nBEGIN\n  SELECT salary BULK COLLECT INTO sals FROM employees\n    WHERE ROWNUM <= 50;\n\n  SELECT salary BULK COLLECT INTO sals FROM employees\n    SAMPLE (10);\n\n  SELECT salary BULK COLLECT INTO sals FROM employees\n    FETCH FIRST 50 ROWS ONLY;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/bulk-sql-and-bulk-binding-53.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/bulk-sql-and-bulk-binding.html\nDECLARE\n  TYPE NameList IS TABLE OF employees.last_name%TYPE;\n  TYPE SalList IS TABLE OF employees.salary%TYPE;\n\n  CURSOR c1 IS\n    SELECT last_name, salary\n    FROM employees\n    WHERE salary > 10000\n    ORDER BY last_name;\n\n  names  NameList;\n  sals   SalList;\n\n  TYPE RecList IS TABLE OF c1%ROWTYPE;\n  recs RecList;\n\n  v_limit PLS_INTEGER := 10;\n\n  PROCEDURE print_results IS\n  BEGIN\n    -- Check if collections are empty:\n\n    IF names IS NULL OR names.COUNT = 0 THEN\n      DBMS_OUTPUT.PUT_LINE('No results!');\n    ELSE\n      DBMS_OUTPUT.PUT_LINE('Result: ');\n      FOR i IN names.FIRST .. names.LAST\n      LOOP\n        DBMS_OUTPUT.PUT_LINE('  Employee ' || names(i) || ': $' || sals(i));\n      END LOOP;\n    END IF;\n  END;\n\nBEGIN\n  DBMS_OUTPUT.PUT_LINE ('--- Processing all results simultaneously ---');\n  OPEN c1;\n  FETCH c1 BULK COLLECT INTO names, sals;\n  CLOSE c1;\n  print_results();\n  DBMS_OUTPUT.PUT_LINE ('--- Processing ' || v_limit || ' rows at a time ---');\n  OPEN c1;\n  LOOP\n    FETCH c1 BULK COLLECT INTO names, sals LIMIT v_limit;\n    EXIT WHEN names.COUNT = 0;\n    print_results();\n  END LOOP;\n  CLOSE c1;\n  DBMS_OUTPUT.PUT_LINE ('--- Fetching records rather than columns ---');\n  OPEN c1;\n  FETCH c1 BULK COLLECT INTO recs;\n  FOR i IN recs.FIRST .. recs.LAST\n  LOOP\n    -- Now all columns from result set come from one record\n    DBMS_OUTPUT.PUT_LINE (\n      '  Employee ' || recs(i).last_name || ': $' || recs(i).salary\n    );\n  END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/bulk-sql-and-bulk-binding-55.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/bulk-sql-and-bulk-binding.html\nDECLARE\n  CURSOR c1 IS\n    SELECT first_name, last_name, hire_date\n    FROM employees;\n\n  TYPE NameSet IS TABLE OF c1%ROWTYPE;\n  stock_managers  NameSet;  -- nested table of records\n\n  TYPE cursor_var_type is REF CURSOR;\n  cv cursor_var_type;\n\nBEGIN \n  -- Assign values to nested table of records:\n\n  OPEN cv FOR\n    SELECT first_name, last_name, hire_date\n    FROM employees\n    WHERE job_id = 'ST_MAN'\n    ORDER BY hire_date;\n\n  FETCH cv BULK COLLECT INTO stock_managers;\n  CLOSE cv;\n\n  -- Print nested table of records:\n\n    FOR i IN stock_managers.FIRST .. stock_managers.LAST LOOP\n      DBMS_OUTPUT.PUT_LINE (\n        stock_managers(i).hire_date || ' ' ||\n        stock_managers(i).last_name  || ', ' ||\n        stock_managers(i).first_name\n      );\n    END LOOP;END;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/bulk-sql-and-bulk-binding-57.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/bulk-sql-and-bulk-binding.html\nDECLARE\n  TYPE numtab IS TABLE OF NUMBER INDEX BY PLS_INTEGER;\n\n  CURSOR c1 IS\n    SELECT employee_id\n    FROM employees\n    WHERE department_id = 80\n    ORDER BY employee_id;\n\n  empids  numtab;\nBEGIN\n  OPEN c1;\n  LOOP  -- Fetch 10 rows or fewer in each iteration\n    FETCH c1 BULK COLLECT INTO empids LIMIT 10;\n    DBMS_OUTPUT.PUT_LINE ('------- Results from One Bulk Fetch --------');\n    FOR i IN 1..empids.COUNT LOOP\n      DBMS_OUTPUT.PUT_LINE ('Employee Id: ' || empids(i));\n    END LOOP;\n    EXIT WHEN c1%NOTFOUND;\n  END LOOP;\n  CLOSE c1;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/bulk-sql-and-bulk-binding-59.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/bulk-sql-and-bulk-binding.html\nDROP TABLE emp_temp;\nCREATE TABLE emp_temp AS\nSELECT * FROM employees\nORDER BY employee_id;\nDECLARE\n  TYPE NumList IS TABLE OF employees.employee_id%TYPE;\n  enums  NumList;\n  TYPE NameList IS TABLE OF employees.last_name%TYPE;\n  names  NameList;\nBEGIN\n  DELETE FROM emp_temp\n  WHERE department_id = 30\n  RETURNING employee_id, last_name\n  BULK COLLECT INTO enums, names;\n\n  DBMS_OUTPUT.PUT_LINE ('Deleted ' || SQL%ROWCOUNT || ' rows:');\n  FOR i IN enums.FIRST .. enums.LAST\n  LOOP\n    DBMS_OUTPUT.PUT_LINE ('Employee #' || enums(i) || ': ' || names(i));\n  END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/bulk-sql-and-bulk-binding-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/bulk-sql-and-bulk-binding.html\nDROP TABLE valid_orders;\nCREATE TABLE valid_orders (\n  cust_name  VARCHAR2(32),\n  amount     NUMBER(10,2)\n);\nDROP TABLE big_orders;\nCREATE TABLE big_orders AS\n  SELECT * FROM valid_orders\n  WHERE 1 = 0;\nDROP TABLE rejected_orders;\nCREATE TABLE rejected_orders AS\n  SELECT * FROM valid_orders\n  WHERE 1 = 0;\nDECLARE\n  SUBTYPE cust_name IS valid_orders.cust_name%TYPE;\n  TYPE cust_typ IS TABLE OF cust_name;\n  cust_tab  cust_typ;  -- Collection of customer names\n\n  SUBTYPE order_amount IS valid_orders.amount%TYPE;\n  TYPE amount_typ IS TABLE OF NUMBER;\n  amount_tab  amount_typ;  -- Collection of order amounts\n\n  TYPE index_pointer_t IS TABLE OF PLS_INTEGER;\n\n  /* Collections for pointers to elements of cust_tab collection\n     (to represent two subsets of cust_tab): */\n\n  big_order_tab       index_pointer_t := index_pointer_t();\n  rejected_order_tab  index_pointer_t := index_pointer_t();\n\n  PROCEDURE populate_data_collections IS\n  BEGIN\n    cust_tab := cust_typ(\n      'Company1','Company2','Company3','Company4','Company5'\n    );\n\n    amount_tab := amount_typ(5000.01, 0, 150.25, 4000.00, NULL);\n  END;\n\nBEGIN\n  populate_data_collections;\n\n  DBMS_OUTPUT.PUT_LINE ('--- Original order data ---');\n\n  FOR i IN 1..cust_tab.LAST LOOP\n    DBMS_OUTPUT.PUT_LINE (\n      'Customer #' || i || ', ' || cust_tab(i) || ': $' || amount_tab(i)\n    );\n  END LOOP;\n\n  -- Delete invalid orders:\n\n  FOR i IN 1..cust_tab.LAST LOOP\n    IF amount_tab(i) IS NULL OR amount_tab(i) = 0 THEN\n      cust_tab.delete(i);\n      amount_tab.delete(i);\n    END IF;\n  END LOOP;\n\n  -- cust_tab is now a sparse collection.\n\n  DBMS_OUTPUT.PUT_LINE ('--- Order data with invalid orders deleted ---');\n\n  FOR i IN 1..cust_tab.LAST LOOP\n    IF cust_tab.EXISTS(i) THEN\n      DBMS_OUTPUT.PUT_LINE (\n        'Customer #' || i || ', ' || cust_tab(i) || ': $' || amount_tab(i)\n      );\n    END IF;\n  END LOOP;\n\n  -- Using sparse collection, populate valid_orders table:\n\n  FORALL i IN INDICES OF cust_tab\n    INSERT INTO valid_orders (cust_name, amount)\n    VALUES (cust_tab(i), amount_tab(i));\n\n  populate_data_collections;  -- Restore original order data\n\n  -- cust_tab is a dense collection again.\n\n  /* Populate collections of pointers to elements of cust_tab collection\n     (which represent two subsets of cust_tab): */\n\n  FOR i IN cust_tab.FIRST .. cust_tab.LAST LOOP\n    IF amount_tab(i) IS NULL OR amount_tab(i) = 0 THEN\n      rejected_order_tab.EXTEND;\n      rejected_order_tab(rejected_order_tab.LAST) := i; \n    END IF;\n\n    IF amount_tab(i) > 2000 THEN\n      big_order_tab.EXTEND;\n      big_order_tab(big_order_tab.LAST) := i;\n    END IF;\n  END LOOP;\n\n  /* Using each subset in a different FORALL statement,\n     populate rejected_orders and big_orders tables: */\n\n  FORALL i IN VALUES OF rejected_order_tab\n    INSERT INTO rejected_orders (cust_name, amount)\n    VALUES (cust_tab(i), amount_tab(i));\n\n  FORALL i IN VALUES OF big_order_tab\n    INSERT INTO big_orders (cust_name, amount)\n    VALUES (cust_tab(i), amount_tab(i));\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/bulk-sql-and-bulk-binding-61.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/bulk-sql-and-bulk-binding.html\nDROP TABLE emp_temp;\nCREATE TABLE emp_temp AS\nSELECT * FROM employees\nORDER BY employee_id;\nDECLARE\n  TYPE SalList IS TABLE OF employees.salary%TYPE;\n  old_sals SalList;\n  new_sals SalList;\n  TYPE NameList IS TABLE OF employees.last_name%TYPE;\n  names NameList;\nBEGIN\n  UPDATE emp_temp SET salary = salary * 1.15\n  WHERE salary < 2500\n  RETURNING OLD salary, NEW salary, last_name \n  BULK COLLECT INTO old_sals, new_sals, names; \n\n  DBMS_OUTPUT.PUT_LINE('Updated ' || SQL%ROWCOUNT || ' rows: ');\n  FOR i IN old_sals.FIRST .. old_sals.LAST\n  LOOP\n    DBMS_OUTPUT.PUT_LINE(names(i) || ': Old Salary $' || old_sals(i) || \n            ', New Salary $' || new_sals(i));\n  END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/bulk-sql-and-bulk-binding-63.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/bulk-sql-and-bulk-binding.html\nDROP TABLE emp_temp;\nCREATE TABLE emp_temp AS\nSELECT * FROM employees\nORDER BY employee_id, department_id;\nDECLARE\n  TYPE NumList IS TABLE OF NUMBER;\n  depts  NumList := NumList(10,20,30);\n\n  TYPE enum_t IS TABLE OF employees.employee_id%TYPE;\n  e_ids  enum_t;\n\n  TYPE dept_t IS TABLE OF employees.department_id%TYPE;\n  d_ids  dept_t;\n\nBEGIN\n  FORALL j IN depts.FIRST..depts.LAST\n    DELETE FROM emp_temp\n    WHERE department_id = depts(j)\n    RETURNING employee_id, department_id\n    BULK COLLECT INTO e_ids, d_ids;\n\n  DBMS_OUTPUT.PUT_LINE ('Deleted ' || SQL%ROWCOUNT || ' rows:');\n\n  FOR i IN e_ids.FIRST .. e_ids.LAST\n  LOOP\n    DBMS_OUTPUT.PUT_LINE (\n      'Employee #' || e_ids(i) || ' from dept #' || d_ids(i)\n    );\n  END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/bulk-sql-and-bulk-binding-65.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/bulk-sql-and-bulk-binding.html\nDROP TABLE emp_temp;\nCREATE TABLE emp_temp AS\nSELECT * FROM employees\nORDER BY employee_id, department_id;\nDECLARE\n  TYPE NumList IS TABLE OF NUMBER;\n  depts  NumList := NumList(10,20,30);\n\n  TYPE enum_t IS TABLE OF employees.employee_id%TYPE;\n  e_ids  enum_t;\n\n  TYPE dept_t IS TABLE OF employees.department_id%TYPE;\n  d_ids  dept_t;\n\nBEGIN\n  FOR j IN depts.FIRST..depts.LAST LOOP\n    DELETE FROM emp_temp\n    WHERE department_id = depts(j)\n    RETURNING employee_id, department_id\n    BULK COLLECT INTO e_ids, d_ids;\n  END LOOP;\n\n  DBMS_OUTPUT.PUT_LINE ('Deleted ' || SQL%ROWCOUNT || ' rows:');\n\n  FOR i IN e_ids.FIRST .. e_ids.LAST\n  LOOP\n    DBMS_OUTPUT.PUT_LINE (\n      'Employee #' || e_ids(i) || ' from dept #' || d_ids(i)\n    );\n  END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/bulk-sql-and-bulk-binding-67.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/bulk-sql-and-bulk-binding.html\nBEGIN\n  FORALL i IN :lower..:upper\n    DELETE FROM employees\n    WHERE department_id = :depts(i);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/bulk-sql-and-bulk-binding-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/bulk-sql-and-bulk-binding.html\nSELECT cust_name \"Customer\", amount \"Valid order amount\"\nFROM valid_orders\nORDER BY cust_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/chaining-pipelined-table-functions-multiple-transformations-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/chaining-pipelined-table-functions-multiple-transformations.html\nSELECT * FROM TABLE(table_function_name(parameter_list))"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/chaining-pipelined-table-functions-multiple-transformations-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/chaining-pipelined-table-functions-multiple-transformations.html\nSELECT * FROM table_function_name(parameter_list)"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/chaining-pipelined-table-functions-multiple-transformations-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/chaining-pipelined-table-functions-multiple-transformations.html\nSELECT * FROM TABLE(tf2(CURSOR(SELECT * FROM TABLE(tf1()))));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/chaining-pipelined-table-functions-multiple-transformations-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/chaining-pipelined-table-functions-multiple-transformations.html\nCREATE OR REPLACE PACKAGE refcur_pkg AUTHID DEFINER IS\n  TYPE refcur_t1 IS REF CURSOR RETURN employees%ROWTYPE;\n  TYPE refcur_t2 IS REF CURSOR RETURN departments%ROWTYPE;\n  TYPE outrec_typ IS RECORD (\n    var_num    NUMBER(6),\n    var_char1  VARCHAR2(30),\n    var_char2  VARCHAR2(30)\n  );\n  TYPE outrecset IS TABLE OF outrec_typ;\n  FUNCTION g_trans (p1 refcur_t1, p2 refcur_t2) RETURN outrecset PIPELINED;\nEND refcur_pkg;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/chaining-pipelined-table-functions-multiple-transformations-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/chaining-pipelined-table-functions-multiple-transformations.html\nCREATE OR REPLACE PACKAGE BODY refcur_pkg IS\n  FUNCTION g_trans (\n    p1 refcur_t1,\n    p2 refcur_t2\n  ) RETURN outrecset PIPELINED\n  IS\n    out_rec outrec_typ;\n    in_rec1 p1%ROWTYPE;\n    in_rec2 p2%ROWTYPE;\n  BEGIN\n    LOOP\n      FETCH p2 INTO in_rec2;\n      EXIT WHEN p2%NOTFOUND;\n    END LOOP;\n    CLOSE p2;\n    LOOP\n      FETCH p1 INTO in_rec1;\n      EXIT WHEN p1%NOTFOUND;\n      -- first row\n      out_rec.var_num := in_rec1.employee_id;\n      out_rec.var_char1 := in_rec1.first_name;\n      out_rec.var_char2 := in_rec1.last_name;\n      PIPE ROW(out_rec);\n      -- second row\n      out_rec.var_num := in_rec2.department_id;\n      out_rec.var_char1 := in_rec2.department_name;\n      out_rec.var_char2 := TO_CHAR(in_rec2.location_id);\n      PIPE ROW(out_rec);\n    END LOOP;\n    CLOSE p1;\n    RETURN;\n  END g_trans;\nEND refcur_pkg;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/chaining-pipelined-table-functions-multiple-transformations-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/chaining-pipelined-table-functions-multiple-transformations.html\nSELECT * FROM TABLE (\n  refcur_pkg.g_trans (\n    CURSOR (SELECT * FROM employees WHERE department_id = 60),\n    CURSOR (SELECT * FROM departments WHERE department_id = 60)\n  )\n);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/chaining-pipelined-table-functions-multiple-transformations-16.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/chaining-pipelined-table-functions-multiple-transformations.html\nDROP TABLE gradereport;\nCREATE TABLE gradereport (\n  student VARCHAR2(30),\n  subject VARCHAR2(30),\n  weight NUMBER,\n  grade NUMBER\n);\nINSERT INTO gradereport (student, subject, weight, grade)\nVALUES ('Mark', 'Physics', 4, 4);\nINSERT INTO gradereport (student, subject, weight, grade) \nVALUES ('Mark','Chemistry', 4, 3);\nINSERT INTO gradereport (student, subject, weight, grade) \nVALUES ('Mark','Maths', 3, 3);\nINSERT INTO gradereport (student, subject, weight, grade) \nVALUES ('Mark','Economics', 3, 4);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/chaining-pipelined-table-functions-multiple-transformations-17.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/chaining-pipelined-table-functions-multiple-transformations.html\nCREATE OR REPLACE PACKAGE pkg_gpa AUTHID DEFINER IS\n  TYPE gpa IS TABLE OF NUMBER;\n  FUNCTION weighted_average(input_values SYS_REFCURSOR)\n    RETURN gpa PIPELINED;\nEND pkg_gpa;\n/\nCREATE OR REPLACE PACKAGE BODY pkg_gpa IS\n  FUNCTION weighted_average (input_values SYS_REFCURSOR)\n    RETURN gpa PIPELINED\n  IS\n    grade         NUMBER;\n    total         NUMBER := 0;\n    total_weight  NUMBER := 0;\n    weight        NUMBER := 0;\n  BEGIN\n    LOOP\n      FETCH input_values INTO weight, grade;\n      EXIT WHEN input_values%NOTFOUND;\n      total_weight := total_weight + weight;  -- Accumulate weighted average\n      total := total + grade*weight;\n    END LOOP;\n    PIPE ROW (total / total_weight);\n    RETURN; -- returns single result\n  END weighted_average;\nEND pkg_gpa;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/chaining-pipelined-table-functions-multiple-transformations-18.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/chaining-pipelined-table-functions-multiple-transformations.html\nSELECT w.column_value \"weighted result\" \nFROM pkg_gpa.weighted_average (\n    CURSOR (SELECT weight, grade FROM gradereport)\n  ) w;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/chaining-pipelined-table-functions-multiple-transformations-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/chaining-pipelined-table-functions-multiple-transformations.html\nCREATE OR REPLACE PACKAGE pkg1 AUTHID DEFINER AS\n  TYPE numset_t IS TABLE OF NUMBER;\n  FUNCTION f1(x NUMBER) RETURN numset_t PIPELINED;\nEND pkg1;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/chaining-pipelined-table-functions-multiple-transformations-21.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/chaining-pipelined-table-functions-multiple-transformations.html\nCREATE TYPE t IS TABLE OF NUMBER\n/\nCREATE OR REPLACE FUNCTION pipe_rows RETURN t PIPELINED AUTHID DEFINER IS\n  n NUMBER := 0;\nBEGIN\n  LOOP\n    n := n + 1;\n    PIPE ROW (n);\n  END LOOP;\nEND pipe_rows;\n/\nSELECT COLUMN_VALUE\n  FROM TABLE(pipe_rows())\n  WHERE ROWNUM < 5\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/chaining-pipelined-table-functions-multiple-transformations-23.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/chaining-pipelined-table-functions-multiple-transformations.html\nCREATE OR REPLACE FUNCTION get_external_source_data\n  RETURN t PIPELINED AUTHID DEFINER IS\nBEGIN\n  External_Source.Init();           -- Initialize.\n  <<b>> BEGIN\n    LOOP                            -- Pipe rows from external source.\n      PIPE ROW (External_Source.Next_Row());\n    END LOOP;\n  EXCEPTION\n    WHEN External_Source.Done THEN  -- When no more rows are available,\n      External_Source.Clean_Up();   --  clean up.\n    WHEN NO_DATA_NEEDED THEN        -- When no more rows are needed,\n      External_Source.Clean_Up();   --  clean up.\n      RAISE NO_DATA_NEEDED;           -- Optional, equivalent to RETURN.\n  END b;\nEND get_external_source_data;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/chaining-pipelined-table-functions-multiple-transformations-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/chaining-pipelined-table-functions-multiple-transformations.html\nCREATE OR REPLACE PACKAGE BODY pkg1 AS\n  FUNCTION f1(x NUMBER) RETURN numset_t PIPELINED IS\n  BEGIN\n    FOR i IN 1..x LOOP\n      PIPE ROW(i);\n    END LOOP;\n    RETURN;\n  END f1;\nEND pkg1;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/chaining-pipelined-table-functions-multiple-transformations-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/chaining-pipelined-table-functions-multiple-transformations.html\nSELECT * FROM TABLE(pkg1.f1(5));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/chaining-pipelined-table-functions-multiple-transformations-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/chaining-pipelined-table-functions-multiple-transformations.html\nSELECT * FROM pkg1.f1(2);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/chaining-pipelined-table-functions-multiple-transformations-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/chaining-pipelined-table-functions-multiple-transformations.html\nCREATE OR REPLACE PACKAGE refcur_pkg AUTHID DEFINER IS\n  TYPE refcur_t IS REF CURSOR RETURN employees%ROWTYPE;\n  TYPE outrec_typ IS RECORD (\n    var_num    NUMBER(6),\n    var_char1  VARCHAR2(30),\n    var_char2  VARCHAR2(30)\n  );\n  TYPE outrecset IS TABLE OF outrec_typ;\n  FUNCTION f_trans (p refcur_t) RETURN outrecset PIPELINED;\nEND refcur_pkg;\n/\nCREATE OR REPLACE PACKAGE BODY refcur_pkg IS\n  FUNCTION f_trans (p refcur_t) RETURN outrecset PIPELINED IS\n    out_rec outrec_typ;\n    in_rec  p%ROWTYPE;\n  BEGIN\n    LOOP\n      FETCH p INTO in_rec;  -- input row\n      EXIT WHEN p%NOTFOUND;\n\n      out_rec.var_num := in_rec.employee_id;\n      out_rec.var_char1 := in_rec.first_name;\n      out_rec.var_char2 := in_rec.last_name;\n      PIPE ROW(out_rec);  -- first transformed output row\n\n      out_rec.var_char1 := in_rec.email;\n      out_rec.var_char2 := in_rec.phone_number;\n      PIPE ROW(out_rec);  -- second transformed output row\n    END LOOP;\n    CLOSE p;\n    RETURN;\n  END f_trans;\nEND refcur_pkg;\n/\nSELECT * FROM TABLE (\n  refcur_pkg.f_trans (\n    CURSOR (SELECT * FROM employees WHERE department_id = 60)\n  )\n);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/collection-comparisons-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/collection-comparisons.html\nDECLARE  \n  TYPE Foursome IS VARRAY(4) OF VARCHAR2(15);  -- VARRAY type\n  team Foursome;                               -- varray variable\n\n  TYPE Roster IS TABLE OF VARCHAR2(15);        -- nested table type\n  names Roster := Roster('Adams', 'Patel');    -- nested table variable\n\nBEGIN\n  IF team IS NULL THEN\n    DBMS_OUTPUT.PUT_LINE('team IS NULL');\n  ELSE\n    DBMS_OUTPUT.PUT_LINE('team IS NOT NULL');\n  END IF;\n\n  IF names IS NOT NULL THEN\n    DBMS_OUTPUT.PUT_LINE('names IS NOT NULL');\n  ELSE\n    DBMS_OUTPUT.PUT_LINE('names IS NULL');\n  END IF;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/collection-comparisons-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/collection-comparisons.html\nDECLARE\n  TYPE dnames_tab IS TABLE OF VARCHAR2(30); -- element type is not record type\n\n  dept_names1 dnames_tab :=\n    dnames_tab('Shipping','Sales','Finance','Payroll');\n\n  dept_names2 dnames_tab :=\n    dnames_tab('Sales','Finance','Shipping','Payroll');\n\n  dept_names3 dnames_tab :=\n    dnames_tab('Sales','Finance','Payroll');\n\nBEGIN\n  IF dept_names1 = dept_names2 THEN\n    DBMS_OUTPUT.PUT_LINE('dept_names1 = dept_names2');\n  END IF;\n\n  IF dept_names2 != dept_names3 THEN\n    DBMS_OUTPUT.PUT_LINE('dept_names2 != dept_names3');\n  END IF;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/collection-comparisons-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/collection-comparisons.html\nDECLARE\n  TYPE nested_typ IS TABLE OF NUMBER;\n  nt1 nested_typ := nested_typ(1,2,3);\n  nt2 nested_typ := nested_typ(3,2,1);\n  nt3 nested_typ := nested_typ(2,3,1,3);\n  nt4 nested_typ := nested_typ(1,2,4);\n\n  PROCEDURE testify (\n    truth BOOLEAN := NULL,\n    quantity NUMBER := NULL\n  ) IS\n  BEGIN\n    IF truth IS NOT NULL THEN\n      DBMS_OUTPUT.PUT_LINE (\n        CASE truth\n           WHEN TRUE THEN 'True'\n           WHEN FALSE THEN 'False'\n        END\n      );\n    END IF;\n    IF quantity IS NOT NULL THEN\n        DBMS_OUTPUT.PUT_LINE(quantity);\n    END IF;\n  END;\nBEGIN\n  testify(truth => (nt1 IN (nt2,nt3,nt4)));        -- condition\n  testify(truth => (nt1 SUBMULTISET OF nt3));      -- condition\n  testify(truth => (nt1 NOT SUBMULTISET OF nt4));  -- condition\n  testify(truth => (4 MEMBER OF nt1));             -- condition\n  testify(truth => (nt3 IS A SET));                -- condition\n  testify(truth => (nt3 IS NOT A SET));            -- condition\n  testify(truth => (nt1 IS EMPTY));                -- condition\n  testify(quantity => (CARDINALITY(nt3)));         -- function\n  testify(quantity => (CARDINALITY(SET(nt3))));    -- 2 functions\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/collection-methods-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/collection-methods.html\nDECLARE\n  nt nt_type := nt_type(11, 22, 33, 44, 55, 66);\nBEGIN\n  print_nt(nt);\n\n  nt.DELETE(2);     -- Delete second element\n  print_nt(nt);\n\n  nt(2) := 2222;    -- Restore second element\n  print_nt(nt);\n\n  nt.DELETE(2, 4);  -- Delete range of elements\n  print_nt(nt);\n\n  nt(3) := 3333;    -- Restore third element\n  print_nt(nt);\n\n  nt.DELETE;        -- Delete all elements\n  print_nt(nt);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/collection-methods-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/collection-methods.html\nDECLARE\n  TYPE aa_type_int IS TABLE OF INTEGER INDEX BY PLS_INTEGER;\n  aa_int  aa_type_int;\n\n  PROCEDURE print_first_and_last IS\n  BEGIN\n    DBMS_OUTPUT.PUT_LINE('FIRST = ' || aa_int.FIRST);\n    DBMS_OUTPUT.PUT_LINE('LAST = ' || aa_int.LAST);\n  END print_first_and_last;\n\nBEGIN\n  aa_int(1) := 3;\n  aa_int(2) := 6;\n  aa_int(3) := 9;\n  aa_int(4) := 12;\n\n  DBMS_OUTPUT.PUT_LINE('Before deletions:');\n  print_first_and_last;\n\n  aa_int.DELETE(1);\n  aa_int.DELETE(4);\n\n  DBMS_OUTPUT.PUT_LINE('After deletions:');\n  print_first_and_last;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/collection-methods-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/collection-methods.html\nDECLARE\n  TYPE aa_type_str IS TABLE OF INTEGER INDEX BY VARCHAR2(10);\n  aa_str  aa_type_str;\n\n  PROCEDURE print_first_and_last IS\n  BEGIN\n    DBMS_OUTPUT.PUT_LINE('FIRST = ' || aa_str.FIRST);\n    DBMS_OUTPUT.PUT_LINE('LAST = ' || aa_str.LAST);\n  END print_first_and_last;\n\nBEGIN\n  aa_str('Z') := 26;\n  aa_str('A') := 1;\n  aa_str('K') := 11;\n  aa_str('R') := 18;\n\n  DBMS_OUTPUT.PUT_LINE('Before deletions:');\n  print_first_and_last;\n\n  aa_str.DELETE('A');\n  aa_str.DELETE('Z');\n\n  DBMS_OUTPUT.PUT_LINE('After deletions:');\n  print_first_and_last;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/collection-methods-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/collection-methods.html\nDECLARE\n  TYPE team_type IS VARRAY(4) OF VARCHAR2(15);\n  team team_type;\n\n  PROCEDURE print_team (heading VARCHAR2)\n  IS\n  BEGIN\n    DBMS_OUTPUT.PUT_LINE(heading);\n\n    IF team IS NULL THEN\n      DBMS_OUTPUT.PUT_LINE('Does not exist');\n    ELSIF team.FIRST IS NULL THEN\n      DBMS_OUTPUT.PUT_LINE('Has no members');\n    ELSE\n      FOR i IN team.FIRST..team.LAST LOOP\n        DBMS_OUTPUT.PUT_LINE(i || '. ' || team(i));\n      END LOOP;\n    END IF;\n\n    DBMS_OUTPUT.PUT_LINE('---'); \n  END;\n\nBEGIN \n  print_team('Team Status:');\n\n  team := team_type();  -- Team is funded, but nobody is on it.\n  print_team('Team Status:');\n\n  team := team_type('John', 'Mary');  -- Put 2 members on team.\n  print_team('Initial Team:');\n\n  team := team_type('Arun', 'Amitha', 'Allan', 'Mae');  -- Change team.\n  print_team('New Team:');\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/collection-methods-17.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/collection-methods.html\nDECLARE\n  TYPE team_type IS TABLE OF VARCHAR2(15);\n  team team_type;\n\n  PROCEDURE print_team (heading VARCHAR2) IS\n  BEGIN\n    DBMS_OUTPUT.PUT_LINE(heading);\n\n    IF team IS NULL THEN\n      DBMS_OUTPUT.PUT_LINE('Does not exist');\n    ELSIF team.FIRST IS NULL THEN\n      DBMS_OUTPUT.PUT_LINE('Has no members');\n    ELSE\n      FOR i IN team.FIRST..team.LAST LOOP\n        DBMS_OUTPUT.PUT(i || '. ');\n        IF team.EXISTS(i) THEN\n          DBMS_OUTPUT.PUT_LINE(team(i));\n        ELSE\n          DBMS_OUTPUT.PUT_LINE('(to be hired)');\n        END IF;\n      END LOOP;\n    END IF;\n\n    DBMS_OUTPUT.PUT_LINE('---'); \n  END;\n\nBEGIN \n  print_team('Team Status:');\n\n  team := team_type();  -- Team is funded, but nobody is on it.\n  print_team('Team Status:');\n\n  team := team_type('Arun', 'Amitha', 'Allan', 'Mae');  -- Add members.\n  print_team('Initial Team:');\n\n  team.DELETE(2,3);  -- Remove 2nd and 3rd members.\n  print_team('Current Team:');\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/collection-methods-19.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/collection-methods.html\nDECLARE\n  TYPE NumList IS VARRAY(10) OF INTEGER;\n  n NumList := NumList(1,3,5,7);\n\n  PROCEDURE print_count_and_last IS\n  BEGIN\n    DBMS_OUTPUT.PUT('n.COUNT = ' || n.COUNT || ', ');\n    DBMS_OUTPUT.PUT_LINE('n.LAST = ' || n.LAST);\n  END  print_count_and_last;\n\nBEGIN\n  print_count_and_last;\n\n  n.EXTEND(3);\n  print_count_and_last;\n\n  n.TRIM(5);\n  print_count_and_last;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/collection-methods-21.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/collection-methods.html\nDECLARE\n  TYPE NumList IS TABLE OF INTEGER;\n  n NumList := NumList(1,3,5,7);\n\n  PROCEDURE print_count_and_last IS\n  BEGIN\n    DBMS_OUTPUT.PUT('n.COUNT = ' || n.COUNT || ', ');\n    DBMS_OUTPUT.PUT_LINE('n.LAST = ' || n.LAST);\n  END  print_count_and_last;\n\nBEGIN\n  print_count_and_last;\n\n  n.DELETE(3);  -- Delete third element\n  print_count_and_last;\n\n  n.EXTEND(2);  -- Add two null elements to end\n  print_count_and_last;\n\n  FOR i IN 1..8 LOOP\n    IF n.EXISTS(i) THEN\n      IF n(i) IS NOT NULL THEN\n        DBMS_OUTPUT.PUT_LINE('n(' || i || ') = ' || n(i));\n      ELSE\n        DBMS_OUTPUT.PUT_LINE('n(' || i || ') = NULL');\n      END IF;\n    ELSE\n      DBMS_OUTPUT.PUT_LINE('n(' || i || ') does not exist');\n    END IF;\n  END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/collection-methods-23.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/collection-methods.html\nDECLARE\n  TYPE aa_type IS TABLE OF INTEGER INDEX BY PLS_INTEGER;\n  aa aa_type;                          -- associative array\n\n  TYPE va_type IS VARRAY(4) OF INTEGER;\n  va  va_type := va_type(2,4);   -- varray\n\n  TYPE nt_type IS TABLE OF INTEGER;\n  nt  nt_type := nt_type(1,3,5);  -- nested table\n\nBEGIN\n  aa(1):=3; aa(2):=6; aa(3):=9; aa(4):= 12;\n\n  DBMS_OUTPUT.PUT('aa.COUNT = ');\n  DBMS_OUTPUT.PUT_LINE(NVL(TO_CHAR(aa.COUNT), 'NULL'));\n\n  DBMS_OUTPUT.PUT('aa.LIMIT = ');\n  DBMS_OUTPUT.PUT_LINE(NVL(TO_CHAR(aa.LIMIT), 'NULL'));\n\n  DBMS_OUTPUT.PUT('va.COUNT = ');\n  DBMS_OUTPUT.PUT_LINE(NVL(TO_CHAR(va.COUNT), 'NULL'));\n\n  DBMS_OUTPUT.PUT('va.LIMIT = ');\n  DBMS_OUTPUT.PUT_LINE(NVL(TO_CHAR(va.LIMIT), 'NULL'));\n\n  DBMS_OUTPUT.PUT('nt.COUNT = ');\n  DBMS_OUTPUT.PUT_LINE(NVL(TO_CHAR(nt.COUNT), 'NULL'));\n\n  DBMS_OUTPUT.PUT('nt.LIMIT = ');\n  DBMS_OUTPUT.PUT_LINE(NVL(TO_CHAR(nt.LIMIT), 'NULL'));\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/collection-methods-25.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/collection-methods.html\nDECLARE\n  TYPE Arr_Type IS VARRAY(10) OF NUMBER;\n  v_Numbers Arr_Type := Arr_Type();\nBEGIN\n  v_Numbers.EXTEND(4);\n\n  v_Numbers (1) := 10;\n  v_Numbers (2) := 20;\n  v_Numbers (3) := 30;\n  v_Numbers (4) := 40;\n\n  DBMS_OUTPUT.PUT_LINE(NVL(v_Numbers.prior (3400), -1));\n  DBMS_OUTPUT.PUT_LINE(NVL(v_Numbers.next (3400), -1));\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/collection-methods-27.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/collection-methods.html\nDECLARE\n  TYPE nt_type IS TABLE OF NUMBER;\n  nt nt_type := nt_type(18, NULL, 36, 45, 54, 63);\n\nBEGIN\n  nt.DELETE(4);\n  DBMS_OUTPUT.PUT_LINE('nt(4) was deleted.');\n\n  FOR i IN 1..7 LOOP\n    DBMS_OUTPUT.PUT('nt.PRIOR(' || i || ') = ');\n    DBMS_OUTPUT.PUT_LINE(NVL(TO_CHAR(nt.PRIOR(i)), 'NULL'));\n\n    DBMS_OUTPUT.PUT('nt.NEXT(' || i || ')  = ');\n    DBMS_OUTPUT.PUT_LINE(NVL(TO_CHAR(nt.NEXT(i)), 'NULL'));\n  END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/collection-methods-29.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/collection-methods.html\nDECLARE\n  TYPE NumList IS TABLE OF NUMBER;\n  n NumList := NumList(1, 2, NULL, NULL, 5, NULL, 7, 8, 9, NULL);\n  idx INTEGER;\n\nBEGIN\n  DBMS_OUTPUT.PUT_LINE('First to last:');\n  idx := n.FIRST;\n  WHILE idx IS NOT NULL LOOP\n    DBMS_OUTPUT.PUT('n(' || idx || ') = ');\n    DBMS_OUTPUT.PUT_LINE(NVL(TO_CHAR(n(idx)), 'NULL'));\n    idx := n.NEXT(idx);\n  END LOOP;\n\n  DBMS_OUTPUT.PUT_LINE('--------------');\n\n  DBMS_OUTPUT.PUT_LINE('Last to first:');\n  idx := n.LAST;\n  WHILE idx IS NOT NULL LOOP\n    DBMS_OUTPUT.PUT('n(' || idx || ') = ');\n    DBMS_OUTPUT.PUT_LINE(NVL(TO_CHAR(n(idx)), 'NULL'));\n    idx := n.PRIOR(idx);\n  END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/collection-methods-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/collection-methods.html\nDECLARE\n  TYPE aa_type_str IS TABLE OF INTEGER INDEX BY VARCHAR2(10);\n  aa_str  aa_type_str;\n\n  PROCEDURE print_aa_str IS\n    i  VARCHAR2(10);\n  BEGIN\n    i := aa_str.FIRST;\n\n    IF i IS NULL THEN\n      DBMS_OUTPUT.PUT_LINE('aa_str is empty');\n    ELSE\n      WHILE i IS NOT NULL LOOP\n        DBMS_OUTPUT.PUT('aa_str.(' || i || ') = ');\n        DBMS_OUTPUT.PUT_LINE(NVL(TO_CHAR(aa_str(i)), 'NULL'));\n        i := aa_str.NEXT(i);\n      END LOOP;\n    END IF;\n\n    DBMS_OUTPUT.PUT_LINE('---');\n  END print_aa_str;\n\nBEGIN\n  aa_str('M') := 13;\n  aa_str('Z') := 26;\n  aa_str('C') := 3;\n  print_aa_str;\n\n  aa_str.DELETE;  -- Delete all elements\n  print_aa_str;\n\n  aa_str('M') := 13;   -- Replace deleted element with same value\n  aa_str('Z') := 260;  -- Replace deleted element with new value\n  aa_str('C') := 30;   -- Replace deleted element with new value\n  aa_str('W') := 23;   -- Add new element\n  aa_str('J') := 10;   -- Add new element\n  aa_str('N') := 14;   -- Add new element\n  aa_str('P') := 16;   -- Add new element\n  aa_str('W') := 23;   -- Add new element\n  aa_str('J') := 10;   -- Add new element\n  print_aa_str;\n\n  aa_str.DELETE('C');      -- Delete one element\n  print_aa_str;\n\n  aa_str.DELETE('N','W');  -- Delete range of elements\n  print_aa_str;\n\n  aa_str.DELETE('Z','M');  -- Does nothing\n  print_aa_str;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/collection-methods-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/collection-methods.html\nDECLARE\n  nt nt_type := nt_type(11, 22, 33, 44, 55, 66);\nBEGIN\n  print_nt(nt);\n\n  nt.TRIM;       -- Trim last element\n  print_nt(nt);\n\n  nt.DELETE(4);  -- Delete fourth element\n  print_nt(nt);\n\n  nt.TRIM(2);    -- Trim last two elements\n  print_nt(nt);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/collection-methods-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/collection-methods.html\nDECLARE\n  nt nt_type := nt_type(11, 22, 33);\nBEGIN\n  print_nt(nt);\n\n  nt.EXTEND(2,1);  -- Append two copies of first element\n  print_nt(nt);\n\n  nt.DELETE(5);    -- Delete fifth element\n  print_nt(nt);\n\n  nt.EXTEND;       -- Append one null element\n  print_nt(nt);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/collection-methods-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/collection-methods.html\nDECLARE\n  TYPE NumList IS TABLE OF INTEGER;\n  n NumList := NumList(1,3,5,7);\nBEGIN\n  n.DELETE(2); -- Delete second element\n\n  FOR i IN 1..6 LOOP\n    IF n.EXISTS(i) THEN\n      DBMS_OUTPUT.PUT_LINE('n(' || i || ') = ' || n(i));\n    ELSE\n      DBMS_OUTPUT.PUT_LINE('n(' || i || ') does not exist');\n    END IF;\n  END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/collection-types-defined-package-specifications-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/collection-types-defined-package-specifications.html\nCREATE OR REPLACE PACKAGE pkg AS\n  TYPE NumList IS TABLE OF NUMBER;\n  PROCEDURE print_numlist (nums NumList);\nEND pkg;\n/\nCREATE OR REPLACE PACKAGE BODY pkg AS\n  PROCEDURE print_numlist (nums NumList) IS\n  BEGIN\n    FOR i IN nums.FIRST..nums.LAST LOOP\n      DBMS_OUTPUT.PUT_LINE(nums(i));\n    END LOOP;\n  END;\nEND pkg;\n/\nDECLARE\n  TYPE NumList IS TABLE OF NUMBER;  -- local type identical to package type\n  n1 pkg.NumList := pkg.NumList(2,4);  -- package type\n  n2     NumList :=     NumList(6,8);  -- local type\nBEGIN\n  pkg.print_numlist(n1);  -- succeeds\n  pkg.print_numlist(n2);  -- fails\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/collection-types-defined-package-specifications-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/collection-types-defined-package-specifications.html\nCREATE OR REPLACE TYPE NumList IS TABLE OF NUMBER;\n  -- standalone collection type identical to package type\n/\nDECLARE\n  n1 pkg.NumList := pkg.NumList(2,4);  -- package type\n  n2     NumList :=     NumList(6,8);  -- standalone type\n\nBEGIN\n  pkg.print_numlist(n1);  -- succeeds\n  pkg.print_numlist(n2);  -- fails\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/column-name-precedence-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/column-name-precedence.html\nDROP TABLE employees2;\nCREATE TABLE employees2 AS\n  SELECT LAST_NAME FROM employees;\nDECLARE\n  last_name  VARCHAR2(10) := 'King';\nBEGIN\n  DELETE FROM employees2 WHERE LAST_NAME = last_name;\n  DBMS_OUTPUT.PUT_LINE('Deleted ' || SQL%ROWCOUNT || ' rows.');\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/column-name-precedence-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/column-name-precedence.html\nDROP TABLE employees2;\nCREATE TABLE employees2 AS\n  SELECT LAST_NAME FROM employees;\nDECLARE\n  v_last_name  VARCHAR2(10) := 'King';\nBEGIN\n  DELETE FROM employees2 WHERE LAST_NAME = v_last_name;\n  DBMS_OUTPUT.PUT_LINE('Deleted ' || SQL%ROWCOUNT || ' rows.');\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/column-name-precedence-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/column-name-precedence.html\nDROP TABLE employees2;\nCREATE TABLE employees2 AS\n  SELECT LAST_NAME FROM employees;\n<<main>>\nDECLARE\n  last_name  VARCHAR2(10) := 'King';\nBEGIN\n  DELETE FROM employees2 WHERE last_name = main.last_name;\n  DBMS_OUTPUT.PUT_LINE('Deleted ' || SQL%ROWCOUNT || ' rows.');\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/column-name-precedence-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/column-name-precedence.html\nDECLARE\n  FUNCTION dept_name (department_id IN NUMBER)\n    RETURN departments.department_name%TYPE\n  IS\n    department_name  departments.department_name%TYPE;\n  BEGIN\n    SELECT department_name INTO dept_name.department_name\n      --    ^column               ^local variable\n    FROM departments\n    WHERE department_id = dept_name.department_id;\n    --     ^column          ^formal parameter\n    RETURN department_name;\n  END dept_name;\nBEGIN\n  FOR item IN (\n    SELECT department_id\n    FROM departments\n    ORDER BY department_name) LOOP\n\n      DBMS_OUTPUT.PUT_LINE ('Department: ' || dept_name(item.department_id));\n  END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/compile-time-warnings-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/compile-time-warnings.html\nALTER SESSION SET PLSQL_WARNINGS='ENABLE:ALL';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/compile-time-warnings-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/compile-time-warnings.html\nALTER PROCEDURE unreachable_code COMPILE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/compile-time-warnings-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/compile-time-warnings.html\nSHOW ERRORS\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/compile-time-warnings-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/compile-time-warnings.html\nALTER SESSION SET PLSQL_WARNINGS='ENABLE:PERFORMANCE';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/compile-time-warnings-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/compile-time-warnings.html\nALTER PROCEDURE loc_var\n  COMPILE PLSQL_WARNINGS='ENABLE:PERFORMANCE'\n  REUSE SETTINGS;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/compile-time-warnings-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/compile-time-warnings.html\nALTER SESSION\n  SET PLSQL_WARNINGS='ENABLE:SEVERE', 'DISABLE:PERFORMANCE', 'ERROR:06002';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/compile-time-warnings-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/compile-time-warnings.html\nALTER SESSION SET PLSQL_WARNINGS='DISABLE:ALL';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/compile-time-warnings-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/compile-time-warnings.html\nALTER SESSION SET PLSQL_WARNINGS='DISABLE:ALL';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/compile-time-warnings-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/compile-time-warnings.html\nCREATE OR REPLACE PROCEDURE unreachable_code AUTHID DEFINER AS\n  x CONSTANT BOOLEAN := TRUE;\nBEGIN\n  IF x THEN\n    DBMS_OUTPUT.PUT_LINE('TRUE');\n  ELSE\n    DBMS_OUTPUT.PUT_LINE('FALSE');\n  END IF;\nEND unreachable_code;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/compile-time-warnings-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/compile-time-warnings.html\nCALL DBMS_WARNING.set_warning_setting_string ('ENABLE:ALL', 'SESSION');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/compile-time-warnings-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/compile-time-warnings.html\nSELECT DBMS_WARNING.get_warning_setting_string() FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/compiling-pl-sql-units-native-execution-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/compiling-pl-sql-units-native-execution.html\nALTER PROCEDURE my_proc COMPILE PLSQL_CODE_TYPE=NATIVE REUSE SETTINGS;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/compiling-pl-sql-units-native-execution-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/compiling-pl-sql-units-native-execution.html\n  SPOOL pre_update_invalid.log\n\nSELECT o.OWNER, o.OBJECT_NAME, o.OBJECT_TYPE \nFROM DBA_OBJECTS o, DBA_PLSQL_OBJECT_SETTINGS s \nWHERE o.OBJECT_NAME = s.NAME AND o.STATUS='INVALID';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/compiling-pl-sql-units-native-execution-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/compiling-pl-sql-units-native-execution.html\nALTER PACKAGE SYS.DBMS_OUTPUT COMPILE BODY REUSE SETTINGS;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/compiling-pl-sql-units-native-execution-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/compiling-pl-sql-units-native-execution.html\nSELECT TYPE, PLSQL_CODE_TYPE, COUNT(*)\nFROM DBA_PLSQL_OBJECT_SETTINGS\nWHERE PLSQL_CODE_TYPE IS NOT NULL AND ORIGIN_CON_ID=SYS_CONTEXT('USERENV', 'CON_ID')\nGROUP BY TYPE, PLSQL_CODE_TYPE\nORDER BY TYPE, PLSQL_CODE_TYPE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/compiling-pl-sql-units-native-execution-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/compiling-pl-sql-units-native-execution.html\nALTER SYSTEM ENABLE RESTRICTED SESSION;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/compiling-pl-sql-units-native-execution-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/compiling-pl-sql-units-native-execution.html\nALTER SYSTEM DISABLE RESTRICTED SESSION;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/conditional-compilation1-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/conditional-compilation1.html\nBEGIN\n  DBMS_OUTPUT.PUT_LINE('$$PLSCOPE_SETTINGS = '     || $$PLSCOPE_SETTINGS);\n  DBMS_OUTPUT.PUT_LINE('$$PLSQL_CCFLAGS = '        || $$PLSQL_CCFLAGS);\n  DBMS_OUTPUT.PUT_LINE('$$PLSQL_CODE_TYPE = '      || $$PLSQL_CODE_TYPE);\n  DBMS_OUTPUT.PUT_LINE('$$PLSQL_OPTIMIZE_LEVEL = ' || $$PLSQL_OPTIMIZE_LEVEL);\n  DBMS_OUTPUT.PUT_LINE('$$PLSQL_WARNINGS = '       || $$PLSQL_WARNINGS);\n  DBMS_OUTPUT.PUT_LINE('$$NLS_LENGTH_SEMANTICS = ' || $$NLS_LENGTH_SEMANTICS);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/conditional-compilation1-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/conditional-compilation1.html\nALTER SESSION SET PLSQL_CCFLAGS = \n  'name1:value1, name2:value2, ... namen:valuen'"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/conditional-compilation1-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/conditional-compilation1.html\nALTER SESSION SET PLSQL_CCFLAGS = 'flag:TRUE, flag:5'"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/conditional-compilation1-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/conditional-compilation1.html\nALTER SESSION SET\nPLSQL_CCFlags = 'Some_Flag:1, Some_Flag:2, PLSQL_CCFlags:99'\n/\nBEGIN\n  DBMS_OUTPUT.PUT_LINE($$Some_Flag);\n  DBMS_OUTPUT.PUT_LINE($$PLSQL_CCFlags);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/conditional-compilation1-18.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/conditional-compilation1.html\nALTER SESSION SET PLSQL_CCFLAGS = 'my_debug:FALSE, my_tracing:FALSE';\nCREATE OR REPLACE PACKAGE my_pkg AUTHID DEFINER AS\n  SUBTYPE my_real IS\n    $IF DBMS_DB_VERSION.VERSION < 10 $THEN\n      NUMBER;\n    $ELSE\n      BINARY_DOUBLE;\n    $END\n\n  my_pi my_real;\n  my_e  my_real;\nEND my_pkg;\n/\nCREATE OR REPLACE PACKAGE BODY my_pkg AS\nBEGIN\n  $IF DBMS_DB_VERSION.VERSION < 10 $THEN\n    my_pi := 3.14159265358979323846264338327950288420;\n    my_e  := 2.71828182845904523536028747135266249775;\n  $ELSE\n    my_pi := 3.14159265358979323846264338327950288420d;\n    my_e  := 2.71828182845904523536028747135266249775d;\n  $END\nEND my_pkg;\n/\nCREATE OR REPLACE PROCEDURE circle_area(radius my_pkg.my_real) AUTHID DEFINER IS\n  my_area       my_pkg.my_real;\n  my_data_type  VARCHAR2(30);\nBEGIN\n  my_area := my_pkg.my_pi * (radius**2);\n\n  DBMS_OUTPUT.PUT_LINE\n    ('Radius: ' || TO_CHAR(radius) || ' Area: ' || TO_CHAR(my_area));\n\n  $IF $$my_debug $THEN\n    SELECT DATA_TYPE INTO my_data_type\n    FROM USER_ARGUMENTS\n    WHERE OBJECT_NAME = 'CIRCLE_AREA'\n    AND ARGUMENT_NAME = 'RADIUS';\n\n    DBMS_OUTPUT.PUT_LINE\n      ('Data type of the RADIUS argument is: ' || my_data_type);\n  $END\nEND;\n/\nCALL DBMS_PREPROCESSOR.PRINT_POST_PROCESSED_SOURCE\n ('PACKAGE', 'HR', 'MY_PKG');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/conditional-compilation1-20.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/conditional-compilation1.html\nCALL DBMS_PREPROCESSOR.PRINT_POST_PROCESSED_SOURCE (\n  'PACKAGE', 'HR', 'MY_PKG'\n);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/conditional-compilation1-21.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/conditional-compilation1.html\nCREATE PACKAGE my_pkg AUTHID DEFINERs AS\nSUBTYPE my_real IS\nBINARY_DOUBLE;\nmy_pi my_real;\nmy_e my_real;\nEND my_pkg;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/conditional-compilation1-23.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/conditional-compilation1.html\nCREATE OR REPLACE PACKAGE cc_pkg\nAUTHID DEFINER\n$IF $$XFLAG $THEN ACCESSIBLE BY(p1_pkg) $END\nIS\n    i NUMBER := 10;\n    trace CONSTANT BOOLEAN := TRUE;\nEND cc_pkg;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/conditional-compilation1-25.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/conditional-compilation1.html\nCREATE OR REPLACE PROCEDURE my_proc (\n  $IF $$xxx $THEN i IN PLS_INTEGER $ELSE i IN INTEGER $END\n) IS \nBEGIN \n      NULL; \nEND my_proc;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/conditional-selection-statements-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/conditional-selection-statements.html\nDECLARE\n  PROCEDURE p (\n    sales  NUMBER,\n    quota  NUMBER,\n    emp_id NUMBER\n  )\n  IS\n    bonus  NUMBER := 0;\n  BEGIN\n    IF sales > (quota + 200) THEN\n      bonus := (sales - quota)/4;\n    ELSE\n      IF sales > quota THEN\n        bonus := 50;\n      ELSE\n        bonus := 0;\n      END IF;\n    END IF;\n\n    DBMS_OUTPUT.PUT_LINE('bonus = ' || bonus);\n\n    UPDATE employees\n    SET salary = salary + bonus \n    WHERE employee_id = emp_id;\n  END p;\nBEGIN\n  p(10100, 10000, 120);\n  p(10500, 10000, 121);\n  p(9500, 10000, 122);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/conditional-selection-statements-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/conditional-selection-statements.html\nDECLARE\n  PROCEDURE p (sales NUMBER)\n  IS\n    bonus  NUMBER := 0;\n  BEGIN \n    IF sales > 50000 THEN\n      bonus := 1500;\n    ELSIF sales > 35000 THEN\n      bonus := 500;\n    ELSE\n      bonus := 100;\n    END IF;\n\n    DBMS_OUTPUT.PUT_LINE (\n      'Sales = ' || sales || ', bonus = ' || bonus || '.'\n    );\n  END p;\nBEGIN\n  p(55000);\n  p(40000);\n  p(30000);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/conditional-selection-statements-16.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/conditional-selection-statements.html\nDECLARE\n  grade CHAR(1);\nBEGIN\n  grade := 'B';\n\n  IF grade = 'A' THEN\n    DBMS_OUTPUT.PUT_LINE('Excellent');\n  ELSIF grade = 'B' THEN\n    DBMS_OUTPUT.PUT_LINE('Very Good');\n  ELSIF grade = 'C' THEN\n    DBMS_OUTPUT.PUT_LINE('Good');\n  ELSIF grade = 'D' THEN\n    DBMS_OUTPUT. PUT_LINE('Fair');\n  ELSIF grade = 'F' THEN\n    DBMS_OUTPUT.PUT_LINE('Poor');\n  ELSE\n    DBMS_OUTPUT.PUT_LINE('No such grade');\n  END IF;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/conditional-selection-statements-19.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/conditional-selection-statements.html\nDECLARE\n  grade CHAR(1);\nBEGIN\n  grade := 'B';\n\n  CASE grade\n    WHEN 'A' THEN DBMS_OUTPUT.PUT_LINE('Excellent');\n    WHEN 'B' THEN DBMS_OUTPUT.PUT_LINE('Very Good');\n    WHEN 'C' THEN DBMS_OUTPUT.PUT_LINE('Good');\n    WHEN 'D' THEN DBMS_OUTPUT.PUT_LINE('Fair');\n    WHEN 'F' THEN DBMS_OUTPUT.PUT_LINE('Poor');\n    ELSE DBMS_OUTPUT.PUT_LINE('No such grade');\n  END CASE;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/conditional-selection-statements-21.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/conditional-selection-statements.html\nDECLARE\n  grade NUMBER;\nBEGIN\n  grade := '85';\n\n  CASE grade\n    WHEN < 0, > 100 THEN DBMS_OUTPUT.PUT_LINE('No such grade');\n    WHEN > 89 THEN DBMS_OUTPUT.PUT_LINE('A');\n    WHEN > 79 THEN DBMS_OUTPUT.PUT_LINE('B');\n    WHEN > 69 THEN DBMS_OUTPUT.PUT_LINE('C');\n    WHEN > 59 THEN DBMS_OUTPUT.PUT_LINE('D');\n    ELSE DBMS_OUTPUT.PUT_LINE('F');\n  END CASE;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/conditional-selection-statements-24.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/conditional-selection-statements.html\nDECLARE\n  grade CHAR(1);\nBEGIN\n  grade := 'B';\n\n  CASE\n    WHEN grade = 'A' THEN DBMS_OUTPUT.PUT_LINE('Excellent');\n    WHEN grade = 'B' THEN DBMS_OUTPUT.PUT_LINE('Very Good');\n    WHEN grade = 'C' THEN DBMS_OUTPUT.PUT_LINE('Good');\n    WHEN grade = 'D' THEN DBMS_OUTPUT.PUT_LINE('Fair');\n    WHEN grade = 'F' THEN DBMS_OUTPUT.PUT_LINE('Poor');\n    ELSE DBMS_OUTPUT.PUT_LINE('No such grade');\n  END CASE;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/conditional-selection-statements-26.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/conditional-selection-statements.html\nDECLARE\n  grade CHAR(1);\nBEGIN\n  grade := 'B';\n\n  CASE\n    WHEN grade = 'A' THEN DBMS_OUTPUT.PUT_LINE('Excellent');\n    WHEN grade = 'B' THEN DBMS_OUTPUT.PUT_LINE('Very Good');\n    WHEN grade = 'C' THEN DBMS_OUTPUT.PUT_LINE('Good');\n    WHEN grade = 'D' THEN DBMS_OUTPUT.PUT_LINE('Fair');\n    WHEN grade = 'F' THEN DBMS_OUTPUT.PUT_LINE('Poor');\n  END CASE;\nEXCEPTION\n  WHEN CASE_NOT_FOUND THEN\n    DBMS_OUTPUT.PUT_LINE('No such grade');\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/conditional-selection-statements-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/conditional-selection-statements.html\nDECLARE\n  PROCEDURE p (\n    sales  NUMBER,\n    quota  NUMBER,\n    emp_id NUMBER\n  )\n  IS\n    bonus    NUMBER := 0;\n    updated  VARCHAR2(3) := 'No';\n  BEGIN\n    IF sales > (quota + 200) THEN\n      bonus := (sales - quota)/4;\n\n      UPDATE employees\n      SET salary = salary + bonus \n      WHERE employee_id = emp_id;\n\n      updated := 'Yes';\n    END IF;\n\n    DBMS_OUTPUT.PUT_LINE (\n      'Table updated?  ' || updated || ', ' || \n      'bonus = ' || bonus || '.'\n    );\n  END p;\nBEGIN\n  p(10100, 10000, 120);\n  p(10500, 10000, 121);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/conditional-selection-statements-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/conditional-selection-statements.html\nDECLARE\n  PROCEDURE p (\n    sales  NUMBER,\n    quota  NUMBER,\n    emp_id NUMBER\n  )\n  IS\n    bonus  NUMBER := 0;\n  BEGIN\n    IF sales > (quota + 200) THEN\n      bonus := (sales - quota)/4;\n    ELSE\n      bonus := 50;\n    END IF;\n\n    DBMS_OUTPUT.PUT_LINE('bonus = ' || bonus);\n\n    UPDATE employees\n    SET salary = salary + bonus \n    WHERE employee_id = emp_id;\n  END p;\nBEGIN\n  p(10100, 10000, 120);\n  p(10500, 10000, 121);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/continuing-execution-handling-exceptions-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/continuing-execution-handling-exceptions.html\nDROP TABLE employees_temp;\nCREATE TABLE employees_temp AS\n  SELECT employee_id, salary, commission_pct\n  FROM employees;\nDECLARE\n  sal_calc NUMBER(8,2);\nBEGIN\n  INSERT INTO employees_temp (employee_id, salary, commission_pct)\n  VALUES (301, 2500, 0);\n\n  SELECT (salary / commission_pct) INTO sal_calc\n  FROM employees_temp\n  WHERE employee_id = 301;\n\n  INSERT INTO employees_temp VALUES (302, sal_calc/100, .1);\n  DBMS_OUTPUT.PUT_LINE('Row inserted.');\nEXCEPTION\n  WHEN ZERO_DIVIDE THEN\n    DBMS_OUTPUT.PUT_LINE('Division by zero.');\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/continuing-execution-handling-exceptions-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/continuing-execution-handling-exceptions.html\nDECLARE\n  sal_calc NUMBER(8,2);\nBEGIN\n  INSERT INTO employees_temp (employee_id, salary, commission_pct)\n  VALUES (301, 2500, 0);\n\n  BEGIN\n    SELECT (salary / commission_pct) INTO sal_calc\n    FROM employees_temp\n    WHERE employee_id = 301;\n  EXCEPTION\n    WHEN ZERO_DIVIDE THEN\n      DBMS_OUTPUT.PUT_LINE('Substituting 2500 for undefined number.');\n      sal_calc := 2500;\n  END;\n\n  INSERT INTO employees_temp VALUES (302, sal_calc/100, .1);\n  DBMS_OUTPUT.PUT_LINE('Enclosing block: Row inserted.');\nEXCEPTION\n  WHEN ZERO_DIVIDE THEN\n    DBMS_OUTPUT.PUT_LINE('Enclosing block: Division by zero.');\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/correlation-names-and-pseudorecords-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/correlation-names-and-pseudorecords.html\nUPDATE employees\nSET salary = salary * 1.05\nWHERE department_id IN (10, 20, 90);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/correlation-names-and-pseudorecords-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/correlation-names-and-pseudorecords.html\nSELECT salary FROM employees WHERE job_id = 'AD_PRES';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/correlation-names-and-pseudorecords-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/correlation-names-and-pseudorecords.html\nDROP TABLE tab1;\nCREATE TABLE tab1 (c1 CLOB);\nINSERT INTO tab1 VALUES ('<h1>HTML Document Fragment</h1><p>Some text.', 3);\nCREATE OR REPLACE TRIGGER trg1\n  BEFORE UPDATE ON tab1\n  FOR EACH ROW\nBEGIN\n  DBMS_OUTPUT.PUT_LINE('Old value of CLOB column: '||:OLD.c1);\n  DBMS_OUTPUT.PUT_LINE('Proposed new value of CLOB column: '||:NEW.c1);\n\n  :NEW.c1 := :NEW.c1 || TO_CLOB('<hr><p>Standard footer paragraph.');\n\n  DBMS_OUTPUT.PUT_LINE('Final value of CLOB column: '||:NEW.c1);\nEND;\n/\nSET SERVEROUTPUT ON;\nUPDATE tab1 SET c1 = '<h1>Different Document Fragment</h1><p>Different text.';\nSELECT * FROM tab1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/correlation-names-and-pseudorecords-16.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/correlation-names-and-pseudorecords.html\nCREATE TABLE new (\n  field1  NUMBER,\n  field2  VARCHAR2(20)\n);\nCREATE OR REPLACE TRIGGER Print_salary_changes\nBEFORE UPDATE ON new\nREFERENCING new AS Newest\nFOR EACH ROW\nBEGIN\n  :Newest.Field2 := TO_CHAR (:newest.field1);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/correlation-names-and-pseudorecords-17.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/correlation-names-and-pseudorecords.html\nCREATE OR REPLACE TYPE t AUTHID DEFINER AS OBJECT (n NUMBER, m NUMBER)\n/\nCREATE TABLE tbl OF t\n/\nBEGIN\n  FOR j IN 1..5 LOOP\n    INSERT INTO tbl VALUES (t(j, 0));\n  END LOOP;\nEND;\n/\nSELECT * FROM tbl ORDER BY n;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/correlation-names-and-pseudorecords-19.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/correlation-names-and-pseudorecords.html\nCREATE TABLE tbl_history ( d DATE, old_obj t, new_obj t)\n/\nCREATE OR REPLACE TRIGGER Tbl_Trg\n  AFTER UPDATE ON tbl\n  FOR EACH ROW\nBEGIN\n  INSERT INTO tbl_history (d, old_obj, new_obj)\n  VALUES (SYSDATE, :OLD.OBJECT_VALUE, :NEW.OBJECT_VALUE);\nEND Tbl_Trg;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/correlation-names-and-pseudorecords-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/correlation-names-and-pseudorecords.html\nDROP TABLE Emp_log;\nCREATE TABLE Emp_log (\n  Emp_id     NUMBER,\n  Log_date   DATE,\n  New_salary NUMBER,\n  Action     VARCHAR2(20));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/correlation-names-and-pseudorecords-20.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/correlation-names-and-pseudorecords.html\nUPDATE tbl SET tbl.n = tbl.n+1\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/correlation-names-and-pseudorecords-22.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/correlation-names-and-pseudorecords.html\nBEGIN\n  FOR j IN (SELECT d, old_obj, new_obj FROM tbl_history) LOOP\n    DBMS_OUTPUT.PUT_LINE (\n      j.d ||\n      ' -- old: ' || j.old_obj.n || ' ' || j.old_obj.m ||\n      ' -- new: ' || j.new_obj.n || ' ' || j.new_obj.m\n    );\n  END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/correlation-names-and-pseudorecords-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/correlation-names-and-pseudorecords.html\nCREATE OR REPLACE TRIGGER log_salary_increase\n  AFTER UPDATE OF salary ON employees\n  FOR EACH ROW\nBEGIN\n  INSERT INTO Emp_log (Emp_id, Log_date, New_salary, Action)\n  VALUES (:NEW.employee_id, SYSDATE, :NEW.salary, 'New Salary');\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/correlation-names-and-pseudorecords-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/correlation-names-and-pseudorecords.html\nUPDATE employees\nSET salary = salary + 1000.0\nWHERE Department_id = 20;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/correlation-names-and-pseudorecords-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/correlation-names-and-pseudorecords.html\nSELECT * FROM Emp_log;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/correlation-names-and-pseudorecords-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/correlation-names-and-pseudorecords.html\nCREATE OR REPLACE TRIGGER print_salary_changes\n  BEFORE DELETE OR INSERT OR UPDATE ON employees\n  FOR EACH ROW\n  WHEN (NEW.job_id <> 'AD_PRES')  -- do not print information about President\nDECLARE\n  sal_diff  NUMBER;\nBEGIN\n  sal_diff  := :NEW.salary  - :OLD.salary;\n  DBMS_OUTPUT.PUT(:NEW.last_name || ': ');\n  DBMS_OUTPUT.PUT('Old salary = ' || :OLD.salary || ', ');\n  DBMS_OUTPUT.PUT('New salary = ' || :NEW.salary || ', ');\n  DBMS_OUTPUT.PUT_LINE('Difference: ' || sal_diff);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/correlation-names-and-pseudorecords-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/correlation-names-and-pseudorecords.html\nSELECT last_name, department_id, salary, job_id\nFROM employees\nWHERE department_id IN (10, 20, 90)\nORDER BY department_id, last_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/cursor-expressions-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/cursor-expressions.html\nDECLARE\n  TYPE emp_cur_typ IS REF CURSOR;\n\n  emp_cur    emp_cur_typ;\n  dept_name  departments.department_name%TYPE;\n  emp_name   employees.last_name%TYPE;\n\n  CURSOR c1 IS\n    SELECT department_name,\n      CURSOR ( SELECT e.last_name\n                FROM employees e\n                WHERE e.department_id = d.department_id\n                ORDER BY e.last_name\n              ) employees\n    FROM departments d\n    WHERE department_name LIKE 'A%'\n    ORDER BY department_name;\nBEGIN\n  OPEN c1;\n  LOOP  -- Process each row of query result set\n    FETCH c1 INTO dept_name, emp_cur;\n    EXIT WHEN c1%NOTFOUND;\n    DBMS_OUTPUT.PUT_LINE('Department: ' || dept_name);\n\n    LOOP -- Process each row of subquery result set\n      FETCH emp_cur INTO emp_name;\n      EXIT WHEN emp_cur%NOTFOUND;\n      DBMS_OUTPUT.PUT_LINE('-- Employee: ' || emp_name);\n    END LOOP;\n  END LOOP;\n  CLOSE c1;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/cursor-variables-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/cursor-variables.html\nDECLARE\n  TYPE empcurtyp IS REF CURSOR RETURN employees%ROWTYPE;  -- strong type\n  TYPE genericcurtyp IS REF CURSOR;                       -- weak type\n\n  cursor1  empcurtyp;       -- strong cursor variable\n  cursor2  genericcurtyp;   -- weak cursor variable\n  my_cursor SYS_REFCURSOR;  -- weak cursor variable\n\n  TYPE deptcurtyp IS REF CURSOR RETURN departments%ROWTYPE;  -- strong type\n  dept_cv deptcurtyp;  -- strong cursor variable\nBEGIN\n  NULL;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/cursor-variables-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/cursor-variables.html\nDECLARE\n  sal           employees.salary%TYPE;\n  sal_multiple  employees.salary%TYPE;\n  factor        INTEGER := 2;\n\n  cv SYS_REFCURSOR;\n\nBEGIN\n  DBMS_OUTPUT.PUT_LINE('factor = ' || factor);\n\n  OPEN cv FOR\n    SELECT salary, salary*factor\n    FROM employees\n    WHERE job_id LIKE 'AD_%';   -- PL/SQL evaluates factor\n\n  LOOP\n    FETCH cv INTO sal, sal_multiple;\n    EXIT WHEN cv%NOTFOUND;\n    DBMS_OUTPUT.PUT_LINE('sal          = ' || sal);\n    DBMS_OUTPUT.PUT_LINE('sal_multiple = ' || sal_multiple);\n  END LOOP;\n\n  factor := factor + 1;\n\n  DBMS_OUTPUT.PUT_LINE('factor = ' || factor);\n\n  OPEN cv FOR\n    SELECT salary, salary*factor\n    FROM employees\n    WHERE job_id LIKE 'AD_%';   -- PL/SQL evaluates factor\n\n  LOOP\n    FETCH cv INTO sal, sal_multiple;\n    EXIT WHEN cv%NOTFOUND;\n    DBMS_OUTPUT.PUT_LINE('sal          = ' || sal);\n    DBMS_OUTPUT.PUT_LINE('sal_multiple = ' || sal_multiple);\n  END LOOP;\n\n  CLOSE cv;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/cursor-variables-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/cursor-variables.html\nCREATE OR REPLACE PACKAGE pkg AUTHID DEFINER AS\n  TYPE rec IS RECORD(f1 NUMBER, f2 VARCHAR2(30));\n  TYPE mytab IS TABLE OF rec INDEX BY pls_integer;\nEND;\n/\nDECLARE\n  v1 pkg.mytab;  -- collection of records\n  v2 pkg.rec;\n  c1 SYS_REFCURSOR;\nBEGIN\n  v1(1).f1 := 1;\n  v1(1).f2 := 'one';\n  OPEN c1 FOR SELECT * FROM TABLE(v1);\n  FETCH c1 INTO v2;\n  CLOSE c1;\n  DBMS_OUTPUT.PUT_LINE('Values in record are ' || v2.f1 || ' and ' || v2.f2);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/cursor-variables-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/cursor-variables.html\nCREATE OR REPLACE PACKAGE emp_data AUTHID DEFINER AS\n  TYPE empcurtyp IS REF CURSOR RETURN employees%ROWTYPE;\n  PROCEDURE open_emp_cv (emp_cv IN OUT empcurtyp);\nEND emp_data;\n/\nCREATE OR REPLACE PACKAGE BODY emp_data AS\n  PROCEDURE open_emp_cv (emp_cv IN OUT EmpCurTyp) IS\n  BEGIN\n    OPEN emp_cv FOR SELECT * FROM employees;\n  END open_emp_cv;\nEND emp_data;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/cursor-variables-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/cursor-variables.html\nCREATE OR REPLACE PACKAGE emp_data AUTHID DEFINER AS\n  TYPE empcurtyp IS REF CURSOR RETURN employees%ROWTYPE;\n  PROCEDURE open_emp_cv (emp_cv IN OUT empcurtyp, choice INT);\nEND emp_data;\n/\nCREATE OR REPLACE PACKAGE BODY emp_data AS\n  PROCEDURE open_emp_cv (emp_cv IN OUT empcurtyp, choice INT) IS\n  BEGIN\n    IF choice = 1 THEN\n      OPEN emp_cv FOR SELECT *\n      FROM employees\n      WHERE commission_pct IS NOT NULL;\n    ELSIF choice = 2 THEN\n      OPEN emp_cv FOR SELECT *\n      FROM employees\n      WHERE salary > 2500;\n    ELSIF choice = 3 THEN\n      OPEN emp_cv FOR SELECT *\n      FROM employees\n      WHERE department_id = 100;\n    END IF;\n  END;\nEND emp_data;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/cursor-variables-16.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/cursor-variables.html\nCREATE OR REPLACE PACKAGE admin_data AUTHID DEFINER AS\n  TYPE gencurtyp IS REF CURSOR;\n  PROCEDURE open_cv (generic_cv IN OUT gencurtyp, choice INT);\nEND admin_data;\n/\nCREATE OR REPLACE PACKAGE BODY admin_data AS\n  PROCEDURE open_cv (generic_cv IN OUT gencurtyp, choice INT) IS\n  BEGIN\n    IF choice = 1 THEN\n      OPEN generic_cv FOR SELECT * FROM employees;\n    ELSIF choice = 2 THEN\n      OPEN generic_cv FOR SELECT * FROM departments;\n    ELSIF choice = 3 THEN\n      OPEN generic_cv FOR SELECT * FROM jobs;\n    END IF;\n  END;\nEND admin_data;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/cursor-variables-17.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/cursor-variables.html\nBEGIN\n  OPEN :emp_cv FOR SELECT * FROM employees;\n  OPEN :dept_cv FOR SELECT * FROM departments;\n  OPEN :loc_cv FOR SELECT * FROM locations;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/cursor-variables-18.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/cursor-variables.html\nBEGIN\n  CLOSE :emp_cv;\n  CLOSE :dept_cv;\n  CLOSE :loc_cv;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/cursor-variables-19.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/cursor-variables.html\nBEGIN\n  OPEN :c1 FOR SELECT 1 FROM DUAL;\n  OPEN :c2 FOR SELECT 1 FROM DUAL;\n  OPEN :c3 FOR SELECT 1 FROM DUAL;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/cursor-variables-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/cursor-variables.html\nDECLARE\n  TYPE EmpRecTyp IS RECORD (\n    employee_id NUMBER,\n    last_name VARCHAR2(25),\n    salary   NUMBER(8,2));\n\n  TYPE EmpCurTyp IS REF CURSOR RETURN EmpRecTyp;\n  emp_cv EmpCurTyp;\nBEGIN\n  NULL;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/cursor-variables-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/cursor-variables.html\nDECLARE\n  cv SYS_REFCURSOR;  -- cursor variable\n\n  v_lastname  employees.last_name%TYPE;  -- variable for last_name\n  v_jobid     employees.job_id%TYPE;     -- variable for job_id\n\n  query_2 VARCHAR2(200) :=\n    'SELECT * FROM employees\n    WHERE REGEXP_LIKE (job_id, ''[ACADFIMKSA]_M[ANGR]'')\n    ORDER BY job_id';\n\n  v_employees employees%ROWTYPE;  -- record variable row of table\n\nBEGIN\n  OPEN cv FOR\n    SELECT last_name, job_id FROM employees\n    WHERE REGEXP_LIKE (job_id, 'S[HT]_CLERK')\n    ORDER BY last_name;\n\n  LOOP  -- Fetches 2 columns into variables\n    FETCH cv INTO v_lastname, v_jobid;\n    EXIT WHEN cv%NOTFOUND;\n    DBMS_OUTPUT.PUT_LINE( RPAD(v_lastname, 25, ' ') || v_jobid );\n  END LOOP;\n\n  DBMS_OUTPUT.PUT_LINE( '-------------------------------------' );\n\n  OPEN cv FOR query_2;\n\n  LOOP  -- Fetches entire row into the v_employees record\n    FETCH cv INTO v_employees;\n    EXIT WHEN cv%NOTFOUND;\n    DBMS_OUTPUT.PUT_LINE( RPAD(v_employees.last_name, 25, ' ') ||\n                               v_employees.job_id );\n  END LOOP;\n\n  CLOSE cv;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/cursor-variables-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/cursor-variables.html\nDECLARE\n  TYPE empcurtyp IS REF CURSOR;\n  TYPE namelist IS TABLE OF employees.last_name%TYPE;\n  TYPE sallist IS TABLE OF employees.salary%TYPE;\n  emp_cv  empcurtyp;\n  names   namelist;\n  sals    sallist;\nBEGIN\n  OPEN emp_cv FOR\n    SELECT last_name, salary FROM employees\n    WHERE job_id = 'SA_REP'\n    ORDER BY salary DESC;\n\n  FETCH emp_cv BULK COLLECT INTO names, sals;\n  CLOSE emp_cv;\n  -- loop through the names and sals collections\n  FOR i IN names.FIRST .. names.LAST\n  LOOP\n    DBMS_OUTPUT.PUT_LINE\n      ('Name = ' || names(i) || ', salary = ' || sals(i));\n  END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/cursor-variables-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/cursor-variables.html\nDECLARE\n  sal           employees.salary%TYPE;\n  sal_multiple  employees.salary%TYPE;\n  factor        INTEGER := 2;\n\n  cv SYS_REFCURSOR;\n\nBEGIN\n  OPEN cv FOR\n    SELECT salary, salary*factor\n    FROM employees\n    WHERE job_id LIKE 'AD_%';   -- PL/SQL evaluates factor\n\n  LOOP\n    FETCH cv INTO sal, sal_multiple;\n    EXIT WHEN cv%NOTFOUND;\n    DBMS_OUTPUT.PUT_LINE('factor = ' || factor);\n    DBMS_OUTPUT.PUT_LINE('sal          = ' || sal);\n    DBMS_OUTPUT.PUT_LINE('sal_multiple = ' || sal_multiple);\n    factor := factor + 1;  -- Does not affect sal_multiple\n  END LOOP;\n\n  CLOSE cv;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/cursors-overview-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/cursors-overview.html\nDROP TABLE dept_temp;\nCREATE TABLE dept_temp AS\n  SELECT * FROM departments;\nCREATE OR REPLACE PROCEDURE p (\n  dept_no NUMBER\n) AUTHID CURRENT_USER AS\nBEGIN\n  DELETE FROM dept_temp\n  WHERE department_id = dept_no;\n\n  IF SQL%FOUND THEN\n    DBMS_OUTPUT.PUT_LINE (\n      'Delete succeeded for department number ' || dept_no\n    );\n  ELSE\n    DBMS_OUTPUT.PUT_LINE ('No department number ' || dept_no);\n  END IF;\nEND;\n/\nBEGIN\n  p(270);\n  p(400);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/cursors-overview-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/cursors-overview.html\nDECLARE\n  CURSOR c IS\n    SELECT e.job_id, j.job_title\n    FROM employees e, jobs j\n    WHERE e.job_id = j.job_id AND e.manager_id = 100\n    ORDER BY last_name;\n\n  -- Record variables for rows of cursor result set:\n\n  job1 c%ROWTYPE;\n  job2 c%ROWTYPE;\n  job3 c%ROWTYPE;\n  job4 c%ROWTYPE;\n  job5 c%ROWTYPE;\n\nBEGIN\n  OPEN c;\n  FETCH c INTO job1;  -- fetches first row\n  FETCH c INTO job2;  -- fetches second row\n  FETCH c INTO job3;  -- fetches third row\n  FETCH c INTO job4;  -- fetches fourth row\n  FETCH c INTO job5;  -- fetches fifth row\n  CLOSE c;\n\n  DBMS_OUTPUT.PUT_LINE(job1.job_title || ' (' || job1.job_id || ')');\n  DBMS_OUTPUT.PUT_LINE(job2.job_title || ' (' || job2.job_id || ')');\n  DBMS_OUTPUT.PUT_LINE(job3.job_title || ' (' || job3.job_id || ')');\n  DBMS_OUTPUT.PUT_LINE(job4.job_title || ' (' || job4.job_id || ')');\n  DBMS_OUTPUT.PUT_LINE(job5.job_title || ' (' || job5.job_id || ')');\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/cursors-overview-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/cursors-overview.html\nDECLARE\n  sal           employees.salary%TYPE;\n  sal_multiple  employees.salary%TYPE;\n  factor        INTEGER := 2;\n\n  CURSOR c1 IS\n    SELECT salary, salary*factor FROM employees\n    WHERE job_id LIKE 'AD_%';\n\nBEGIN\n  OPEN c1;  -- PL/SQL evaluates factor\n\n  LOOP\n    FETCH c1 INTO sal, sal_multiple;\n    EXIT WHEN c1%NOTFOUND;\n    DBMS_OUTPUT.PUT_LINE('factor = ' || factor);\n    DBMS_OUTPUT.PUT_LINE('sal          = ' || sal);\n    DBMS_OUTPUT.PUT_LINE('sal_multiple = ' || sal_multiple);\n    factor := factor + 1;  -- Does not affect sal_multiple\n  END LOOP;\n\n  CLOSE c1;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/cursors-overview-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/cursors-overview.html\nDECLARE\n  sal           employees.salary%TYPE;\n  sal_multiple  employees.salary%TYPE;\n  factor        INTEGER := 2;\n\n  CURSOR c1 IS\n    SELECT salary, salary*factor FROM employees\n    WHERE job_id LIKE 'AD_%';\n\nBEGIN\n  DBMS_OUTPUT.PUT_LINE('factor = ' || factor);\n  OPEN c1;  -- PL/SQL evaluates factor\n  LOOP\n    FETCH c1 INTO sal, sal_multiple;\n    EXIT WHEN c1%NOTFOUND;\n    DBMS_OUTPUT.PUT_LINE('sal          = ' || sal);\n    DBMS_OUTPUT.PUT_LINE('sal_multiple = ' || sal_multiple);\n  END LOOP;\n  CLOSE c1;\n\n  factor := factor + 1;\n\n  DBMS_OUTPUT.PUT_LINE('factor = ' || factor);\n  OPEN c1;  -- PL/SQL evaluates factor\n  LOOP\n    FETCH c1 INTO sal, sal_multiple;\n    EXIT WHEN c1%NOTFOUND;\n    DBMS_OUTPUT.PUT_LINE('sal          = ' || sal);\n    DBMS_OUTPUT.PUT_LINE('sal_multiple = ' || sal_multiple);\n  END LOOP;\n  CLOSE c1;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/cursors-overview-16.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/cursors-overview.html\nDECLARE\n  CURSOR c1 IS\n    SELECT employee_id,\n           (salary * .05) raise\n    FROM employees\n    WHERE job_id LIKE '%_MAN'\n    ORDER BY employee_id;\n  emp_rec c1%ROWTYPE;\nBEGIN\n  OPEN c1;\n  LOOP\n    FETCH c1 INTO emp_rec;\n    EXIT WHEN c1%NOTFOUND;\n    DBMS_OUTPUT.PUT_LINE (\n      'Raise for employee #' || emp_rec.employee_id ||\n      ' is $' || emp_rec.raise\n    ); \n  END LOOP;\n  CLOSE c1;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/cursors-overview-18.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/cursors-overview.html\nDECLARE\n  CURSOR c (job VARCHAR2, max_sal NUMBER) IS\n    SELECT last_name, first_name, (salary - max_sal) overpayment\n    FROM employees\n    WHERE job_id = job\n    AND salary > max_sal\n    ORDER BY salary;\n\n  PROCEDURE print_overpaid IS\n    last_name_   employees.last_name%TYPE;\n    first_name_  employees.first_name%TYPE;\n    overpayment_      employees.salary%TYPE;\n  BEGIN\n    LOOP\n      FETCH c INTO last_name_, first_name_, overpayment_;\n      EXIT WHEN c%NOTFOUND;\n      DBMS_OUTPUT.PUT_LINE(last_name_ || ', ' || first_name_ ||\n        ' (by ' || overpayment_ || ')');\n    END LOOP;\n  END print_overpaid;\n\nBEGIN\n  DBMS_OUTPUT.PUT_LINE('----------------------');\n  DBMS_OUTPUT.PUT_LINE('Overpaid Stock Clerks:');\n  DBMS_OUTPUT.PUT_LINE('----------------------');\n  OPEN c('ST_CLERK', 5000);\n  print_overpaid; \n  CLOSE c;\n\n  DBMS_OUTPUT.PUT_LINE('-------------------------------');\n  DBMS_OUTPUT.PUT_LINE('Overpaid Sales Representatives:');\n  DBMS_OUTPUT.PUT_LINE('-------------------------------');\n  OPEN c('SA_REP', 10000);\n  print_overpaid; \n  CLOSE c;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/cursors-overview-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/cursors-overview.html\nDROP TABLE employees_temp;\nCREATE TABLE employees_temp AS\n  SELECT * FROM employees;\nDECLARE\n  mgr_no NUMBER(6) := 122;\nBEGIN\n  DELETE FROM employees_temp WHERE manager_id = mgr_no;\n  DBMS_OUTPUT.PUT_LINE\n    ('Number of employees deleted: ' || TO_CHAR(SQL%ROWCOUNT));\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/cursors-overview-20.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/cursors-overview.html\nDECLARE\n  CURSOR c (location NUMBER DEFAULT 1700) IS\n    SELECT d.department_name,\n           e.last_name manager,\n           l.city\n    FROM departments d, employees e, locations l\n    WHERE l.location_id = location\n      AND l.location_id = d.location_id\n      AND d.department_id = e.department_id\n    ORDER BY d.department_id;\n\n  PROCEDURE print_depts IS\n    dept_name  departments.department_name%TYPE;\n    mgr_name   employees.last_name%TYPE;\n    city_name  locations.city%TYPE;\n  BEGIN\n    LOOP\n      FETCH c INTO dept_name, mgr_name, city_name;\n      EXIT WHEN c%NOTFOUND;\n      DBMS_OUTPUT.PUT_LINE(dept_name || ' (Manager: ' || mgr_name || ')');\n    END LOOP;\n  END print_depts;\n\nBEGIN\n  DBMS_OUTPUT.PUT_LINE('DEPARTMENTS AT HEADQUARTERS:');\n  DBMS_OUTPUT.PUT_LINE('--------------------------------');\n  OPEN c;\n  print_depts; \n  DBMS_OUTPUT.PUT_LINE('--------------------------------');\n  CLOSE c;\n\n  DBMS_OUTPUT.PUT_LINE('DEPARTMENTS IN CANADA:');\n  DBMS_OUTPUT.PUT_LINE('--------------------------------');\n  OPEN c(1800); -- Toronto\n  print_depts; \n  CLOSE c;\n  OPEN c(1900); -- Whitehorse\n  print_depts; \n  CLOSE c;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/cursors-overview-22.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/cursors-overview.html\nDECLARE\n  CURSOR c (job VARCHAR2, max_sal NUMBER,\n            hired DATE DEFAULT TO_DATE('31-DEC-1999', 'DD-MON-YYYY')) IS\n    SELECT last_name, first_name, (salary - max_sal) overpayment\n    FROM employees\n    WHERE job_id = job\n    AND salary > max_sal\n    AND hire_date > hired\n    ORDER BY salary;\n\n  PROCEDURE print_overpaid IS\n    last_name_   employees.last_name%TYPE;\n    first_name_  employees.first_name%TYPE;\n    overpayment_      employees.salary%TYPE;\n  BEGIN\n    LOOP\n      FETCH c INTO last_name_, first_name_, overpayment_;\n      EXIT WHEN c%NOTFOUND;\n      DBMS_OUTPUT.PUT_LINE(last_name_ || ', ' || first_name_ ||\n        ' (by ' || overpayment_ || ')');\n    END LOOP;\n  END print_overpaid;\n\nBEGIN\n  DBMS_OUTPUT.PUT_LINE('-------------------------------');\n  DBMS_OUTPUT.PUT_LINE('Overpaid Sales Representatives:');\n  DBMS_OUTPUT.PUT_LINE('-------------------------------');\n  OPEN c('SA_REP', 10000);  -- existing reference\n  print_overpaid; \n  CLOSE c;\n\n  DBMS_OUTPUT.PUT_LINE('------------------------------------------------');\n  DBMS_OUTPUT.PUT_LINE('Overpaid Sales Representatives Hired After 2014:');\n  DBMS_OUTPUT.PUT_LINE('------------------------------------------------');\n  OPEN c('SA_REP', 10000, TO_DATE('31-DEC-2014', 'DD-MON-YYYY'));\n                          -- new reference\n  print_overpaid; \n  CLOSE c;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/cursors-overview-24.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/cursors-overview.html\nDECLARE\n  CURSOR c1 IS\n    SELECT last_name, salary FROM employees\n    WHERE ROWNUM < 11;\n\n  the_name employees.last_name%TYPE;\n  the_salary employees.salary%TYPE;\nBEGIN\n  IF NOT c1%ISOPEN THEN\n    OPEN c1;\n  END IF;\n\n  FETCH c1 INTO the_name, the_salary;\n\n  IF c1%ISOPEN THEN\n    CLOSE c1;\n  END IF;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/cursors-overview-25.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/cursors-overview.html\nDECLARE\n  CURSOR c1 IS\n    SELECT last_name, salary FROM employees\n    WHERE ROWNUM < 11\n    ORDER BY last_name;\n\n  my_ename   employees.last_name%TYPE;\n  my_salary  employees.salary%TYPE;\nBEGIN\n  OPEN c1;\n  LOOP\n    FETCH c1 INTO my_ename, my_salary;\n    IF c1%FOUND THEN  -- fetch succeeded\n      DBMS_OUTPUT.PUT_LINE('Name = ' || my_ename || ', salary = ' || my_salary);\n    ELSE  -- fetch failed\n      EXIT;\n    END IF;\n  END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/cursors-overview-27.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/cursors-overview.html\nDECLARE\n  CURSOR c1 IS\n    SELECT last_name, salary FROM employees\n    WHERE ROWNUM < 11\n    ORDER BY last_name;\n\n   my_ename   employees.last_name%TYPE;\n   my_salary  employees.salary%TYPE;\nBEGIN\n  OPEN c1;\n  LOOP\n    FETCH c1 INTO my_ename, my_salary;\n    IF c1%NOTFOUND THEN -- fetch failed\n      EXIT;\n    ELSE  -- fetch succeeded\n      DBMS_OUTPUT.PUT_LINE\n        ('Name = ' || my_ename || ', salary = ' || my_salary);\n    END IF;\n  END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/cursors-overview-29.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/cursors-overview.html\nDECLARE\n  CURSOR c1 IS\n    SELECT last_name FROM employees\n    WHERE ROWNUM < 11\n    ORDER BY last_name;\n\n  name  employees.last_name%TYPE;\nBEGIN\n  OPEN c1;\n  LOOP\n    FETCH c1 INTO name;\n    EXIT WHEN c1%NOTFOUND OR c1%NOTFOUND IS NULL;\n    DBMS_OUTPUT.PUT_LINE(c1%ROWCOUNT || '. ' || name);\n    IF c1%ROWCOUNT = 5 THEN\n       DBMS_OUTPUT.PUT_LINE('--- Fetched 5th row ---');\n    END IF;\n  END LOOP;\n  CLOSE c1;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/cursors-overview-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/cursors-overview.html\nDECLARE\n  CURSOR c1 RETURN departments%ROWTYPE;    -- Declare c1\n\n  CURSOR c2 IS                             -- Declare and define c2\n    SELECT employee_id, job_id, salary FROM employees\n    WHERE salary > 2000; \n\n  CURSOR c1 RETURN departments%ROWTYPE IS  -- Define c1,\n    SELECT * FROM departments              -- repeating return type\n    WHERE department_id = 110;\n\n  CURSOR c3 RETURN locations%ROWTYPE;      -- Declare c3\n\n  CURSOR c3 IS                             -- Define c3,\n    SELECT * FROM locations                -- omitting return type\n    WHERE country_id = 'JP';\nBEGIN\n  NULL;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/cursors-overview-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/cursors-overview.html\nFETCH cursor_name INTO into_clause\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/cursors-overview-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/cursors-overview.html\nDECLARE\n  CURSOR c1 IS\n    SELECT last_name, job_id FROM employees\n    WHERE REGEXP_LIKE (job_id, 'S[HT]_CLERK')\n    ORDER BY last_name;\n\n  v_lastname  employees.last_name%TYPE;  -- variable for last_name\n  v_jobid     employees.job_id%TYPE;     -- variable for job_id\n\n  CURSOR c2 IS\n    SELECT * FROM employees\n    WHERE REGEXP_LIKE (job_id, '[ACADFIMKSA]_M[ANGR]')\n    ORDER BY job_id;\n\n  v_employees employees%ROWTYPE;  -- record variable for row of table\n\nBEGIN\n  OPEN c1;\n  LOOP  -- Fetches 2 columns into variables\n    FETCH c1 INTO v_lastname, v_jobid;\n    EXIT WHEN c1%NOTFOUND;\n    DBMS_OUTPUT.PUT_LINE( RPAD(v_lastname, 25, ' ') || v_jobid );\n  END LOOP;\n  CLOSE c1;\n  DBMS_OUTPUT.PUT_LINE( '-------------------------------------' );\n\n  OPEN c2;\n  LOOP  -- Fetches entire row into the v_employees record\n    FETCH c2 INTO v_employees;\n    EXIT WHEN c2%NOTFOUND;\n    DBMS_OUTPUT.PUT_LINE( RPAD(v_employees.last_name, 25, ' ') ||\n                               v_employees.job_id );\n  END LOOP;\n  CLOSE c2;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dbms_sql-package-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dbms_sql-package.html\nCREATE OR REPLACE PROCEDURE p AUTHID DEFINER AS\n  c1 SYS_REFCURSOR;\n  c2 SYS_REFCURSOR;\nBEGIN\n  OPEN c1 FOR\n    SELECT first_name, last_name\n    FROM employees\n    WHERE employee_id = 176;\n\n  DBMS_SQL.RETURN_RESULT (c1);\n  -- Now p cannot access the result.\n\n  OPEN c2 FOR\n    SELECT city, state_province\n    FROM locations\n    WHERE country_id = 'AU';\n\n  DBMS_SQL.RETURN_RESULT (c2);\n  -- Now p cannot access the result.\nEND;\n/\nBEGIN\n  p;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dbms_sql-package-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dbms_sql-package.html\nCREATE OR REPLACE PROCEDURE get_employee_info (id IN VARCHAR2) AUTHID DEFINER AS\n  rc  SYS_REFCURSOR;\nBEGIN\n  -- Return employee info\n\n  OPEN rc FOR SELECT first_name, last_name, email, phone_number\n              FROM employees\n              WHERE employee_id = id;\n  DBMS_SQL.RETURN_RESULT(rc);\n\n  -- Return employee job history\n\n  OPEN RC FOR SELECT job_title, start_date, end_date\n              FROM job_history jh, jobs j\n              WHERE jh.employee_id = id AND\n                    jh.job_id = j.job_id\n              ORDER BY start_date DESC;\n  DBMS_SQL.RETURN_RESULT(rc);\nEND;\n/\n<<main>>\nDECLARE\n  c            INTEGER;\n  rc           SYS_REFCURSOR;\n  n            NUMBER;\n\n  first_name   VARCHAR2(20);\n  last_name    VARCHAR2(25);\n  email        VARCHAR2(25);\n  phone_number VARCHAR2(20);\n\n  job_title    VARCHAR2(35);\n  start_date   DATE;\n  end_date     DATE;\n\nBEGIN\n\n  c := DBMS_SQL.OPEN_CURSOR(true);\n  DBMS_SQL.PARSE(c, 'BEGIN get_employee_info(:id); END;', DBMS_SQL.NATIVE);\n  DBMS_SQL.BIND_VARIABLE(c, ':id', 176);\n  n := DBMS_SQL.EXECUTE(c);\n\n  -- Get employee info\n\n  dbms_sql.get_next_result(c, rc);\n  FETCH rc INTO first_name, last_name, email, phone_number;\n\n  DBMS_OUTPUT.PUT_LINE('Employee: '||first_name || ' ' || last_name);\n  DBMS_OUTPUT.PUT_LINE('Email: ' ||email);\n  DBMS_OUTPUT.PUT_LINE('Phone: ' ||phone_number);\n\n  -- Get employee job history\n\n  DBMS_OUTPUT.PUT_LINE('Titles:');\n  DBMS_SQL.GET_NEXT_RESULT(c, rc);\n  LOOP\n    FETCH rc INTO job_title, start_date, end_date;\n    EXIT WHEN rc%NOTFOUND;\n    DBMS_OUTPUT.PUT_LINE\n      ('- '||job_title||' ('||start_date||' - ' ||end_date||')');\n  END LOOP;\n\n  DBMS_SQL.CLOSE_CURSOR(c);\nEND main;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dbms_sql-package-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dbms_sql-package.html\nCREATE OR REPLACE TYPE vc_array IS TABLE OF VARCHAR2(200);\n/\nCREATE OR REPLACE TYPE numlist IS TABLE OF NUMBER;\n/\nCREATE OR REPLACE PROCEDURE do_query_1 (\n  placeholder vc_array,\n  bindvars vc_array,\n  sql_stmt VARCHAR2\n) AUTHID DEFINER\nIS\n  TYPE curtype IS REF CURSOR;\n  src_cur     curtype;\n  curid       NUMBER;\n  bindnames   vc_array;\n  empnos      numlist;\n  depts       numlist;\n  ret         NUMBER;\n  isopen      BOOLEAN;\nBEGIN\n  -- Open SQL cursor number:\n  curid := DBMS_SQL.OPEN_CURSOR;\n\n  -- Parse SQL cursor number:\n  DBMS_SQL.PARSE(curid, sql_stmt, DBMS_SQL.NATIVE);\n\n  bindnames := placeholder;\n\n  -- Bind variables:\n  FOR i IN 1 .. bindnames.COUNT LOOP\n    DBMS_SQL.BIND_VARIABLE(curid, bindnames(i), bindvars(i));\n  END LOOP;\n\n  -- Run SQL cursor number:\n  ret := DBMS_SQL.EXECUTE(curid);\n\n  -- Switch from DBMS_SQL to native dynamic SQL:\n  src_cur := DBMS_SQL.TO_REFCURSOR(curid);\n  FETCH src_cur BULK COLLECT INTO empnos, depts;\n\n  -- This would cause an error because curid was converted to a REF CURSOR:\n  -- isopen := DBMS_SQL.IS_OPEN(curid);\n\n  CLOSE src_cur;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dbms_sql-package-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dbms_sql-package.html\nCREATE OR REPLACE PROCEDURE do_query_2 (\n  sql_stmt VARCHAR2\n) AUTHID DEFINER\nIS\n  TYPE curtype IS REF CURSOR;\n  src_cur   curtype;\n  curid     NUMBER;\n  desctab   DBMS_SQL.DESC_TAB;\n  colcnt    NUMBER;\n  namevar   VARCHAR2(50);\n  numvar    NUMBER;\n  datevar   DATE;\n  empno     NUMBER := 100;\nBEGIN\n  -- sql_stmt := SELECT ... FROM employees WHERE employee_id = :b1';\n\n  -- Open REF CURSOR variable:\n  OPEN src_cur FOR sql_stmt USING empno;\n\n  -- Switch from native dynamic SQL to DBMS_SQL package:\n  curid := DBMS_SQL.TO_CURSOR_NUMBER(src_cur);\n  DBMS_SQL.DESCRIBE_COLUMNS(curid, colcnt, desctab);\n\n  -- Define columns:\n  FOR i IN 1 .. colcnt LOOP\n    IF desctab(i).col_type = 2 THEN\n      DBMS_SQL.DEFINE_COLUMN(curid, i, numvar);\n    ELSIF desctab(i).col_type = 12 THEN\n      DBMS_SQL.DEFINE_COLUMN(curid, i, datevar);\n      -- statements\n    ELSE\n      DBMS_SQL.DEFINE_COLUMN(curid, i, namevar, 50);\n    END IF;\n  END LOOP;\n\n  -- Fetch rows with DBMS_SQL package:\n  WHILE DBMS_SQL.FETCH_ROWS(curid) > 0 LOOP\n    FOR i IN 1 .. colcnt LOOP\n      IF (desctab(i).col_type = 1) THEN\n        DBMS_SQL.COLUMN_VALUE(curid, i, namevar);\n      ELSIF (desctab(i).col_type = 2) THEN\n        DBMS_SQL.COLUMN_VALUE(curid, i, numvar);\n      ELSIF (desctab(i).col_type = 12) THEN\n        DBMS_SQL.COLUMN_VALUE(curid, i, datevar);\n        -- statements\n      END IF;\n    END LOOP;\n  END LOOP;\n\n  DBMS_SQL.CLOSE_CURSOR(curid);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/declarations-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/declarations.html\nDECLARE\n  acct_id INTEGER(4) NOT NULL := 9999;\n  a NATURALN                  := 9999;\n  b POSITIVEN                 := 9999;\n  c SIMPLE_INTEGER            := 9999;\nBEGIN\n  NULL;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/declarations-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/declarations.html\nDECLARE\n  null_string  VARCHAR2(80) := TO_CHAR('');\n  address      VARCHAR2(80);\n  zip_code     VARCHAR2(80) := SUBSTR(address, 25, 0);\n  name         VARCHAR2(80);\n  valid        BOOLEAN      := (name != '');\nBEGIN\n  NULL;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/declarations-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/declarations.html\nDECLARE\n  name     VARCHAR(25) NOT NULL := 'Smith';\n  surname  name%TYPE := 'Jones';\nBEGIN\n  DBMS_OUTPUT.PUT_LINE('name=' || name);\n  DBMS_OUTPUT.PUT_LINE('surname=' || surname);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/declarations-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/declarations.html\nDECLARE\n  part_number       NUMBER(6);\n  part_name         VARCHAR2(20);\n  in_stock          BOOLEAN;\n  part_price        NUMBER(6,2);\n  part_description  VARCHAR2(50);\nBEGIN\n  NULL;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/declarations-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/declarations.html\nDECLARE\n  credit_limit     CONSTANT REAL    := 5000.00;\n  max_days_in_year CONSTANT INTEGER := 366;\n  urban_legend     CONSTANT BOOLEAN := FALSE;\nBEGIN\n  NULL;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/declarations-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/declarations.html\nDECLARE\n  hours_worked    INTEGER := 40;\n  employee_count  INTEGER := 0;\n\n  pi     CONSTANT REAL := 3.14159;\n  radius          REAL := 1;\n  area            REAL := (pi * radius**2);\nBEGIN\n  NULL;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/declarations-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/declarations.html\nDECLARE\n  counter INTEGER;  -- initial value is NULL by default\nBEGIN\n  counter := counter + 1;  -- NULL + 1 is still NULL\n\n  IF counter IS NULL THEN\n    DBMS_OUTPUT.PUT_LINE('counter is NULL.');\n  END IF;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/declarations-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/declarations.html\nDECLARE\n  surname  employees.last_name%TYPE;\nBEGIN\n  DBMS_OUTPUT.PUT_LINE('surname=' || surname);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/description-static-sql-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/description-static-sql.html\nDROP TABLE employees_temp;\nCREATE TABLE employees_temp AS\n  SELECT employee_id, first_name, last_name \n  FROM employees;\nDECLARE\n  emp_id          employees_temp.employee_id%TYPE := 299;\n  emp_first_name  employees_temp.first_name%TYPE  := 'Bob';\n  emp_last_name   employees_temp.last_name%TYPE   := 'Henry';\nBEGIN\n  INSERT INTO employees_temp (employee_id, first_name, last_name) \n  VALUES (emp_id, emp_first_name, emp_last_name);\n\n  UPDATE employees_temp\n  SET first_name = 'Robert'\n  WHERE employee_id = emp_id;\n\n  DELETE FROM employees_temp\n  WHERE employee_id = emp_id\n  RETURNING first_name, last_name\n  INTO emp_first_name, emp_last_name;\n\n  COMMIT;\n  DBMS_OUTPUT.PUT_LINE (emp_first_name || ' ' || emp_last_name);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/description-static-sql-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/description-static-sql.html\nDROP TABLE employees_temp;\nCREATE TABLE employees_temp AS\n  SELECT employee_id, first_name, last_name\n  FROM employees;\nDROP TABLE employees_temp2;\nCREATE TABLE employees_temp2 AS\n  SELECT employee_id, first_name, last_name\n  FROM employees;\nDECLARE\n  seq_value NUMBER;\nBEGIN\n  -- Generate initial sequence number\n\n  seq_value := employees_seq.NEXTVAL;\n\n  -- Print initial sequence number:\n\n  DBMS_OUTPUT.PUT_LINE (\n    'Initial sequence value: ' || TO_CHAR(seq_value)\n  );\n\n  -- Use NEXTVAL to create unique number when inserting data:\n\n     INSERT INTO employees_temp (employee_id, first_name, last_name) \n     VALUES (employees_seq.NEXTVAL, 'Lynette', 'Smith');\n\n  -- Use CURRVAL to store same value somewhere else:\n\n     INSERT INTO employees_temp2 VALUES (employees_seq.CURRVAL,\n                                         'Morgan', 'Smith');\n\n  /* Because NEXTVAL values might be referenced\n     by different users and applications,\n     and some NEXTVAL values might not be stored in database,\n     there might be gaps in sequence. */\n\n  -- Use CURRVAL to specify record to delete:\n\n     seq_value := employees_seq.CURRVAL;\n\n     DELETE FROM employees_temp2\n     WHERE employee_id = seq_value;\n\n  -- Update employee_id with NEXTVAL for specified record:\n\n     UPDATE employees_temp\n     SET employee_id = employees_seq.NEXTVAL\n     WHERE first_name = 'Lynette'\n     AND last_name = 'Smith';\n\n  -- Display final value of CURRVAL:\n\n     seq_value := employees_seq.CURRVAL;\n\n     DBMS_OUTPUT.PUT_LINE (\n       'Ending sequence value: ' || TO_CHAR(seq_value)\n     );\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dml-triggers-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dml-triggers.html\nCREATE OR REPLACE TRIGGER t\n  BEFORE\n    INSERT OR\n    UPDATE OF salary, department_id OR\n    DELETE\n  ON employees\nBEGIN\n  CASE\n    WHEN INSERTING THEN\n      DBMS_OUTPUT.PUT_LINE('Inserting');\n    WHEN UPDATING('salary') THEN\n      DBMS_OUTPUT.PUT_LINE('Updating salary');\n    WHEN UPDATING('department_id') THEN\n      DBMS_OUTPUT.PUT_LINE('Updating department ID');\n    WHEN DELETING THEN\n      DBMS_OUTPUT.PUT_LINE('Deleting');\n  END CASE;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dml-triggers-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dml-triggers.html\nCREATE OR REPLACE VIEW order_info AS\n   SELECT c.customer_id, c.cust_last_name, c.cust_first_name,\n          o.order_id, o.order_date, o.order_status\n   FROM customers c, orders o\n   WHERE c.customer_id = o.customer_id;\nCREATE OR REPLACE TRIGGER order_info_insert\n   INSTEAD OF INSERT ON order_info\n   DECLARE\n     duplicate_info EXCEPTION;\n     PRAGMA EXCEPTION_INIT (duplicate_info, -00001);\n   BEGIN\n     INSERT INTO customers\n       (customer_id, cust_last_name, cust_first_name)\n     VALUES (\n     :new.customer_id,\n     :new.cust_last_name,\n     :new.cust_first_name);\n   INSERT INTO orders (order_id, order_date, customer_id)\n   VALUES (\n     :new.order_id,\n     :new.order_date,\n     :new.customer_id);\n   EXCEPTION\n     WHEN duplicate_info THEN\n       RAISE_APPLICATION_ERROR (\n         num=> -20107,\n         msg=> 'Duplicate customer or order ID');\n   END order_info_insert;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dml-triggers-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dml-triggers.html\nSELECT COUNT(*) FROM orders WHERE customer_id = 999;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dml-triggers-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dml-triggers.html\nCREATE OR REPLACE TYPE nte\nAUTHID DEFINER IS\nOBJECT (\n  emp_id     NUMBER(6),\n  lastname   VARCHAR2(25),\n  job        VARCHAR2(10),\n  sal        NUMBER(8,2)\n);\n/\nCREATE OR REPLACE TYPE emp_list_ IS\n  TABLE OF nte;\n/\nCREATE OR REPLACE VIEW dept_view AS\n  SELECT d.department_id, \n         d.department_name,\n         CAST (MULTISET (SELECT e.employee_id, e.last_name, e.job_id, e.salary\n                         FROM employees e\n                         WHERE e.department_id = d.department_id\n                        )\n                        AS emp_list_\n              ) emplist\n  FROM departments d;\nCREATE OR REPLACE TRIGGER dept_emplist_tr\n  INSTEAD OF INSERT ON NESTED TABLE emplist OF dept_view\n  REFERENCING NEW AS Employee\n              PARENT AS Department\n  FOR EACH ROW\nBEGIN\n  -- Insert on nested table translates to insert on base table:\n  INSERT INTO employees (\n    employee_id,\n    last_name,\n    email,\n    hire_date,\n    job_id,\n    salary,\n    department_id\n  )\n  VALUES (\n    :Employee.emp_id,                      -- employee_id\n    :Employee.lastname,                    -- last_name\n    :Employee.lastname || '@example.com',  -- email\n    SYSDATE,                               -- hire_date\n    :Employee.job,                         -- job_id\n    :Employee.sal,                         -- salary\n    :Department.department_id              -- department_id\n  );\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dml-triggers-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dml-triggers.html\nSELECT emplist FROM dept_view WHERE department_id=10;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dml-triggers-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dml-triggers.html\nSELECT employee_id, last_name, job_id, salary\nFROM employees\nWHERE department_id = 10;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dml-triggers-17.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dml-triggers.html\nINSERT INTO TABLE (\n  SELECT d.emplist \n  FROM dept_view d\n  WHERE department_id = 10\n)\nVALUES (1001, 'Glenn', 'AC_MGR', 10000);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dml-triggers-18.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dml-triggers.html\nSELECT emplist FROM dept_view WHERE department_id=10;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dml-triggers-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dml-triggers.html\nSELECT COUNT(*) FROM order_info WHERE customer_id = 999;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dml-triggers-20.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dml-triggers.html\nSELECT employee_id, last_name, job_id, salary\nFROM employees\nWHERE department_id = 10;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dml-triggers-23.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dml-triggers.html\nINSERT INTO Target\n  SELECT c1, c2, c3\n  FROM Source\n  WHERE Source.c1 > 0"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dml-triggers-24.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dml-triggers.html\nCREATE TABLE employee_salaries (\n  employee_id NUMBER NOT NULL,\n  change_date DATE   NOT NULL,\n  salary NUMBER(8,2) NOT NULL,\n  CONSTRAINT pk_employee_salaries PRIMARY KEY (employee_id, change_date),\n  CONSTRAINT fk_employee_salaries FOREIGN KEY (employee_id)\n    REFERENCES employees (employee_id)\n      ON DELETE CASCADE)\n/\nCREATE OR REPLACE TRIGGER maintain_employee_salaries\n  FOR UPDATE OF salary ON employees\n    COMPOUND TRIGGER\n\n-- Declarative Part:\n-- Choose small threshhold value to show how example works:\n  threshhold CONSTANT SIMPLE_INTEGER := 7;\n\n  TYPE salaries_t IS TABLE OF employee_salaries%ROWTYPE INDEX BY SIMPLE_INTEGER;\n  salaries  salaries_t;\n  idx       SIMPLE_INTEGER := 0;\n\n  PROCEDURE flush_array IS\n    n CONSTANT SIMPLE_INTEGER := salaries.count();\n  BEGIN\n    FORALL j IN 1..n\n      INSERT INTO employee_salaries VALUES salaries(j);\n    salaries.delete();\n    idx := 0;\n    DBMS_OUTPUT.PUT_LINE('Flushed ' || n || ' rows');\n  END flush_array;\n\n  -- AFTER EACH ROW Section:\n\n  AFTER EACH ROW IS\n  BEGIN\n    idx := idx + 1;\n    salaries(idx).employee_id := :NEW.employee_id;\n    salaries(idx).change_date := SYSTIMESTAMP;\n    salaries(idx).salary := :NEW.salary;\n    IF idx >= threshhold THEN\n      flush_array();\n    END IF;\n  END AFTER EACH ROW;\n\n  -- AFTER STATEMENT Section:\n\n  AFTER STATEMENT IS\n  BEGIN\n    flush_array();\n  END AFTER STATEMENT;\nEND maintain_employee_salaries;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dml-triggers-25.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dml-triggers.html\nUPDATE employees\n  SET salary = salary * 1.1\n  WHERE department_id = 50\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dml-triggers-27.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dml-triggers.html\nBEGIN\n  DBMS_SESSION.SLEEP(2);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dml-triggers-28.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dml-triggers.html\nUPDATE employees\n  SET salary = salary * 1.05\n  WHERE department_id = 50\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dml-triggers-30.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dml-triggers.html\nSELECT employee_id, count(*) c\n  FROM employee_salaries\n  GROUP BY employee_id\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dml-triggers-32.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dml-triggers.html\nCREATE OR REPLACE TRIGGER Check_Employee_Salary_Raise\n  FOR UPDATE OF Salary ON Employees\nCOMPOUND TRIGGER\n  Ten_Percent                 CONSTANT NUMBER := 0.1;\n  TYPE Salaries_t             IS TABLE OF Employees.Salary%TYPE;\n  Avg_Salaries                Salaries_t;\n  TYPE Department_IDs_t       IS TABLE OF Employees.Department_ID%TYPE;\n  Department_IDs              Department_IDs_t;\n\n  -- Declare collection type and variable:\n\n  TYPE Department_Salaries_t  IS TABLE OF Employees.Salary%TYPE\n                                INDEX BY VARCHAR2(80);\n  Department_Avg_Salaries     Department_Salaries_t;\n\n  BEFORE STATEMENT IS\n  BEGIN\n    SELECT               AVG(e.Salary), NVL(e.Department_ID, -1)\n      BULK COLLECT INTO  Avg_Salaries, Department_IDs\n      FROM               Employees e\n      GROUP BY           e.Department_ID;\n    FOR j IN 1..Department_IDs.COUNT() LOOP\n      Department_Avg_Salaries(Department_IDs(j)) := Avg_Salaries(j);\n    END LOOP;\n  END BEFORE STATEMENT;\n\n  AFTER EACH ROW IS\n  BEGIN\n    IF :NEW.Salary - :Old.Salary >\n      Ten_Percent*Department_Avg_Salaries(:NEW.Department_ID)\n    THEN\n      Raise_Application_Error(-20000, 'Raise too big');\n    END IF;\n  END AFTER EACH ROW;\nEND Check_Employee_Salary_Raise;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dml-triggers-33.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dml-triggers.html\nCREATE TABLE emp (\n  Empno     NUMBER NOT NULL,\n  Ename     VARCHAR2(10),\n  Job       VARCHAR2(9),\n  Mgr       NUMBER(4),\n  Hiredate  DATE,\n  Sal       NUMBER(7,2),\n  Comm      NUMBER(7,2),\n  Deptno    NUMBER(2) NOT NULL);\nCREATE TABLE dept (\n  Deptno    NUMBER(2) NOT NULL,\n  Dname     VARCHAR2(14),\n  Loc       VARCHAR2(13),\n  Mgr_no    NUMBER,\n  Dept_type NUMBER);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dml-triggers-34.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dml-triggers.html\nCREATE OR REPLACE TRIGGER emp_dept_check\n  BEFORE INSERT OR UPDATE OF Deptno ON emp\n  FOR EACH ROW WHEN (NEW.Deptno IS NOT NULL)\n\n  -- Before row is inserted or DEPTNO is updated in emp table,\n  -- fire this trigger to verify that new foreign key value (DEPTNO)\n  -- is present in dept table.\nDECLARE\n  Dummy               INTEGER;  -- Use for cursor fetch\n  Invalid_department  EXCEPTION;\n  Valid_department    EXCEPTION;\n  Mutating_table      EXCEPTION;\n  PRAGMA EXCEPTION_INIT (Invalid_department, -4093);\n  PRAGMA EXCEPTION_INIT (Valid_department, -4092);\n  PRAGMA EXCEPTION_INIT (Mutating_table, -4091);\n\n  -- Cursor used to verify parent key value exists.\n  -- If present, lock parent key's row so it cannot be deleted\n  -- by another transaction until this transaction is\n  -- committed or rolled back.\n\n  CURSOR Dummy_cursor (Dn NUMBER) IS\n    SELECT Deptno FROM dept\n    WHERE Deptno = Dn\n    FOR UPDATE OF Deptno;\nBEGIN\n  OPEN Dummy_cursor (:NEW.Deptno);\n  FETCH Dummy_cursor INTO Dummy;\n\n  -- Verify parent key.\n  -- If not found, raise user-specified error code and message.\n  -- If found, close cursor before allowing triggering statement to complete:\n\n  IF Dummy_cursor%NOTFOUND THEN\n    RAISE Invalid_department;\n  ELSE\n    RAISE Valid_department;\n  END IF;\n  CLOSE Dummy_cursor;\nEXCEPTION\n  WHEN Invalid_department THEN\n    CLOSE Dummy_cursor;\n    Raise_application_error(-20000, 'Invalid Department'\n      || ' Number' || TO_CHAR(:NEW.deptno));\n  WHEN Valid_department THEN\n    CLOSE Dummy_cursor;\n  WHEN Mutating_table THEN\n    NULL;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dml-triggers-35.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dml-triggers.html\nCREATE OR REPLACE TRIGGER dept_restrict\n  BEFORE DELETE OR UPDATE OF Deptno ON dept\n  FOR EACH ROW\n\n  -- Before row is deleted from dept or primary key (DEPTNO) of dept is updated,\n  -- check for dependent foreign key values in emp;\n  -- if any are found, roll back.\n\nDECLARE\n  Dummy                  INTEGER;  -- Use for cursor fetch\n  employees_present      EXCEPTION;\n  employees_not_present  EXCEPTION;\n  PRAGMA EXCEPTION_INIT (employees_present, -4094);\n  PRAGMA EXCEPTION_INIT (employees_not_present, -4095);\n\n  -- Cursor used to check for dependent foreign key values.\n  CURSOR Dummy_cursor (Dn NUMBER) IS\n    SELECT Deptno FROM emp WHERE Deptno = Dn;\n\nBEGIN\n  OPEN Dummy_cursor (:OLD.Deptno);\n  FETCH Dummy_cursor INTO Dummy;\n\n  -- If dependent foreign key is found, raise user-specified\n  -- error code and message. If not found, close cursor\n  -- before allowing triggering statement to complete.\n\n  IF Dummy_cursor%FOUND THEN\n    RAISE employees_present;     -- Dependent rows exist\n  ELSE\n    RAISE employees_not_present; -- No dependent rows exist\n  END IF;\n  CLOSE Dummy_cursor;\n\nEXCEPTION\n  WHEN employees_present THEN\n    CLOSE Dummy_cursor;\n    Raise_application_error(-20001, 'Employees Present in'\n      || ' Department ' || TO_CHAR(:OLD.DEPTNO));\n  WHEN employees_not_present THEN\n    CLOSE Dummy_cursor;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dml-triggers-36.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dml-triggers.html\nCREATE OR REPLACE TRIGGER dept_set_null\n  AFTER DELETE OR UPDATE OF Deptno ON dept\n  FOR EACH ROW\n\n  -- Before row is deleted from dept or primary key (DEPTNO) of dept is updated,\n  -- set all corresponding dependent foreign key values in emp to NULL:\n\nBEGIN\n  IF UPDATING AND :OLD.Deptno != :NEW.Deptno OR DELETING THEN\n    UPDATE emp SET emp.Deptno = NULL\n    WHERE emp.Deptno = :OLD.Deptno;\n  END IF;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dml-triggers-37.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dml-triggers.html\nCREATE OR REPLACE TRIGGER dept_del_cascade\n  AFTER DELETE ON dept\n  FOR EACH ROW\n\n  -- Before row is deleted from dept,\n  -- delete all rows from emp table whose DEPTNO is same as\n  -- DEPTNO being deleted from dept table:\n\nBEGIN\n  DELETE FROM emp\n  WHERE emp.Deptno = :OLD.Deptno;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dml-triggers-38.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dml-triggers.html\nCREATE SEQUENCE Update_sequence\n  INCREMENT BY 1 MAXVALUE 5000 CYCLE;\nCREATE OR REPLACE PACKAGE Integritypackage AUTHID DEFINER AS\n  Updateseq NUMBER;\nEND Integritypackage;\n/\nCREATE OR REPLACE PACKAGE BODY Integritypackage AS\nEND Integritypackage;\n/\nALTER TABLE emp ADD Update_id NUMBER;\nCREATE OR REPLACE TRIGGER dept_cascade1\n  BEFORE UPDATE OF Deptno ON dept\nDECLARE\n  -- Before updating dept table (this is a statement trigger),\n  -- generate sequence number\n  -- & assign it to public variable UPDATESEQ of\n  -- user-defined package named INTEGRITYPACKAGE:\nBEGIN\n  Integritypackage.Updateseq := Update_sequence.NEXTVAL;\nEND;\n/\nCREATE OR REPLACE TRIGGER dept_cascade2\n  AFTER DELETE OR UPDATE OF Deptno ON dept\n  FOR EACH ROW\n\n  -- For each department number in dept that is updated,\n  -- cascade update to dependent foreign keys in emp table.\n  -- Cascade update only if child row was not updated by this trigger:\nBEGIN\n  IF UPDATING THEN\n    UPDATE emp\n    SET Deptno = :NEW.Deptno,\n        Update_id = Integritypackage.Updateseq   --from 1st\n    WHERE emp.Deptno = :OLD.Deptno\n    AND Update_id IS NULL;\n\n    /* Only NULL if not updated by 3rd trigger\n       fired by same triggering statement */\n  END IF;\n  IF DELETING THEN\n    -- After row is deleted from dept,\n    -- delete all rows from emp table whose DEPTNO is same as\n    -- DEPTNO being deleted from dept table:\n    DELETE FROM emp\n    WHERE emp.Deptno = :OLD.Deptno;\n  END IF;\nEND;\n/\nCREATE OR REPLACE TRIGGER dept_cascade3\n  AFTER UPDATE OF Deptno ON dept\nBEGIN UPDATE emp\n  SET Update_id = NULL\n  WHERE Update_id = Integritypackage.Updateseq;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dml-triggers-39.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dml-triggers.html\nCREATE TABLE Salgrade (\n  Grade               NUMBER,\n  Losal               NUMBER,\n  Hisal               NUMBER,\n  Job_classification  VARCHAR2(9));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dml-triggers-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dml-triggers.html\nINSERT INTO order_info VALUES\n   (999, 'Smith', 'John', 2500, TO_DATE('13-MAR-2001', 'DD-MON-YYYY'), 0);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dml-triggers-40.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dml-triggers.html\nCREATE OR REPLACE TRIGGER salary_check\n  BEFORE INSERT OR UPDATE OF Sal, Job ON Emp\n  FOR EACH ROW\n\nDECLARE\n  Minsal               NUMBER;\n  Maxsal               NUMBER;\n  Salary_out_of_range  EXCEPTION;\n  PRAGMA EXCEPTION_INIT (Salary_out_of_range, -4096);\n\nBEGIN\n  /* Retrieve minimum & maximum salary for employee's new job classification\n     from SALGRADE table into MINSAL and MAXSAL: */\n\n  SELECT Losal, Hisal INTO Minsal, Maxsal\n  FROM Salgrade\n  WHERE Job_classification = :NEW.Job;\n\n  /* If employee's new salary is less than or greater than\n     job classification's limits, raise exception.\n     Exception message is returned and pending INSERT or UPDATE statement\n     that fired the trigger is rolled back: */\n\n  IF (:NEW.Sal < Minsal OR :NEW.Sal > Maxsal) THEN\n    RAISE Salary_out_of_range;\n  END IF;\nEXCEPTION\n  WHEN Salary_out_of_range THEN\n    Raise_application_error (\n      -20300,\n      'Salary '|| TO_CHAR(:NEW.Sal) ||' out of range for '\n      || 'job classification ' ||:NEW.Job\n      ||' for employee ' || :NEW.Ename\n    );\n  WHEN NO_DATA_FOUND THEN\n    Raise_application_error(-20322, 'Invalid Job Classification');\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dml-triggers-41.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dml-triggers.html\nCREATE OR REPLACE TRIGGER Employee_permit_changes\n  BEFORE INSERT OR DELETE OR UPDATE ON employees\nDECLARE\n  Dummy             INTEGER;\n  Not_on_weekends   EXCEPTION;\n  Nonworking_hours  EXCEPTION;\n  PRAGMA EXCEPTION_INIT (Not_on_weekends, -4097);\n  PRAGMA EXCEPTION_INIT (Nonworking_hours, -4099);\nBEGIN\n   -- Check for weekends:\n\n   IF (TO_CHAR(Sysdate, 'DAY') = 'SAT' OR\n     TO_CHAR(Sysdate, 'DAY') = 'SUN') THEN\n       RAISE Not_on_weekends;\n   END IF;\n\n  -- Check for work hours (8am to 6pm):\n\n  IF (TO_CHAR(Sysdate, 'HH24') < 8 OR\n    TO_CHAR(Sysdate, 'HH24') > 18) THEN\n      RAISE Nonworking_hours;\n  END IF;\n\nEXCEPTION\n  WHEN Not_on_weekends THEN\n    Raise_application_error(-20324,'Might not change '\n      ||'employee table during the weekend');\n  WHEN Nonworking_hours THEN\n    Raise_application_error(-20326,'Might not change '\n     ||'emp table during Nonworking hours');\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dml-triggers-42.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dml-triggers.html\nALTER TABLE Emp ADD(\n   Uppername   VARCHAR2(20),\n   Soundexname VARCHAR2(20));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dml-triggers-43.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dml-triggers.html\nCREATE OR REPLACE TRIGGER Derived \nBEFORE INSERT OR UPDATE OF Ename ON Emp\n\n/* Before updating the ENAME field, derive the values for\n   the UPPERNAME and SOUNDEXNAME fields. Restrict users\n   from updating these fields directly: */\nFOR EACH ROW\nBEGIN\n  :NEW.Uppername := UPPER(:NEW.Ename);\n  :NEW.Soundexname := SOUNDEX(:NEW.Ename);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dml-triggers-44.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dml-triggers.html\nCREATE OR REPLACE TYPE Book_t AS OBJECT (\n  Booknum    NUMBER,\n  Title      VARCHAR2(20),\n  Author     VARCHAR2(20),\n  Available  CHAR(1)\n);\n/\nCREATE OR REPLACE TYPE Book_list_t AS TABLE OF Book_t;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dml-triggers-45.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dml-triggers.html\nDROP TABLE Book_table;\nCREATE TABLE Book_table (\n  Booknum    NUMBER,\n  Section    VARCHAR2(20),\n  Title      VARCHAR2(20),\n  Author     VARCHAR2(20),\n  Available  CHAR(1)\n);\nINSERT INTO Book_table (\n  Booknum, Section, Title, Author, Available\n) \nVALUES (\n  121001, 'Classic', 'Iliad', 'Homer', 'Y'\n);\nINSERT INTO Book_table (\n  Booknum, Section, Title, Author, Available\n) \nVALUES ( \n  121002, 'Novel', 'Gone with the Wind', 'Mitchell M', 'N'\n);\nSELECT * FROM Book_table ORDER BY Booknum;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dml-triggers-47.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dml-triggers.html\nDROP TABLE Library_table;\nCREATE TABLE Library_table (Section VARCHAR2(20));\nINSERT INTO Library_table (Section)\nVALUES ('Novel');\nINSERT INTO Library_table (Section)\nVALUES ('Classic');\nSELECT * FROM Library_table ORDER BY Section;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dml-triggers-49.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dml-triggers.html\nCREATE OR REPLACE VIEW Library_view AS\n  SELECT i.Section, CAST (\n    MULTISET (\n      SELECT b.Booknum, b.Title, b.Author, b.Available\n      FROM Book_table b\n      WHERE b.Section = i.Section\n    ) AS Book_list_t\n  ) BOOKLIST\n  FROM Library_table i;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dml-triggers-50.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dml-triggers.html\nCREATE OR REPLACE TRIGGER Library_trigger\n  INSTEAD OF\n  INSERT ON Library_view\n  FOR EACH ROW\nDECLARE\n  Bookvar  Book_t;\n  i        INTEGER;\nBEGIN\n  INSERT INTO Library_table\n  VALUES (:NEW.Section);\n\n  FOR i IN 1..:NEW.Booklist.COUNT LOOP\n    Bookvar := :NEW.Booklist(i);\n\n    INSERT INTO Book_table (\n      Booknum, Section, Title, Author, Available      \n    )\n    VALUES (\n      Bookvar.booknum, :NEW.Section, Bookvar.Title,\n      Bookvar.Author, bookvar.Available\n    );\n  END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dml-triggers-51.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dml-triggers.html\nINSERT INTO Library_view (Section, Booklist)\nVALUES (\n  'History', \n  book_list_t (book_t (121330, 'Alexander', 'Mirth', 'Y'))\n);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dml-triggers-52.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dml-triggers.html\nSELECT * FROM Library_view ORDER BY Section;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dml-triggers-54.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dml-triggers.html\nSELECT * FROM Book_table ORDER BY Booknum;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dml-triggers-56.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dml-triggers.html\nSELECT * FROM Library_table ORDER BY Section;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dml-triggers-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dml-triggers.html\nSELECT COUNT(*) FROM order_info WHERE customer_id = 999;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/dml-triggers-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/dml-triggers.html\nSELECT COUNT(*) FROM customers WHERE customer_id = 999;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/exception-handling-triggers-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/exception-handling-triggers.html\nCREATE OR REPLACE TRIGGER employees_tr\n  AFTER INSERT ON employees\n  FOR EACH ROW\nBEGIN\n  -- When remote database is unavailable, compilation fails here:\n  INSERT INTO employees@remote (\n    employee_id, first_name, last_name, email, hire_date, job_id\n  ) \n  VALUES (\n    99, 'Jane', 'Doe', 'jane.doe@example.com', SYSDATE, 'ST_MAN'\n  );\nEXCEPTION\n  WHEN OTHERS THEN\n    INSERT INTO emp_log (Emp_id, Log_date, New_salary, Action)\n      VALUES (99, SYSDATE, NULL, 'Could not insert');\n    RAISE;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/exception-handling-triggers-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/exception-handling-triggers.html\nCREATE OR REPLACE PROCEDURE insert_row_proc AUTHID CURRENT_USER AS\n  no_remote_db EXCEPTION;  -- declare exception\n  PRAGMA EXCEPTION_INIT (no_remote_db, -20000);\n                           -- assign error code to exception\nBEGIN\n  INSERT INTO employees@remote (\n    employee_id, first_name, last_name, email, hire_date, job_id\n  ) \n  VALUES (\n    99, 'Jane', 'Doe', 'jane.doe@example.com', SYSDATE, 'ST_MAN'\n  );\nEXCEPTION\n  WHEN OTHERS THEN\n    INSERT INTO emp_log (Emp_id, Log_date, New_salary, Action)\n      VALUES (99, SYSDATE, NULL, 'Could not insert row.');\n\n  RAISE_APPLICATION_ERROR (-20000, 'Remote database is unavailable.');\nEND;\n/\nCREATE OR REPLACE TRIGGER employees_tr\n  AFTER INSERT ON employees\n  FOR EACH ROW\nBEGIN\n  insert_row_proc;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/exception-propagation-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/exception-propagation.html\nCREATE OR REPLACE PROCEDURE p AUTHID DEFINER AS\nBEGIN\n\n  DECLARE\n    past_due     EXCEPTION;\n    PRAGMA EXCEPTION_INIT (past_due, -4910);\n    due_date     DATE := trunc(SYSDATE) - 1;\n    todays_date  DATE := trunc(SYSDATE);\n  BEGIN\n    IF due_date < todays_date THEN\n      RAISE past_due;\n    END IF;\n  END;\n\nEXCEPTION\n  WHEN OTHERS THEN\n    ROLLBACK;\n    RAISE;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/exception-propagation-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/exception-propagation.html\nBEGIN\n\n  DECLARE\n    past_due     EXCEPTION;\n    due_date     DATE := trunc(SYSDATE) - 1;\n    todays_date  DATE := trunc(SYSDATE);\n  BEGIN\n    IF due_date < todays_date THEN\n      RAISE past_due;\n    END IF;\n  END;\n\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/exception-propagation-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/exception-propagation.html\nCREATE OR REPLACE PROCEDURE print_reciprocal (n NUMBER) AUTHID DEFINER IS\nBEGIN\n \n  BEGIN\n    DBMS_OUTPUT.PUT_LINE(1/n);\n  EXCEPTION\n    WHEN ZERO_DIVIDE THEN\n      DBMS_OUTPUT.PUT_LINE('Error in inner block:');\n      DBMS_OUTPUT.PUT_LINE(1/n || ' is undefined.');\n  END;\n\nEXCEPTION\n  WHEN ZERO_DIVIDE THEN  -- handles exception raised in exception handler\n    DBMS_OUTPUT.PUT('Error in outer block: ');\n    DBMS_OUTPUT.PUT_LINE('1/0 is undefined.');\nEND;\n/\nBEGIN\n  print_reciprocal(0);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/exception-propagation-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/exception-propagation.html\nCREATE OR REPLACE PROCEDURE descending_reciprocals (n INTEGER) AUTHID DEFINER IS\n  i INTEGER;\n  i_is_one EXCEPTION;\nBEGIN\n  i := n;\n\n  LOOP\n    IF i = 1 THEN\n      RAISE i_is_one;\n    ELSE\n      DBMS_OUTPUT.PUT_LINE('Reciprocal of ' || i || ' is ' || 1/i);\n    END IF;\n\n    i := i - 1;\n  END LOOP;\nEXCEPTION\n  WHEN i_is_one THEN\n    DBMS_OUTPUT.PUT_LINE('1 is its own reciprocal.');\n    DBMS_OUTPUT.PUT_LINE('Reciprocal of ' || TO_CHAR(i-1) ||\n                         ' is ' || TO_CHAR(1/(i-1)));\n\n  WHEN ZERO_DIVIDE THEN\n    DBMS_OUTPUT.PUT_LINE('Error:');\n    DBMS_OUTPUT.PUT_LINE(1/n || ' is undefined');\nEND;\n/\nBEGIN\n  descending_reciprocals(3);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/exception-propagation-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/exception-propagation.html\nCREATE OR REPLACE PROCEDURE descending_reciprocals (n INTEGER) AUTHID DEFINER IS\n  i INTEGER;\n  i_is_one EXCEPTION;\nBEGIN\n\n  BEGIN\n    i := n;\n\n    LOOP\n      IF i = 1 THEN\n        RAISE i_is_one;\n      ELSE\n        DBMS_OUTPUT.PUT_LINE('Reciprocal of ' || i || ' is ' || 1/i);\n      END IF;\n\n      i := i - 1;\n    END LOOP;\n  EXCEPTION\n    WHEN i_is_one THEN\n      DBMS_OUTPUT.PUT_LINE('1 is its own reciprocal.');\n      DBMS_OUTPUT.PUT_LINE('Reciprocal of ' || TO_CHAR(i-1) ||\n                           ' is ' || TO_CHAR(1/(i-1)));\n\n    WHEN ZERO_DIVIDE THEN\n      DBMS_OUTPUT.PUT_LINE('Error:');\n      DBMS_OUTPUT.PUT_LINE(1/n || ' is undefined');\n  END;\n\nEXCEPTION\n  WHEN ZERO_DIVIDE THEN  -- handles exception raised in exception handler\n    DBMS_OUTPUT.PUT_LINE('Error:');\n    DBMS_OUTPUT.PUT_LINE('1/0 is undefined');\nEND;\n/\nBEGIN\n  descending_reciprocals(3);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/exception-propagation-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/exception-propagation.html\nDECLARE\n  credit_limit CONSTANT NUMBER(3) := 5000;  -- Maximum value is 999\nBEGIN\n  NULL;\nEXCEPTION\n  WHEN VALUE_ERROR THEN\n    DBMS_OUTPUT.PUT_LINE('Exception raised in declaration.');\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/exception-propagation-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/exception-propagation.html\nBEGIN\n\n  DECLARE\n    credit_limit CONSTANT NUMBER(3) := 5000;\n  BEGIN\n    NULL;\n  END;\n\nEXCEPTION\n  WHEN VALUE_ERROR THEN\n    DBMS_OUTPUT.PUT_LINE('Exception raised in declaration.');\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/exception-propagation-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/exception-propagation.html\nCREATE OR REPLACE PROCEDURE print_reciprocal (n NUMBER) AUTHID DEFINER IS\nBEGIN\n  DBMS_OUTPUT.PUT_LINE(1/n);  -- handled\nEXCEPTION\n  WHEN ZERO_DIVIDE THEN\n    DBMS_OUTPUT.PUT_LINE('Error:');\n    DBMS_OUTPUT.PUT_LINE(1/n || ' is undefined');  -- not handled\nEND;\n/\nBEGIN  -- invoking block\n  print_reciprocal(0);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/exception-propagation-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/exception-propagation.html\nCREATE OR REPLACE PROCEDURE print_reciprocal (n NUMBER) AUTHID DEFINER IS\nBEGIN\n  DBMS_OUTPUT.PUT_LINE(1/n);\nEXCEPTION\n  WHEN ZERO_DIVIDE THEN\n    DBMS_OUTPUT.PUT_LINE('Error:');\n    DBMS_OUTPUT.PUT_LINE(1/n || ' is undefined');\nEND;\n/\nBEGIN  -- invoking block\n  print_reciprocal(0);\nEXCEPTION\n  WHEN ZERO_DIVIDE THEN  -- handles exception raised in exception handler\n    DBMS_OUTPUT.PUT_LINE('1/0 is undefined.');\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/expressions-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/expressions.html\nDECLARE\n  x VARCHAR2(4) := 'suit';\n  y VARCHAR2(4) := 'case';\nBEGIN\n  DBMS_OUTPUT.PUT_LINE (x || y);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/expressions-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/expressions.html\nDECLARE\n  salary      NUMBER := 60000;\n  commission  NUMBER := 0.10;\nBEGIN\n  -- Division has higher precedence than addition:\n\n  DBMS_OUTPUT.PUT_LINE('5 + 12 / 4 = ' || TO_CHAR(5 + 12 / 4));\n  DBMS_OUTPUT.PUT_LINE('12 / 4 + 5 = ' || TO_CHAR(12 / 4 + 5));\n\n -- Parentheses override default operator precedence:\n\n  DBMS_OUTPUT.PUT_LINE('8 + 6 / 2 = ' || TO_CHAR(8 + 6 / 2));\n  DBMS_OUTPUT.PUT_LINE('(8 + 6) / 2 = ' || TO_CHAR((8 + 6) / 2));\n\n  -- Most deeply nested operation is evaluated first:\n\n  DBMS_OUTPUT.PUT_LINE('100 + (20 / 5 + (7 - 3)) = '\n                      || TO_CHAR(100 + (20 / 5 + (7 - 3))));\n\n  -- Parentheses, even when unnecessary, improve readability:\n\n  DBMS_OUTPUT.PUT_LINE('(salary * 0.05) + (commission * 0.25) = '\n    || TO_CHAR((salary * 0.05) + (commission * 0.25))\n  );\n\n  DBMS_OUTPUT.PUT_LINE('salary * 0.05 + commission * 0.25 = '\n    || TO_CHAR(salary * 0.05 + commission * 0.25)\n  );\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/expressions-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/expressions.html\nCREATE OR REPLACE PROCEDURE print_boolean (\n  b_name   VARCHAR2,\n  b_value  BOOLEAN\n) AUTHID DEFINER IS\nBEGIN\n  IF b_value IS NULL THEN\n    DBMS_OUTPUT.PUT_LINE (b_name || ' = NULL');\n  ELSIF b_value = TRUE THEN\n    DBMS_OUTPUT.PUT_LINE (b_name || ' = TRUE');\n  ELSE\n    DBMS_OUTPUT.PUT_LINE (b_name || ' = FALSE');\n  END IF;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/expressions-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/expressions.html\nDECLARE\n  PROCEDURE print_x_and_y (\n    x  BOOLEAN,\n    y  BOOLEAN\n  ) IS\n  BEGIN\n   print_boolean ('x', x);\n   print_boolean ('y', y);\n   print_boolean ('x AND y', x AND y);\n END print_x_and_y;\n\nBEGIN\n print_x_and_y (FALSE, FALSE);\n print_x_and_y (TRUE, FALSE);\n print_x_and_y (FALSE, TRUE);\n print_x_and_y (TRUE, TRUE);\n\n print_x_and_y (TRUE, NULL);\n print_x_and_y (FALSE, NULL);\n print_x_and_y (NULL, TRUE);\n print_x_and_y (NULL, FALSE);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/expressions-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/expressions.html\nDECLARE\n  PROCEDURE print_x_or_y (\n    x  BOOLEAN,\n    y  BOOLEAN\n  ) IS\n  BEGIN\n    print_boolean ('x', x);\n    print_boolean ('y', y);\n    print_boolean ('x OR y', x OR y);\n  END print_x_or_y;\n\nBEGIN\n  print_x_or_y (FALSE, FALSE);\n  print_x_or_y (TRUE, FALSE);\n  print_x_or_y (FALSE, TRUE);\n  print_x_or_y (TRUE, TRUE);\n\n  print_x_or_y (TRUE, NULL);\n  print_x_or_y (FALSE, NULL);\n  print_x_or_y (NULL, TRUE);\n  print_x_or_y (NULL, FALSE);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/expressions-17.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/expressions.html\nDECLARE\n  PROCEDURE print_not_x (\n    x  BOOLEAN\n  ) IS\n  BEGIN\n    print_boolean ('x', x);\n    print_boolean ('NOT x', NOT x);\n  END print_not_x;\n\nBEGIN\n  print_not_x (TRUE);\n  print_not_x (FALSE);\n  print_not_x (NULL);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/expressions-19.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/expressions.html\nDECLARE\n  x NUMBER := 5;\n  y NUMBER := NULL;\nBEGIN\n  IF x != y THEN  -- yields NULL, not TRUE\n    DBMS_OUTPUT.PUT_LINE('x != y');  -- not run\n  ELSIF x = y THEN -- also yields NULL\n    DBMS_OUTPUT.PUT_LINE('x = y');\n  ELSE\n    DBMS_OUTPUT.PUT_LINE\n      ('Can''t tell if x and y are equal or not.');\n  END IF;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/expressions-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/expressions.html\nBEGIN\n  DBMS_OUTPUT.PUT_LINE ('apple' || NULL || NULL || 'sauce');\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/expressions-21.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/expressions.html\nDECLARE\n  a NUMBER := NULL;\n  b NUMBER := NULL;\nBEGIN\n  IF a = b THEN  -- yields NULL, not TRUE\n    DBMS_OUTPUT.PUT_LINE('a = b');  -- not run\n  ELSIF a != b THEN  -- yields NULL, not TRUE\n    DBMS_OUTPUT.PUT_LINE('a != b');  -- not run\n  ELSE\n    DBMS_OUTPUT.PUT_LINE('Can''t tell if two NULLs are equal');\n  END IF;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/expressions-23.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/expressions.html\nDECLARE\n  x    INTEGER := 2;\n  Y    INTEGER := 5;\n  high INTEGER;\nBEGIN\n  IF (x > y)       -- If x or y is NULL, then (x > y) is NULL\n    THEN high := x;  -- run if (x > y) is TRUE\n    ELSE high := y;  -- run if (x > y) is FALSE or NULL\n  END IF;\n\n  IF NOT (x > y)   -- If x or y is NULL, then NOT (x > y) is NULL\n    THEN high := y;  -- run if NOT (x > y) is TRUE\n    ELSE high := x;  -- run if NOT (x > y) is FALSE or NULL\n  END IF;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/expressions-24.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/expressions.html\nDECLARE\n  x  BOOLEAN := FALSE;\n  y  BOOLEAN := FALSE;\n\nBEGIN\n  print_boolean ('NOT x AND y', NOT x AND y);\n  print_boolean ('NOT (x AND y)', NOT (x AND y));\n  print_boolean ('(NOT x) AND y', (NOT x) AND y);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/expressions-26.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/expressions.html\nDECLARE\n  on_hand  INTEGER := 0;\n  on_order INTEGER := 100;\nBEGIN\n  -- Does not cause divide-by-zero error;\n  -- evaluation stops after first expression\n\n  IF (on_hand = 0) OR ((on_order / on_hand) < 5) THEN\n    DBMS_OUTPUT.PUT_LINE('On hand quantity is zero.');\n  END IF;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/expressions-28.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/expressions.html\nBEGIN\n  print_boolean ('(2 + 2 =  4)', 2 + 2 = 4);\n\n  print_boolean ('(2 + 2 <> 4)', 2 + 2 <> 4);\n  print_boolean ('(2 + 2 != 4)', 2 + 2 != 4);\n  print_boolean ('(2 + 2 ~= 4)', 2 + 2 ~= 4);\n  print_boolean ('(2 + 2 ^= 4)', 2 + 2  ^= 4);\n\n  print_boolean ('(1 < 2)', 1 < 2);\n\n  print_boolean ('(1 > 2)', 1 > 2);\n\n  print_boolean ('(1 <= 2)', 1 <= 2);\n\n  print_boolean ('(1 >= 1)', 1 >= 1);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/expressions-35.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/expressions.html\nDECLARE\n  PROCEDURE compare (\n    value   VARCHAR2,\n    pattern VARCHAR2\n  ) IS\n  BEGIN\n    IF value LIKE pattern THEN\n      DBMS_OUTPUT.PUT_LINE ('TRUE');\n    ELSE\n      DBMS_OUTPUT.PUT_LINE ('FALSE');\n    END IF;\n  END;\nBEGIN\n  compare('Johnson', 'J%s_n');\n  compare('Johnson', 'J%S_N');\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/expressions-37.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/expressions.html\nDECLARE\n  PROCEDURE half_off (sale_sign VARCHAR2) IS\n  BEGIN\n    IF sale_sign LIKE '50\\% off!' ESCAPE '\\' THEN\n      DBMS_OUTPUT.PUT_LINE ('TRUE');\n    ELSE\n      DBMS_OUTPUT.PUT_LINE ('FALSE');\n    END IF;\n  END;\nBEGIN\n  half_off('Going out of business!');\n  half_off('50% off!');\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/expressions-39.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/expressions.html\nBEGIN\n  print_boolean ('2 BETWEEN 1 AND 3', 2 BETWEEN 1 AND 3);\n  print_boolean ('2 BETWEEN 2 AND 3', 2 BETWEEN 2 AND 3);\n  print_boolean ('2 BETWEEN 1 AND 2', 2 BETWEEN 1 AND 2);\n  print_boolean ('2 BETWEEN 3 AND 4', 2 BETWEEN 3 AND 4);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/expressions-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/expressions.html\nDECLARE\n  a INTEGER := 1+2**2;\n  b INTEGER := (1+2)**2;\nBEGIN\n  DBMS_OUTPUT.PUT_LINE('a = ' || TO_CHAR(a));\n  DBMS_OUTPUT.PUT_LINE('b = ' || TO_CHAR(b));\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/expressions-41.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/expressions.html\nDECLARE\n  letter VARCHAR2(1) := 'm';\nBEGIN\n  print_boolean (\n    'letter IN (''a'', ''b'', ''c'')',\n    letter IN ('a', 'b', 'c')\n  );\n  print_boolean (\n    'letter IN (''z'', ''m'', ''y'', ''p'')',\n    letter IN ('z', 'm', 'y', 'p')\n  );\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/expressions-43.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/expressions.html\nDECLARE\n  a INTEGER; -- Initialized to NULL by default\n  b INTEGER := 10;\n  c INTEGER := 100;\nBEGIN\n  print_boolean ('100 IN (a, b, c)', 100 IN (a, b, c));\n  print_boolean ('100 NOT IN (a, b, c)', 100 NOT IN (a, b, c));\n\n  print_boolean ('100 IN (a, b)', 100 IN (a, b));\n  print_boolean ('100 NOT IN (a, b)', 100 NOT IN (a, b));\n\n  print_boolean ('a IN (a, b)', a IN (a, b));\n  print_boolean ('a NOT IN (a, b)', a NOT IN (a, b));\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/expressions-46.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/expressions.html\nDECLARE\n  done BOOLEAN;\nBEGIN\n  -- These WHILE loops are equivalent\n\n  done := FALSE;\n  WHILE done = FALSE\n    LOOP\n      done := TRUE;\n    END LOOP;\n\n  done := FALSE;\n  WHILE NOT (done = TRUE)\n    LOOP\n      done := TRUE;\n    END LOOP;\n\n  done := FALSE;\n  WHILE NOT done\n    LOOP\n      done := TRUE;\n    END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/expressions-48.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/expressions.html\nDECLARE\n  grade CHAR(1) := 'B';\n  appraisal VARCHAR2(20);\nBEGIN\n  appraisal :=\n    CASE grade\n      WHEN 'A' THEN 'Excellent'\n      WHEN 'B' THEN 'Very Good'\n      WHEN 'C' THEN 'Good'\n      WHEN 'D' THEN 'Fair'\n      WHEN 'F' THEN 'Poor'\n      ELSE 'No such grade'\n    END;\n    DBMS_OUTPUT.PUT_LINE ('Grade ' || grade || ' is ' || appraisal);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/expressions-50.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/expressions.html\nDECLARE\n  grade CHAR(1); -- NULL by default\n  appraisal VARCHAR2(20);\nBEGIN\n  appraisal :=\n  CASE grade\n    WHEN NULL THEN 'No grade assigned'\n    WHEN 'A' THEN 'Excellent'\n    WHEN 'B' THEN 'Very Good'\n    WHEN 'C' THEN 'Good'\n    WHEN 'D' THEN 'Fair'\n    WHEN 'F' THEN 'Poor'\n    ELSE 'No such grade'\n  END;\n  DBMS_OUTPUT.PUT_LINE ('Grade ' || grade || ' is ' || appraisal);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/expressions-52.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/expressions.html\nDECLARE\n    salary NUMBER := 7000;\n    salary_level VARCHAR2(20);\nBEGIN\n    salary_level :=\n\tCASE salary\n\t\tWHEN 1000, 2000 THEN 'low'\n\t\tWHEN 3000, 4000, 5000 THEN 'normal'\n\t\tWHEN 6000, 7000, 8000 THEN 'high'\n\t\tELSE 'executive pay'\n\tEND;\n\tDBMS_OUTPUT.PUT_LINE('Salary level is: ' || salary_level);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/expressions-54.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/expressions.html\nDECLARE\n    data_val NUMBER := 30;\n    status VARCHAR2(20);\nBEGIN\n    status :=\n\tCASE data_val/2\n\t\tWHEN < 0, > 50 THEN 'outlier'\n\t\tWHEN BETWEEN 10 AND 30 THEN 'good'\n\t\tELSE 'bad'\n\tEND;\n\tDBMS_OUTPUT.PUT_LINE('The data status is: ' || status);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/expressions-57.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/expressions.html\nDECLARE\n  grade      CHAR(1) := 'B';\n  appraisal  VARCHAR2(120);\n  id         NUMBER  := 8429862;\n  attendance NUMBER := 150;\n  min_days   CONSTANT NUMBER := 200;\n\n  FUNCTION attends_this_school (id NUMBER)\n    RETURN BOOLEAN IS\n  BEGIN\n    RETURN TRUE;\n  END;\nBEGIN\n  appraisal :=\n  CASE\n    WHEN attends_this_school(id) = FALSE\n      THEN 'Student not enrolled'\n    WHEN grade = 'F' OR attendance < min_days\n      THEN 'Poor (poor performance or bad attendance)'\n    WHEN grade = 'A' THEN 'Excellent'\n    WHEN grade = 'B' THEN 'Very Good'\n    WHEN grade = 'C' THEN 'Good'\n    WHEN grade = 'D' THEN 'Fair'\n    ELSE 'No such grade'\n  END;\n  DBMS_OUTPUT.PUT_LINE\n    ('Result for student ' || id || ' is ' || appraisal);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/expressions-59.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/expressions.html\nDECLARE\n  grade CHAR(1); -- NULL by default\n  appraisal VARCHAR2(20);\nBEGIN\n  appraisal :=\n    CASE\n      WHEN grade IS NULL THEN 'No grade assigned'\n      WHEN grade = 'A' THEN 'Excellent'\n      WHEN grade = 'B' THEN 'Very Good'\n      WHEN grade = 'C' THEN 'Good'\n      WHEN grade = 'D' THEN 'Fair'\n      WHEN grade = 'F' THEN 'Poor'\n      ELSE 'No such grade'\n    END;\n    DBMS_OUTPUT.PUT_LINE ('Grade ' || grade || ' is ' || appraisal);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/expressions-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/expressions.html\nDECLARE\n  a INTEGER := ((1+2)*(3+4))/7;\nBEGIN\n  DBMS_OUTPUT.PUT_LINE('a = ' || TO_CHAR(a));\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/expressions-62.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/expressions.html\nCREATE PACKAGE my_debug IS\n  debug CONSTANT BOOLEAN := TRUE;\n  trace CONSTANT BOOLEAN := TRUE;\nEND my_debug;\n/\nCREATE PROCEDURE my_proc1 AUTHID DEFINER IS\nBEGIN\n  $IF my_debug.debug $THEN\n    DBMS_OUTPUT.put_line('Debugging ON');\n  $ELSE\n    DBMS_OUTPUT.put_line('Debugging OFF');\n  $END\nEND my_proc1;\n/\nCREATE PROCEDURE my_proc2 AUTHID DEFINER IS\nBEGIN\n  $IF my_debug.trace $THEN\n    DBMS_OUTPUT.put_line('Tracing ON');\n  $ELSE\n    DBMS_OUTPUT.put_line('Tracing OFF');\n  $END\nEND my_proc2;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/expressions-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/expressions.html\nDECLARE\n  a INTEGER := 2**2*3**2;\n  b INTEGER := (2**2)*(3**2);\nBEGIN\n  DBMS_OUTPUT.PUT_LINE('a = ' || TO_CHAR(a));\n  DBMS_OUTPUT.PUT_LINE('b = ' || TO_CHAR(b));\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/external-subprograms-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/external-subprograms.html\nCREATE OR REPLACE PROCEDURE raise_salary (\n  empid NUMBER,\n  pct   NUMBER\n) AS\n  LANGUAGE JAVA NAME 'Adjuster.raiseSalary (int, float)';  -- call specification\n/\nBEGIN\n  raise_salary(120, 10);  -- invoke Adjuster.raiseSalary by PL/SQL name\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/external-subprograms-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/external-subprograms.html\nCREATE PROCEDURE java_sleep (\n  milli_seconds IN NUMBER\n) AS LANGUAGE JAVA NAME 'java.lang.Thread.sleep(long)';\n/\nCREATE OR REPLACE PROCEDURE sleep (\n  milli_seconds IN NUMBER\n) AUTHID DEFINER IS\nBEGIN\n  DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.get_time());\n  java_sleep (milli_seconds);\n  DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.get_time());\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/external-subprograms-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/external-subprograms.html\nCREATE OR REPLACE FUNCTION js_raise_sal(\n  p_empno NUMBER, \n  p_percent NUMBER\n) RETURN NUMBER \nAS MLE MODULE js_adjuster\nSIGNATURE 'raiseSal';\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/external-subprograms-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/external-subprograms.html\nSET SERVEROUTPUT ON;\nDECLARE\n  l_new_sal NUMBER;\n  l_old_sal NUMBER;\n  l_empNo NUMBER := 100;\nBEGIN\n  SELECT salary\n  INTO l_old_sal\n  FROM hr.employees\n  WHERE employee_id = l_empNo;\n\nDBMS_OUTPUT.PUT_LINE('Current salary for employee ' || l_empNo\n                          || ' amounts to ' || l_old_sal);\n\nl_new_sal := js_raise_sal(\n  p_empno => l_empNo,\n  p_percent => 10\n);\n\nDBMS_OUTPUT.PUT_LINE('New salary for employee ' || l_empNo\n                          || ' increased to ' || l_new_sal);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/forward-declaration-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/forward-declaration.html\nDECLARE\n  -- Declare proc1 (forward declaration):\n  PROCEDURE proc1(number1 NUMBER);\n\n  -- Declare and define proc2:\n  PROCEDURE proc2(number2 NUMBER) IS\n  BEGIN\n    proc1(number2);\n  END;\n\n  -- Define proc 1:\n  PROCEDURE proc1(number1 NUMBER) IS\n  BEGIN\n    proc2 (number1);\n  END;\n\nBEGIN\n  NULL;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/inserting-records-tables-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/inserting-records-tables.html\nDROP TABLE schedule;\nCREATE TABLE schedule (\n  week  NUMBER,\n  Mon   VARCHAR2(10),\n  Tue   VARCHAR2(10),\n  Wed   VARCHAR2(10),\n  Thu   VARCHAR2(10),\n  Fri   VARCHAR2(10),\n  Sat   VARCHAR2(10),\n  Sun   VARCHAR2(10)\n);\nDECLARE\n  default_week  schedule%ROWTYPE;\n  i             NUMBER;\nBEGIN\n  default_week.Mon := '0800-1700';\n  default_week.Tue := '0800-1700';\n  default_week.Wed := '0800-1700';\n  default_week.Thu := '0800-1700';\n  default_week.Fri := '0800-1700';\n  default_week.Sat := 'Day Off';\n  default_week.Sun := 'Day Off';\n\n  FOR i IN 1..6 LOOP\n    default_week.week    := i;\n\n    INSERT INTO schedule VALUES default_week;\n  END LOOP;\nEND;\n/\nCOLUMN week FORMAT 99\n\nCOLUMN Mon  FORMAT A9\n\nCOLUMN Tue  FORMAT A9\n\nCOLUMN Wed  FORMAT A9\n\nCOLUMN Thu  FORMAT A9\n\nCOLUMN Fri  FORMAT A9\n\nCOLUMN Sat  FORMAT A9\n\nCOLUMN Sun  FORMAT A9\n\nSELECT * FROM schedule;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/invokers-rights-and-definers-rights-authid-property-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/invokers-rights-and-definers-rights-authid-property.html\nGRANT INHERIT PRIVILEGES ON current_user TO PUBLIC\nGRANT INHERIT PRIVILEGES ON current_user TO unit_owner\nGRANT INHERIT ANY PRIVILEGES TO unit_owner"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/invokers-rights-and-definers-rights-authid-property-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/invokers-rights-and-definers-rights-authid-property.html\nGRANT read, execute TO FUNCTION scott.func, PACKAGE sys.pkg"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/invokers-rights-and-definers-rights-authid-property-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/invokers-rights-and-definers-rights-authid-property.html\nCREATE OR REPLACE PROCEDURE hr_remote_db_link\nAS\nv_employee_id VARCHAR(50);\nBEGIN  \n    EXECUTE IMMEDIATE 'SELECT employee_id FROM employees@dblink' into v_employee_id;\n    DBMS_OUTPUT.PUT_LINE('employee_id: ' || v_employee_id);\nEND ;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/lexical-units-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/lexical-units.html\nSELECT TYPE_NAME FROM ALL_TYPES WHERE PREDEFINED='YES';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/lexical-units-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/lexical-units.html\nDECLARE\n  \"HELLO\" varchar2(10) := 'hello';  -- HELLO is not a reserved word\n  \"BEGIN\" varchar2(10) := 'begin';  -- BEGIN is a reserved word\nBEGIN\n  DBMS_Output.Put_Line(Hello);      -- Double quotation marks are optional\n  DBMS_Output.Put_Line(BEGIN);      -- Double quotation marks are required\nend;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/lexical-units-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/lexical-units.html\nDECLARE\n  \"HELLO\" varchar2(10) := 'hello';  -- HELLO is not a reserved word\n  \"BEGIN\" varchar2(10) := 'begin';  -- BEGIN is a reserved word\nBEGIN\n  DBMS_Output.Put_Line(Hello);      -- Identifier is case-insensitive\n  DBMS_Output.Put_Line(\"Begin\");    -- Identifier is case-sensitive\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/lexical-units-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/lexical-units.html\nBEGIN\n  DBMS_OUTPUT.PUT_LINE('This string breaks\nhere.');\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/lexical-units-17.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/lexical-units.html\nBEGIN\n  DBMS_OUTPUT.PUT_LINE('This string ' ||\n                       'contains no line-break character.');\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/lexical-units-20.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/lexical-units.html\nDECLARE\n  howmany     NUMBER;\n  num_tables  NUMBER;\nBEGIN\n  -- Begin processing\n  SELECT COUNT(*) INTO howmany\n  FROM USER_OBJECTS\n  WHERE OBJECT_TYPE = 'TABLE'; -- Check number of tables\n  num_tables := howmany;       -- Compute another value\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/lexical-units-23.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/lexical-units.html\nDECLARE\n  some_condition  BOOLEAN;\n  pi              NUMBER := 3.1415926;\n  radius          NUMBER := 15;\n  area            NUMBER;\nBEGIN\n  /* Perform some simple tests and assignments */\n\n  IF 2 + 2 = 4 THEN\n    some_condition := TRUE;\n  /* We expect this THEN to always be performed */\n  END IF;\n\n  /* This line computes the area of a circle using pi,\n  which is the ratio between the circumference and diameter.\n  After the area is computed, the result is displayed. */\n\n  area := pi * radius**2;\n  DBMS_OUTPUT.PUT_LINE('The area is: ' || TO_CHAR(area));\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/lexical-units-25.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/lexical-units.html\nDECLARE\n  x    NUMBER := 10;\n  y    NUMBER := 5;\n  max  NUMBER;\nBEGIN\n  IF x>y THEN max:=x;ELSE max:=y;END IF;  -- correct but hard to read\n\n  -- Easier to read:\n\n  IF x > y THEN\n    max:=x;\n  ELSE\n    max:=y;\n  END IF;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/lexical-units-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/lexical-units.html\nDECLARE\n  \"HELLO\" varchar2(10) := 'hello';\nBEGIN\n  DBMS_Output.Put_Line(Hello);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/lexical-units-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/lexical-units.html\nDECLARE\n  \"HELLO\" varchar2(10) := 'hello';\nBEGIN\n  DBMS_Output.Put_Line(\"Hello\");\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/lexical-units-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/lexical-units.html\nDECLARE\n  \"BEGIN\" varchar2(15) := 'UPPERCASE';\n  \"Begin\" varchar2(15) := 'Initial Capital';\n  \"begin\" varchar2(15) := 'lowercase';\nBEGIN\n  DBMS_Output.Put_Line(\"BEGIN\");\n  DBMS_Output.Put_Line(\"Begin\");\n  DBMS_Output.Put_Line(\"begin\");\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/loop-statements-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/loop-statements.html\nBEGIN\n  FOR i IN 1..3 LOOP\n    IF i < 3 THEN\n      DBMS_OUTPUT.PUT_LINE (TO_CHAR(i));\n    ELSE\n      i := 2;\n    END IF;\n  END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/loop-statements-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/loop-statements.html\nDECLARE\n   i PLS_INTEGER;\nBEGIN\n   FOR i IN 1..3, REVERSE i+1..i+10, 51..55 LOOP\n      DBMS_OUTPUT.PUT_LINE(i);\n   END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/loop-statements-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/loop-statements.html\nBEGIN\n  FOR i IN 1..3 LOOP\n     DBMS_OUTPUT.PUT_LINE (i);\n  END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/loop-statements-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/loop-statements.html\nBEGIN\n   FOR i IN REVERSE 1..3 LOOP\n      DBMS_OUTPUT.PUT_LINE (i);\n   END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/loop-statements-17.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/loop-statements.html\nBEGIN\n   FOR n NUMBER(5,1) IN 1.0 .. 3.0 BY 0.5 LOOP\n      DBMS_OUTPUT.PUT_LINE(n);\n   END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/loop-statements-19.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/loop-statements.html\nBEGIN\n  FOR i IN 5..15 BY 5 LOOP\n    DBMS_OUTPUT.PUT_LINE (i);\n  END LOOP;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/loop-statements-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/loop-statements.html\nBEGIN\n  FOR i IN 1..3 LOOP\n    DBMS_OUTPUT.PUT_LINE ('Inside loop, i is ' || TO_CHAR(i));\n  END LOOP;\n\n  DBMS_OUTPUT.PUT_LINE ('Outside loop, i is ' || TO_CHAR(i));\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/loop-statements-25.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/loop-statements.html\nBEGIN\n   FOR i IN 1 LOOP\n      DBMS_OUTPUT.PUT_LINE(i);\n   END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/loop-statements-27.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/loop-statements.html\nBEGIN\n   FOR i IN 1, REPEAT i*2 WHILE i < 100 LOOP\n      DBMS_OUTPUT.PUT_LINE(i);\n   END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/loop-statements-31.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/loop-statements.html\nOPEN c FOR SELECT id, data FROM T;\nCLOSE c;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/loop-statements-33.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/loop-statements.html\nDECLARE\n   cursor_str VARCHAR2(500) := 'SELECT last_name, employee_id FROM hr.employees ORDER BY last_name';\n   TYPE rec_t IS RECORD (last_name VARCHAR2(25),\n                         employee_id NUMBER);\nBEGIN\n   FOR r rec_t IN VALUES OF (EXECUTE IMMEDIATE cursor_str) WHEN r.employee_id < 103 LOOP\n      DBMS_OUTPUT.PUT_LINE(r.last_name || ', ' || r.employee_id);\n   END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/loop-statements-37.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/loop-statements.html\nBEGIN\n   FOR power IN 1, REPEAT power*2 WHILE power <= 64 LOOP\n      DBMS_OUTPUT.PUT_LINE(power);\n   END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/loop-statements-39.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/loop-statements.html\nBEGIN\n   FOR power IN 2, REPEAT power*2 WHILE power <= 64 WHEN MOD(power, 32)= 0 LOOP\n      DBMS_OUTPUT.PUT_LINE(power);\n   END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/loop-statements-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/loop-statements.html\nDECLARE\n  i NUMBER := 5;\nBEGIN\n  FOR i IN 1..3 LOOP\n    DBMS_OUTPUT.PUT_LINE ('Inside loop, i is ' || TO_CHAR(i));\n  END LOOP;\n\n  DBMS_OUTPUT.PUT_LINE ('Outside loop, i is ' || TO_CHAR(i));\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/loop-statements-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/loop-statements.html\n<<main>>  -- Label block.\nDECLARE\n  i NUMBER := 5;\nBEGIN\n  FOR i IN 1..3 LOOP\n    DBMS_OUTPUT.PUT_LINE (\n      'local: ' || TO_CHAR(i) || ', global: ' ||\n      TO_CHAR(main.i)  -- Qualify reference with block label.\n    );\n  END LOOP;\nEND main;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/loop-statements-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/loop-statements.html\nBEGIN\n  <<outer_loop>>\n  FOR i IN 1..3 LOOP\n    <<inner_loop>>\n    FOR i IN 1..3 LOOP\n      IF outer_loop.i = 2 THEN\n        DBMS_OUTPUT.PUT_LINE\n          ('outer: ' || TO_CHAR(outer_loop.i) || ' inner: '\n           || TO_CHAR(inner_loop.i));\n      END IF;\n    END LOOP inner_loop;\n  END LOOP outer_loop;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/main-features-pl-sql-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/main-features-pl-sql.html\nBEGIN\n  FOR someone IN (\n    SELECT * FROM employees\n    WHERE employee_id < 120\n    ORDER BY employee_id\n  )\n  LOOP\n    DBMS_OUTPUT.PUT_LINE('First name = ' || someone.first_name ||\n                         ', Last name = ' || someone.last_name);\n  END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/minimizing-cpu-overhead-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/minimizing-cpu-overhead.html\nDECLARE\n  starting_time  TIMESTAMP WITH TIME ZONE;\n  ending_time    TIMESTAMP WITH TIME ZONE;\nBEGIN\n  -- Invokes SQRT for every row of employees table:\n\n  SELECT SYSTIMESTAMP INTO starting_time FROM DUAL;\n\n  FOR item IN (\n    SELECT DISTINCT(SQRT(department_id)) col_alias\n    FROM employees\n    ORDER BY col_alias\n  )\n  LOOP\n    DBMS_OUTPUT.PUT_LINE('Square root of dept. ID = ' || item.col_alias);\n  END LOOP;\n\n  SELECT SYSTIMESTAMP INTO ending_time FROM DUAL;\n\n  DBMS_OUTPUT.PUT_LINE('Time = ' || TO_CHAR(ending_time - starting_time));\n\n  -- Invokes SQRT for every distinct department_id of employees table:\n\n  SELECT SYSTIMESTAMP INTO starting_time FROM DUAL;\n\n  FOR item IN (\n    SELECT SQRT(department_id) col_alias\n    FROM (SELECT DISTINCT department_id FROM employees)\n    ORDER BY col_alias\n  )\n  LOOP\n    IF item.col_alias IS NOT NULL THEN\n      DBMS_OUTPUT.PUT_LINE('Square root of dept. ID = ' || item.col_alias);\n    END IF;\n  END LOOP;\n\n  SELECT SYSTIMESTAMP INTO ending_time FROM DUAL;\n\n  DBMS_OUTPUT.PUT_LINE('Time = ' || TO_CHAR(ending_time - starting_time));\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/minimizing-cpu-overhead-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/minimizing-cpu-overhead.html\nDECLARE\n  TYPE EmpTabTyp IS TABLE OF employees%ROWTYPE;\n  emp_tab EmpTabTyp := EmpTabTyp(NULL);  -- initialize\n  t1 NUMBER;\n  t2 NUMBER;\n  t3 NUMBER;\n\n  PROCEDURE get_time (t OUT NUMBER) IS\n  BEGIN\n    t := DBMS_UTILITY.get_time;\n  END;\n\n  PROCEDURE do_nothing1 (tab IN OUT EmpTabTyp) IS\n  BEGIN\n    NULL;\n  END;\n\n  PROCEDURE do_nothing2 (tab IN OUT NOCOPY EmpTabTyp) IS\n  BEGIN\n    NULL;\n  END;\n\nBEGIN\n  SELECT * INTO emp_tab(1)\n  FROM employees\n  WHERE employee_id = 100;\n\n  emp_tab.EXTEND(49999, 1);  -- Copy element 1 into 2..50000\n  get_time(t1);\n  do_nothing1(emp_tab);  -- Pass IN OUT parameter\n  get_time(t2);\n  do_nothing2(emp_tab);  -- Pass IN OUT NOCOPY parameter\n  get_time(t3);\n  DBMS_OUTPUT.PUT_LINE ('Call Duration (secs)');\n  DBMS_OUTPUT.PUT_LINE ('--------------------');\n  DBMS_OUTPUT.PUT_LINE ('Just IN OUT: ' || TO_CHAR((t2 - t1)/100.0));\n  DBMS_OUTPUT.PUT_LINE ('With NOCOPY: ' || TO_CHAR((t3 - t2))/100.0);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/multidimensional-collections-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/multidimensional-collections.html\nDECLARE\n  TYPE t1 IS VARRAY(10) OF INTEGER;  -- varray of integer\n  va t1 := t1(2,3,5);\n\n  TYPE nt1 IS VARRAY(10) OF t1;      -- varray of varray of integer\n  nva nt1 := nt1(va, t1(55,6,73), t1(2,4), va);\n\n  i INTEGER;\n  va1 t1;\nBEGIN\n  i := nva(2)(3);\n  DBMS_OUTPUT.PUT_LINE('i = ' || i);\n\n  nva.EXTEND;\n  nva(5) := t1(56, 32);          -- replace inner varray elements\n  nva(4) := t1(45,43,67,43345);  -- replace an inner integer element\n  nva(4)(4) := 1;                -- replace 43345 with 1\n\n  nva(4).EXTEND;    -- add element to 4th varray element\n  nva(4)(5) := 89;  -- store integer 89 there\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/multidimensional-collections-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/multidimensional-collections.html\nDECLARE\n  TYPE tb1 IS TABLE OF VARCHAR2(20);  -- nested table of strings\n  vtb1 tb1 := tb1('one', 'three');\n\n  TYPE ntb1 IS TABLE OF tb1; -- nested table of nested tables of strings\n  vntb1 ntb1 := ntb1(vtb1);\n\n  TYPE tv1 IS VARRAY(10) OF INTEGER;  -- varray of integers\n  TYPE ntb2 IS TABLE OF tv1;          -- nested table of varrays of integers\n  vntb2 ntb2 := ntb2(tv1(3,5), tv1(5,7,3));\n\nBEGIN\n  vntb1.EXTEND;\n  vntb1(2) := vntb1(1);\n  vntb1.DELETE(1);     -- delete first element of vntb1\n  vntb1(2).DELETE(1);  -- delete first string from second table in nested table\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/multidimensional-collections-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/multidimensional-collections.html\nDECLARE\n  TYPE tb1 IS TABLE OF INTEGER INDEX BY PLS_INTEGER;  -- associative arrays\n  v4 tb1;\n  v5 tb1;\n\n  TYPE aa1 IS TABLE OF tb1 INDEX BY PLS_INTEGER;  -- associative array of\n  v2 aa1;                                         --  associative arrays\n\n  TYPE va1 IS VARRAY(10) OF VARCHAR2(20);  -- varray of strings\n  v1 va1 := va1('hello', 'world');\n\n  TYPE ntb2 IS TABLE OF va1 INDEX BY PLS_INTEGER;  -- associative array of varrays\n  v3 ntb2;\n\nBEGIN\n  v4(1)   := 34;     -- populate associative array\n  v4(2)   := 46456;\n  v4(456) := 343;\n\n  v2(23) := v4;  -- populate associative array of associative arrays\n\n  v3(34) := va1(33, 456, 656, 343);  -- populate associative array varrays\n\n  v2(35) := v5;      -- assign empty associative array to v2(35)\n  v2(35)(2) := 78;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/native-dynamic-sql-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/native-dynamic-sql.html\nCREATE OR REPLACE PROCEDURE create_dept (\n  deptid IN OUT NUMBER,\n  dname  IN     VARCHAR2,\n  mgrid  IN     NUMBER,\n  locid  IN     NUMBER\n) AUTHID DEFINER AS\nBEGIN\n  deptid := departments_seq.NEXTVAL;\n\n  INSERT INTO departments (\n    department_id,\n    department_name,\n    manager_id,\n    location_id\n  )\n  VALUES (deptid, dname, mgrid, locid);\nEND;\n/\nDECLARE\n  plsql_block VARCHAR2(500);\n  new_deptid  NUMBER(4);\n  new_dname   VARCHAR2(30) := 'Advertising';\n  new_mgrid   NUMBER(6)    := 200;\n  new_locid   NUMBER(4)    := 1700;\nBEGIN\n -- Dynamic PL/SQL block invokes subprogram:\n  plsql_block := 'BEGIN create_dept(:a, :b, :c, :d); END;';\n\n /* Specify bind variables in USING clause.\n    Specify mode for first parameter.\n    Modes of other parameters are correct by default. */\n\n  EXECUTE IMMEDIATE plsql_block\n    USING IN OUT new_deptid, new_dname, new_mgrid, new_locid;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/native-dynamic-sql-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/native-dynamic-sql.html\nCREATE OR REPLACE PROCEDURE p (x BOOLEAN) AUTHID DEFINER AS\nBEGIN\n  IF x THEN\n    DBMS_OUTPUT.PUT_LINE('x is true');\n  END IF;\nEND;\n/\nDECLARE\n  dyn_stmt VARCHAR2(200);\n  b        BOOLEAN := TRUE;\nBEGIN\n  dyn_stmt := 'BEGIN p(:x); END;';\n  EXECUTE IMMEDIATE dyn_stmt USING b;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/native-dynamic-sql-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/native-dynamic-sql.html\nCREATE TABLE employees_temp AS SELECT * FROM EMPLOYEES;\nDECLARE\n  a_null  CHAR(1);  -- Set to NULL automatically at run time\nBEGIN\n  EXECUTE IMMEDIATE 'UPDATE employees_temp SET commission_pct = :x'\n    USING a_null;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/native-dynamic-sql-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/native-dynamic-sql.html\nDECLARE\n  TYPE EmpCurTyp  IS REF CURSOR;\n  v_emp_cursor    EmpCurTyp;\n  emp_record      employees%ROWTYPE;\n  v_stmt_str      VARCHAR2(200);\n  v_e_job         employees.job_id%TYPE;\nBEGIN\n  -- Dynamic SQL statement with placeholder:\n  v_stmt_str := 'SELECT * FROM employees WHERE job_id = :j';\n\n  -- Open cursor & specify bind variable in USING clause:\n  OPEN v_emp_cursor FOR v_stmt_str USING 'MANAGER';\n\n  -- Fetch rows from result set one at a time:\n  LOOP\n    FETCH v_emp_cursor INTO emp_record;\n    EXIT WHEN v_emp_cursor%NOTFOUND;\n  END LOOP;\n\n  -- Close cursor:\n  CLOSE v_emp_cursor;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/native-dynamic-sql-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/native-dynamic-sql.html\nCREATE OR REPLACE PACKAGE pkg AUTHID DEFINER AS\n  TYPE rec IS RECORD(f1 NUMBER, f2 VARCHAR2(30));\n  TYPE mytab IS TABLE OF rec INDEX BY pls_integer;\nEND;\n/\nDECLARE\n  v1 pkg.mytab;  -- collection of records\n  v2 pkg.rec;\n  c1 SYS_REFCURSOR;\nBEGIN\n  OPEN c1 FOR 'SELECT * FROM TABLE(:1)' USING v1;\n  FETCH c1 INTO v2;\n  CLOSE c1;\n  DBMS_OUTPUT.PUT_LINE('Values in record are ' || v2.f1 || ' and ' || v2.f2);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/native-dynamic-sql-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/native-dynamic-sql.html\nEXECUTE IMMEDIATE sql_stmt USING a, b, c, d;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/native-dynamic-sql-16.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/native-dynamic-sql.html\nINSERT INTO payroll VALUES (a, b, c, d)"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/native-dynamic-sql-17.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/native-dynamic-sql.html\nEXECUTE IMMEDIATE sql_stmt USING a, a, b, a;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/native-dynamic-sql-18.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/native-dynamic-sql.html\nINSERT INTO payroll VALUES (a, a, b, a)"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/native-dynamic-sql-19.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/native-dynamic-sql.html\nCREATE PROCEDURE calc_stats (\n  w NUMBER,\n  x NUMBER,\n  y NUMBER,\n  z NUMBER )\nIS\nBEGIN\n  DBMS_OUTPUT.PUT_LINE(w + x + y + z);\nEND;\n/\nDECLARE\n  a NUMBER := 4;\n  b NUMBER := 7;\n  plsql_block VARCHAR2(100);\nBEGIN\n  plsql_block := 'BEGIN calc_stats(:x, :x, :y, :x); END;';\n  EXECUTE IMMEDIATE plsql_block USING a, b;  -- calc_stats(a, a, b, a)\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/native-dynamic-sql-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/native-dynamic-sql.html\nCREATE OR REPLACE PACKAGE pkg AUTHID DEFINER AS\n \n  TYPE rec IS RECORD (n1 NUMBER, n2 NUMBER);\n\n  PROCEDURE p (x OUT rec, y NUMBER, z NUMBER);\nEND pkg;\n/\nCREATE OR REPLACE PACKAGE BODY pkg AS\n \n  PROCEDURE p (x OUT rec, y NUMBER, z NUMBER) AS\n  BEGIN\n    x.n1 := y;\n    x.n2 := z;\n  END p;\nEND pkg;\n/\nDECLARE\n  r       pkg.rec;\n  dyn_str VARCHAR2(3000);\nBEGIN\n  dyn_str := 'BEGIN pkg.p(:x, 6, 8); END;';\n\n  EXECUTE IMMEDIATE dyn_str USING OUT r;\n\n  DBMS_OUTPUT.PUT_LINE('r.n1 = ' || r.n1);\n  DBMS_OUTPUT.PUT_LINE('r.n2 = ' || r.n2);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/native-dynamic-sql-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/native-dynamic-sql.html\nCREATE OR REPLACE PACKAGE pkg AUTHID DEFINER AS\n \n  TYPE number_names IS TABLE OF VARCHAR2(5)\n    INDEX BY PLS_INTEGER;\n\n  PROCEDURE print_number_names (x number_names);\nEND pkg;\n/\nCREATE OR REPLACE PACKAGE BODY pkg AS\n  PROCEDURE print_number_names (x number_names) IS\n  BEGIN\n    FOR i IN x.FIRST .. x.LAST LOOP\n      DBMS_OUTPUT.PUT_LINE(x(i));\n    END LOOP;\n  END;\nEND pkg;\n/\nDECLARE  \n  digit_names  pkg.number_names;\n  dyn_stmt     VARCHAR2(3000);\nBEGIN\n  digit_names(0) := 'zero';\n  digit_names(1) := 'one';\n  digit_names(2) := 'two';\n  digit_names(3) := 'three';\n  digit_names(4) := 'four';\n  digit_names(5) := 'five';\n  digit_names(6) := 'six';\n  digit_names(7) := 'seven';\n  digit_names(8) := 'eight';\n  digit_names(9) := 'nine';\n\n  dyn_stmt := 'BEGIN pkg.print_number_names(:x); END;';\n  EXECUTE IMMEDIATE dyn_stmt USING digit_names;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/native-dynamic-sql-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/native-dynamic-sql.html\nCREATE OR REPLACE PACKAGE pkg AUTHID DEFINER AS\n \n  TYPE names IS TABLE OF VARCHAR2(10);\n\n  PROCEDURE print_names (x names);\nEND pkg;\n/\nCREATE OR REPLACE PACKAGE BODY pkg AS\n  PROCEDURE print_names (x names) IS\n  BEGIN\n    FOR i IN x.FIRST .. x.LAST LOOP\n      DBMS_OUTPUT.PUT_LINE(x(i));\n    END LOOP;\n  END;\nEND pkg;\n/\nDECLARE\n  fruits   pkg.names;\n  dyn_stmt VARCHAR2(3000);\nBEGIN\n  fruits := pkg.names('apple', 'banana', 'cherry');\n\n  dyn_stmt := 'BEGIN pkg.print_names(:x); END;';\n  EXECUTE IMMEDIATE dyn_stmt USING fruits;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/native-dynamic-sql-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/native-dynamic-sql.html\nCREATE OR REPLACE PACKAGE pkg AUTHID DEFINER AS\n \n  TYPE foursome IS VARRAY(4) OF VARCHAR2(5);\n\n  PROCEDURE print_foursome (x foursome);\nEND pkg;\n/\nCREATE OR REPLACE PACKAGE BODY pkg AS\n  PROCEDURE print_foursome (x foursome) IS\n  BEGIN\n    IF x.COUNT = 0 THEN\n      DBMS_OUTPUT.PUT_LINE('Empty');\n    ELSE \n      FOR i IN x.FIRST .. x.LAST LOOP\n        DBMS_OUTPUT.PUT_LINE(x(i));\n      END LOOP;\n    END IF;\n  END;\nEND pkg;\n/\nDECLARE\n  directions pkg.foursome;\n  dyn_stmt VARCHAR2(3000);\nBEGIN\n  directions := pkg.foursome('north', 'south', 'east', 'west');\n\n  dyn_stmt := 'BEGIN pkg.print_foursome(:x); END;';\n  EXECUTE IMMEDIATE dyn_stmt USING directions;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/overloaded-subprograms-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/overloaded-subprograms.html\nDECLARE\n  TYPE date_tab_typ IS TABLE OF DATE   INDEX BY PLS_INTEGER;\n  TYPE num_tab_typ  IS TABLE OF NUMBER INDEX BY PLS_INTEGER;\n\n  hiredate_tab  date_tab_typ;\n  sal_tab       num_tab_typ;\n\n  PROCEDURE initialize (tab OUT date_tab_typ, n INTEGER) IS\n  BEGIN\n    DBMS_OUTPUT.PUT_LINE('Invoked first version');\n    FOR i IN 1..n LOOP\n      tab(i) := SYSDATE;\n    END LOOP;\n  END initialize;\n\n  PROCEDURE initialize (tab OUT num_tab_typ, n INTEGER) IS\n  BEGIN\n    DBMS_OUTPUT.PUT_LINE('Invoked second version');\n    FOR i IN 1..n LOOP\n      tab(i) := 0.0;\n    END LOOP;\n  END initialize;\n\nBEGIN\n  initialize(hiredate_tab, 50);\n  initialize(sal_tab, 100);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/overloaded-subprograms-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/overloaded-subprograms.html\nCREATE OR REPLACE PACKAGE pkg3 AUTHID DEFINER IS\n  PROCEDURE s (p1 VARCHAR2);\n  PROCEDURE s (p1 VARCHAR2, p2 VARCHAR2 := 'p2');\nEND pkg3;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/overloaded-subprograms-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/overloaded-subprograms.html\nCREATE OR REPLACE PROCEDURE p AUTHID DEFINER IS\n  a1 VARCHAR2(10) := 'a1';\n  a2 VARCHAR2(10) := 'a2';\nBEGIN\n  pkg3.s(p1=>a1, p2=>a2);  -- Compiles without error\n  pkg3.s(p1=>a1);          -- Causes compile-time error PLS-00307\nEND p;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/overloaded-subprograms-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/overloaded-subprograms.html\nCREATE OR REPLACE PACKAGE pack1 AUTHID DEFINER AS\n  PROCEDURE proc1 (a NUMBER, b VARCHAR2);\n  PROCEDURE proc1 (a NUMBER, b NUMBER);\nEND;\n/\nCREATE OR REPLACE PACKAGE BODY pack1 AS\n  PROCEDURE proc1 (a NUMBER, b VARCHAR2) IS BEGIN NULL; END;\n  PROCEDURE proc1 (a NUMBER, b NUMBER) IS BEGIN NULL; END;\nEND;\n/\nBEGIN\n  pack1.proc1(1,'2');    -- Compiles without error\n  pack1.proc1(1,2);      -- Compiles without error\n  pack1.proc1('1','2');  -- Causes compile-time error PLS-00307\n  pack1.proc1('1',2);    -- Causes compile-time error PLS-00307\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/overloaded-subprograms-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/overloaded-subprograms.html\nALTER SESSION SET PLSQL_IMPLICIT_CONVERSION_BOOL = FALSE;\nCREATE OR REPLACE PACKAGE pkg1 AUTHID DEFINER IS\n  PROCEDURE s (p INTEGER);\n  PROCEDURE s (p BOOLEAN);\nEND pkg1;\n/\nCREATE OR REPLACE PACKAGE BODY pkg1 IS\n  PROCEDURE s (p INTEGER) AS\n  BEGIN\n    dbms_output.put_line ( 'Integer' );\n  END;\n  PROCEDURE s (p BOOLEAN) AS\n  BEGIN\n    dbms_output.put_line ( 'Boolean' );\n  END;\nEND pkg1;\n/\nBEGIN\npkg1.s('1');  -- Compiles without error\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/overloaded-subprograms-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/overloaded-subprograms.html\nALTER SESSION SET PLSQL_IMPLICIT_CONVERSION_BOOL = TRUE;\nexec pkg1.s('1');  -- Causes compile-time error PLS-00307\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/overloaded-subprograms-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/overloaded-subprograms.html\nCREATE OR REPLACE PACKAGE pkg1 AUTHID DEFINER IS\n  PROCEDURE s (p VARCHAR2);\n  PROCEDURE s (p VARCHAR2);\nEND pkg1;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/overloaded-subprograms-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/overloaded-subprograms.html\nCREATE OR REPLACE PACKAGE pkg2 AUTHID DEFINER IS\n  SUBTYPE t1 IS VARCHAR2(10);\n  SUBTYPE t2 IS VARCHAR2(10);\n  PROCEDURE s (p t1);\n  PROCEDURE s (p t2);\nEND pkg2;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/overloaded-subprograms-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/overloaded-subprograms.html\nCREATE OR REPLACE PROCEDURE p AUTHID DEFINER IS\n  a pkg2.t1 := 'a';\nBEGIN\n  pkg2.s(a);  -- Causes compile-time error PLS-00307\nEND p;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/overloaded-subprograms-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/overloaded-subprograms.html\nCREATE OR REPLACE PACKAGE pkg2 AUTHID DEFINER IS\n  SUBTYPE t1 IS VARCHAR2(10);\n  SUBTYPE t2 IS VARCHAR2(10);\n  PROCEDURE s (p1 t1);\n  PROCEDURE s (p2 t2);\nEND pkg2;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/overloaded-subprograms-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/overloaded-subprograms.html\nCREATE OR REPLACE PROCEDURE p AUTHID DEFINER IS\n  a pkg2.t1 := 'a';\nBEGIN\n  pkg2.s(p1=>a);  -- Compiles without error\nEND p;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/overview-exception-handling-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/overview-exception-handling.html\nCREATE OR REPLACE PROCEDURE select_item (\n  t_column VARCHAR2,\n  t_name   VARCHAR2\n) AUTHID DEFINER\nIS\n  temp VARCHAR2(30);\nBEGIN\n  temp := t_column;  -- For error message if next SELECT fails\n\n  -- Fails if table t_name does not have column t_column:\n\n  SELECT COLUMN_NAME INTO temp\n  FROM USER_TAB_COLS \n  WHERE TABLE_NAME = UPPER(t_name)\n  AND COLUMN_NAME = UPPER(t_column);\n\n  temp := t_name;  -- For error message if next SELECT fails\n\n  -- Fails if there is no table named t_name:\n\n  SELECT OBJECT_NAME INTO temp\n  FROM USER_OBJECTS\n  WHERE OBJECT_NAME = UPPER(t_name)\n  AND OBJECT_TYPE = 'TABLE';\n\nEXCEPTION\n  WHEN NO_DATA_FOUND THEN\n    DBMS_OUTPUT.PUT_LINE ('No Data found for SELECT on ' || temp);\n  WHEN OTHERS THEN\n    DBMS_OUTPUT.PUT_LINE ('Unexpected error');\n    RAISE;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/overview-exception-handling-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/overview-exception-handling.html\nBEGIN\n  select_item('departments', 'last_name');\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/overview-exception-handling-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/overview-exception-handling.html\nBEGIN\n  select_item('emp', 'last_name');\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/overview-exception-handling-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/overview-exception-handling.html\nCREATE OR REPLACE PROCEDURE loc_var AUTHID DEFINER IS\n  stmt_no  POSITIVE;\n  name_    VARCHAR2(100);\nBEGIN\n  stmt_no := 1;\n\n  SELECT table_name INTO name_\n  FROM user_tables\n  WHERE table_name LIKE 'ABC%';\n\n  stmt_no := 2;\n\n  SELECT table_name INTO name_\n  FROM user_tables\n  WHERE table_name LIKE 'XYZ%';\nEXCEPTION\n  WHEN NO_DATA_FOUND THEN\n    DBMS_OUTPUT.PUT_LINE ('Table name not found in query ' || stmt_no);\nEND;\n/\nCALL loc_var();"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/overview-polymorphic-table-functions-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/overview-polymorphic-table-functions.html\nSELECT * \nFROM noop(emp);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/overview-polymorphic-table-functions-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/overview-polymorphic-table-functions.html\nWITH e AS \n (SELECT * FROM emp NATURAL JOIN dept)\nSELECT t.* FROM noop(e) t;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/overview-polymorphic-table-functions-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/overview-polymorphic-table-functions.html\nSELECT * FROM skip_col_pkg.skip_col(scott.dept, 'number', flip => 'True');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/overview-polymorphic-table-functions-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/overview-polymorphic-table-functions.html\nSELECT * FROM skip_col_by_type(scott.dept, 'number', flip => 'True');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/overview-polymorphic-table-functions-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/overview-polymorphic-table-functions.html\nSELECT *\nFROM skip_col_pkg.skip_col(scott.emp, COLUMNS(comm, hiredate, mgr))\nWHERE deptno = 20;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/overview-polymorphic-table-functions-16.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/overview-polymorphic-table-functions.html\nCREATE PACKAGE to_doc_p AS\n   FUNCTION describe(tab      IN OUT DBMS_TF.TABLE_T,\n                     cols     IN     DBMS_TF.COLUMNS_T DEFAULT NULL)\n\t\t       RETURN DBMS_TF.DESCRIBE_T;\n\n   PROCEDURE fetch_rows;\nEND to_doc_p;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/overview-polymorphic-table-functions-17.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/overview-polymorphic-table-functions.html\nCREATE PACKAGE BODY to_doc_p AS\n   \nFUNCTION describe(tab      IN OUT DBMS_TF.TABLE_T,\n                  cols     IN     DBMS_TF.COLUMNS_T DEFAULT NULL)\n\t\t    RETURN DBMS_TF.DESCRIBE_T AS\nBEGIN\n  FOR i IN 1 .. tab.column.count LOOP \n\t CONTINUE WHEN NOT DBMS_TF.SUPPORTED_TYPE(tab.column(i).DESCRIPTION.TYPE);\n\n\t  IF cols IS NULL THEN\n\t     tab.column(i).FOR_READ     := TRUE;\n\t     tab.column(i).PASS_THROUGH := FALSE;\n\t     CONTINUE;\n\t   END IF;\n\n\t  FOR j IN 1 .. cols.count LOOP\n\t    IF (tab.column(i).DESCRIPTION.NAME = cols(j)) THEN\n\t        tab.column(i).FOR_READ     := TRUE;\n\t        tab.column(i).PASS_THROUGH := FALSE;\n\t    END IF;\n\t  END LOOP;\n\n  END LOOP;\n\n  RETURN DBMS_TF.describe_t(new_columns => DBMS_TF.COLUMNS_NEW_T(1 =>\n\t                          DBMS_TF.COLUMN_METADATA_T(name =>'DOCUMENT')));   \nEND;\n\n PROCEDURE fetch_rows AS \n      rst DBMS_TF.ROW_SET_T;\n      col DBMS_TF.TAB_VARCHAR2_T;\n      rct PLS_INTEGER;\n BEGIN\n      DBMS_TF.GET_ROW_SET(rst, row_count => rct);\n      FOR rid IN 1 .. rct LOOP \n\t       col(rid) := DBMS_TF.ROW_TO_CHAR(rst, rid); \n      END LOOP;\n      DBMS_TF.PUT_COL(1, col);\n END; \n\nEND to_doc_p;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/overview-polymorphic-table-functions-18.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/overview-polymorphic-table-functions.html\nCREATE FUNCTION to_doc(\n                 tab  TABLE, \n       \t\t\t    cols  COLUMNS DEFAULT NULL) \n       \t\t\t    RETURN TABLE\n    PIPELINED ROW POLYMORPHIC USING to_doc_p;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/overview-polymorphic-table-functions-19.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/overview-polymorphic-table-functions.html\nSELECT * FROM to_doc(scott.dept);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/overview-polymorphic-table-functions-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/overview-polymorphic-table-functions.html\nCREATE PACKAGE skip_col_pkg AS\n\n  -- OVERLOAD 1: Skip by name --\n  FUNCTION skip_col(tab TABLE, \n                    col COLUMNS)\n           RETURN TABLE PIPELINED ROW POLYMORPHIC USING skip_col_pkg;\n\n  FUNCTION describe(tab IN OUT DBMS_TF.TABLE_T, \n                    col        DBMS_TF.COLUMNS_T)\n           RETURN DBMS_TF.DESCRIBE_T;\n\n  -- OVERLOAD 2: Skip by type --\n  FUNCTION skip_col(tab       TABLE, \n                    type_name VARCHAR2,\n                    flip      VARCHAR2 DEFAULT 'False') \n           RETURN TABLE PIPELINED ROW POLYMORPHIC USING skip_col_pkg;\n\n  FUNCTION describe(tab       IN OUT DBMS_TF.TABLE_T, \n                    type_name        VARCHAR2, \n                    flip             VARCHAR2 DEFAULT 'False') \n           RETURN DBMS_TF.DESCRIBE_T;\n\nEND skip_col_pkg;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/overview-polymorphic-table-functions-21.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/overview-polymorphic-table-functions.html\nSELECT deptno, ename, document \nFROM   to_doc(scott.emp, COLUMNS(empno,job,mgr,hiredate,sal,comm))\nWHERE  deptno IN (10, 30) \nORDER BY 1, 2;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/overview-polymorphic-table-functions-23.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/overview-polymorphic-table-functions.html\nWITH e AS (\n       SELECT ename name, sal, deptno, loc \n\t     FROM scott.emp NATURAL JOIN scott.dept \n        WHERE job = 'CLERK')\n\t  SELECT ROWNUM doc_id, t.*\n\t    FROM to_doc(e) t;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/overview-polymorphic-table-functions-25.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/overview-polymorphic-table-functions.html\nWITH t(c1,c2,c3)  AS (\n    SELECT NULL, NULL, NULL FROM dual \n    UNION ALL\n    SELECT    1, NULL, NULL FROM dual \n    UNION ALL\n    SELECT NULL,    2, NULL FROM dual \n    UNION ALL\n    SELECT    0, NULL,    3 FROM dual)\n  SELECT * \n    FROM to_doc(t);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/overview-polymorphic-table-functions-27.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/overview-polymorphic-table-functions.html\nSELECT JSON_VALUE(document, '$.ENAME') ename, \n       JSON_VALUE(document, '$.COMM')  comm \nFROM   to_doc(scott.emp)\nWHERE  JSON_VALUE(document, '$.DEPTNO') = 30;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/overview-polymorphic-table-functions-29.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/overview-polymorphic-table-functions.html\nCREATE PACKAGE implicit_echo_package AS\n  prefix   DBMS_ID := '\"ECHO_';\n\n  FUNCTION DESCRIBE(tab   IN OUT DBMS_TF.TABLE_T,\n                    cols  IN     DBMS_TF.COLUMNS_T)\n           RETURN DBMS_TF.DESCRIBE_T;\n\n  PROCEDURE FETCH_ROWS;\n\n  -- PTF FUNCTION: WITHOUT USING CLAUSE --\n  FUNCTION implicit_echo(tab TABLE, cols COLUMNS)\n           RETURN TABLE PIPELINED ROW POLYMORPHIC;\n\nEND implicit_echo_package;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/overview-polymorphic-table-functions-30.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/overview-polymorphic-table-functions.html\nCREATE PACKAGE BODY implicit_echo_package AS\n\nFUNCTION DESCRIBE(tab  IN  OUT DBMS_TF.TABLE_T,\n                  cols IN      DBMS_TF.COLUMNS_T)\n          RETURN DBMS_TF.DESCRIBE_T\nAS\n  new_cols DBMS_TF.COLUMNS_NEW_T;\n  col_id   PLS_INTEGER := 1;\n\nBEGIN\n FOR i in 1 .. tab.column.COUNT LOOP\n\n   FOR j in 1 .. cols.COUNT LOOP\n\n     IF (tab.column(i).description.name = cols(j)) THEN\n\n       IF (NOT DBMS_TF.SUPPORTED_TYPE(tab.column(i).description.type)) THEN\n            RAISE_APPLICATION_ERROR(-20102, 'Unsupported column type['||\n                                    tab.column(i).description.type||']');\n       END IF;\n\n       tab.column(i).for_read := TRUE;\n       new_cols(col_id)       := tab.column(i).description;\n       new_cols(col_id).name  := prefix||\n                                 REGEXP_REPLACE(tab.column(i).description.name,\n                                                                      '^\"|\"$');\n       col_id                 := col_id + 1;\n       EXIT;\n\n     END IF;\n\n    END LOOP;\n\n END LOOP;\n\n/* VERIFY ALL COLUMNS WERE FOUND */\n IF (col_id - 1 != cols.COUNT) then\n    RAISE_APPLICATION_ERROR(-20101,'Column mismatch['||col_id-1||'],\n                                                   ['||cols.COUNT||']');\n END IF;\n\n RETURN DBMS_TF.DESCRIBE_T(new_columns => new_cols);\n\nEND;\n\n PROCEDURE FETCH_ROWS AS\n\t rowset DBMS_TF.ROW_SET_T;\n BEGIN\n         DBMS_TF.GET_ROW_SET(rowset);\n         DBMS_TF.PUT_ROW_SET(rowset);\n END;\n\nEND implicit_echo_package;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/overview-polymorphic-table-functions-31.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/overview-polymorphic-table-functions.html\nSELECT ENAME, ECHO_ENAME\nFROM implicit_echo_package.implicit_echo(SCOTT.EMP, COLUMNS(SCOTT.ENAME));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/overview-polymorphic-table-functions-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/overview-polymorphic-table-functions.html\nCREATE FUNCTION skip_col_by_name(tab TABLE, \n                                 col COLUMNS)\n                  RETURN TABLE PIPELINED ROW POLYMORPHIC USING skip_col_pkg;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/overview-polymorphic-table-functions-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/overview-polymorphic-table-functions.html\nCREATE FUNCTION skip_col_by_type(tab TABLE, \n                                 type_name VARCHAR2,\n                                 flip VARCHAR2 DEFAULT 'False')\n                  RETURN TABLE PIPELINED ROW POLYMORPHIC USING skip_col_pkg;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/overview-polymorphic-table-functions-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/overview-polymorphic-table-functions.html\nSELECT * FROM skip_col_pkg.skip_col(scott.dept, 'number');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/overview-polymorphic-table-functions-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/overview-polymorphic-table-functions.html\nSELECT * FROM skip_col_by_type(scott.dept, 'number');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/package-body-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/package-body.html\nCREATE PACKAGE emp_bonus AS\n  PROCEDURE calc_bonus (date_hired employees.hire_date%TYPE);\nEND emp_bonus;\n/\nCREATE PACKAGE BODY emp_bonus AS\n  -- DATE does not match employees.hire_date%TYPE\n  PROCEDURE calc_bonus (date_hired DATE) IS\n  BEGIN\n    DBMS_OUTPUT.PUT_LINE\n      ('Employees hired on ' || date_hired || ' get bonus.');\n  END;\nEND emp_bonus;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/package-body-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/package-body.html\nSHOW ERRORS\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/package-body-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/package-body.html\nCREATE OR REPLACE PACKAGE BODY emp_bonus AS\n  PROCEDURE calc_bonus\n    (date_hired employees.hire_date%TYPE) IS\n  BEGIN\n    DBMS_OUTPUT.PUT_LINE\n      ('Employees hired on ' || date_hired || ' get bonus.');\n  END;\nEND emp_bonus;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/package-example-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/package-example.html\nDROP TABLE log;\nCREATE TABLE log (\n  date_of_action  DATE,\n  user_id         VARCHAR2(20),\n  package_name    VARCHAR2(30)\n);\nCREATE OR REPLACE PACKAGE emp_admin AUTHID DEFINER AS\n  -- Declare public type, cursor, and exception:\n  TYPE EmpRecTyp IS RECORD (emp_id NUMBER, sal NUMBER);\n  CURSOR desc_salary RETURN EmpRecTyp;\n  invalid_salary EXCEPTION;\n\n  -- Declare public subprograms:\n\n  FUNCTION hire_employee (\n    last_name       VARCHAR2,\n    first_name      VARCHAR2,\n    email           VARCHAR2,\n    phone_number    VARCHAR2,\n    job_id          VARCHAR2,\n    salary          NUMBER,\n    commission_pct  NUMBER,\n    manager_id      NUMBER,\n    department_id   NUMBER\n  ) RETURN NUMBER;\n\n  -- Overload preceding public subprogram:\n  PROCEDURE fire_employee (emp_id NUMBER);\n  PROCEDURE fire_employee (emp_email VARCHAR2);\n\n  PROCEDURE raise_salary (emp_id NUMBER, amount NUMBER);\n  FUNCTION nth_highest_salary (n NUMBER) RETURN EmpRecTyp;\nEND emp_admin;\n/\nCREATE OR REPLACE PACKAGE BODY emp_admin AS\n  number_hired  NUMBER;  -- private variable, visible only in this package\n\n  -- Define cursor declared in package specification:\n\n  CURSOR desc_salary RETURN EmpRecTyp IS\n    SELECT employee_id, salary\n    FROM employees\n    ORDER BY salary DESC;\n\n  -- Define subprograms declared in package specification:\n\n  FUNCTION hire_employee (\n    last_name       VARCHAR2,\n    first_name      VARCHAR2,\n    email           VARCHAR2,\n    phone_number    VARCHAR2,\n    job_id          VARCHAR2,\n    salary          NUMBER,\n    commission_pct  NUMBER,\n    manager_id      NUMBER,\n    department_id   NUMBER\n  ) RETURN NUMBER\n  IS\n    new_emp_id NUMBER;\n  BEGIN\n    new_emp_id := employees_seq.NEXTVAL;\n    INSERT INTO employees (\n      employee_id,\n      last_name,\n      first_name,\n      email,\n      phone_number,\n      hire_date,\n      job_id,\n      salary,\n      commission_pct,\n      manager_id,\n      department_id\n    )\n    VALUES (\n      new_emp_id,\n      hire_employee.last_name,\n      hire_employee.first_name,\n      hire_employee.email,\n      hire_employee.phone_number,\n      SYSDATE,\n      hire_employee.job_id,\n      hire_employee.salary,\n      hire_employee.commission_pct,\n      hire_employee.manager_id,\n      hire_employee.department_id\n    );\n    number_hired := number_hired + 1;\n    DBMS_OUTPUT.PUT_LINE('The number of employees hired is ' \n                         || TO_CHAR(number_hired) );   \n    RETURN new_emp_id;\n  END hire_employee;\n\n  PROCEDURE fire_employee (emp_id NUMBER) IS\n  BEGIN\n    DELETE FROM employees WHERE employee_id = emp_id;\n  END fire_employee;\n\n  PROCEDURE fire_employee (emp_email VARCHAR2) IS\n  BEGIN\n    DELETE FROM employees WHERE email = emp_email;\n  END fire_employee;\n\n  -- Define private function, available only inside package:\n\n  FUNCTION sal_ok (\n    jobid VARCHAR2,\n    sal NUMBER\n  ) RETURN BOOLEAN\n  IS\n    min_sal NUMBER;\n    max_sal NUMBER;\n  BEGIN\n    SELECT MIN(salary), MAX(salary)\n    INTO min_sal, max_sal\n    FROM employees\n    WHERE job_id = jobid;\n\n    RETURN (sal >= min_sal) AND (sal <= max_sal);\n  END sal_ok;\n\n  PROCEDURE raise_salary (\n    emp_id NUMBER,\n    amount NUMBER\n  )\n  IS\n    sal NUMBER(8,2);\n    jobid VARCHAR2(10);\n  BEGIN\n    SELECT job_id, salary INTO jobid, sal\n    FROM employees\n    WHERE employee_id = emp_id;\n\n    IF sal_ok(jobid, sal + amount) THEN  -- Invoke private function\n      UPDATE employees\n      SET salary = salary + amount\n      WHERE employee_id = emp_id;\n    ELSE\n      RAISE invalid_salary;\n    END IF;\n  EXCEPTION\n    WHEN invalid_salary THEN\n      DBMS_OUTPUT.PUT_LINE ('The salary is out of the specified range.');\n  END raise_salary;\n\n  FUNCTION nth_highest_salary (\n    n NUMBER\n  ) RETURN EmpRecTyp\n  IS\n    emp_rec  EmpRecTyp;\n  BEGIN\n    OPEN desc_salary;\n    FOR i IN 1..n LOOP\n      FETCH desc_salary INTO emp_rec;\n    END LOOP;\n    CLOSE desc_salary;\n    RETURN emp_rec;\n  END nth_highest_salary;\n\nBEGIN  -- initialization part of package body\n   INSERT INTO log (date_of_action, user_id, package_name)\n   VALUES (SYSDATE, USER, 'EMP_ADMIN');\n   number_hired := 0;\nEND emp_admin;\n/\nDECLARE\n  new_emp_id NUMBER(6);\nBEGIN\n  new_emp_id := emp_admin.hire_employee (\n    'Belden',\n    'Enrique',\n    'EBELDEN',\n    '555.111.2222',\n    'ST_CLERK',\n    2500,\n    .1,\n    101,\n    110\n  );\n  DBMS_OUTPUT.PUT_LINE ('The employee id is ' || TO_CHAR(new_emp_id));\n  emp_admin.raise_salary (new_emp_id, 100);\n\n  DBMS_OUTPUT.PUT_LINE (\n    'The 10th highest salary is '||\n    TO_CHAR (emp_admin.nth_highest_salary(10).sal) ||\n             ', belonging to employee: ' ||\n             TO_CHAR (emp_admin.nth_highest_salary(10).emp_id)\n  );\n\n  emp_admin.fire_employee(new_emp_id);\n  -- You can also delete the newly added employee as follows:\n  -- emp_admin.fire_employee('EBELDEN');\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/package-specification-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/package-specification.html\nCREATE OR REPLACE PACKAGE trans_data AUTHID DEFINER AS\n  TYPE TimeRec IS RECORD (\n    minutes SMALLINT,\n    hours   SMALLINT);\n  TYPE TransRec IS RECORD (\n    category VARCHAR2(10),\n    account  INT,\n    amount   REAL,\n    time_of  TimeRec);\n  minimum_balance     CONSTANT REAL := 10.00;\n  number_processed    INT;\n  insufficient_funds  EXCEPTION;\n  PRAGMA EXCEPTION_INIT(insufficient_funds, -4097);\nEND trans_data;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/package-specification-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/package-specification.html\nCREATE OR REPLACE PACKAGE aa_pkg AUTHID DEFINER IS\n  TYPE aa_type IS TABLE OF INTEGER INDEX BY VARCHAR2(15);\nEND;\n/\nCREATE OR REPLACE PROCEDURE print_aa (\n  aa aa_pkg.aa_type\n) AUTHID DEFINER IS\n  i  VARCHAR2(15);\nBEGIN\n  i := aa.FIRST;\n\n  WHILE i IS NOT NULL LOOP\n    DBMS_OUTPUT.PUT_LINE (aa(i) || '  ' || i);\n    i := aa.NEXT(i);\n  END LOOP;\nEND;\n/\nDECLARE\n  aa_var  aa_pkg.aa_type;\nBEGIN\n  aa_var('zero') := 0;\n  aa_var('one') := 1;\n  aa_var('two') := 2;\n  print_aa(aa_var);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/package-writing-guidelines-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/package-writing-guidelines.html\nCREATE PACKAGE emp_stuff AS\n  CURSOR c1 RETURN employees%ROWTYPE;  -- Declare cursor\nEND emp_stuff;\n/\nCREATE PACKAGE BODY emp_stuff AS\n  CURSOR c1 RETURN employees%ROWTYPE IS\n    SELECT * FROM employees WHERE salary > 2500;  -- Define cursor\nEND emp_stuff;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/package-writing-guidelines-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/package-writing-guidelines.html\nCREATE OR REPLACE PACKAGE helper\n  AUTHID DEFINER\n  ACCESSIBLE BY (api)\nIS\n  PROCEDURE h1;\n  PROCEDURE h2;\nEND;\n/\nCREATE OR REPLACE PACKAGE BODY helper\nIS\n  PROCEDURE h1 IS\n  BEGIN\n    DBMS_OUTPUT.PUT_LINE('Helper procedure h1');\n  END;\n\n  PROCEDURE h2 IS\n  BEGIN\n    DBMS_OUTPUT.PUT_LINE('Helper procedure h2');\n  END;\nEND;\n/\nCREATE OR REPLACE PACKAGE api\n  AUTHID DEFINER\nIS\n  PROCEDURE p1;\n  PROCEDURE p2;\nEND;\n/\nCREATE OR REPLACE PACKAGE BODY api\nIS\n  PROCEDURE p1 IS\n  BEGIN\n    DBMS_OUTPUT.PUT_LINE('API procedure p1');\n    helper.h1;\n  END;\n\n  PROCEDURE p2 IS\n  BEGIN\n    DBMS_OUTPUT.PUT_LINE('API procedure p2');\n    helper.h2;\n  END;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/package-writing-guidelines-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/package-writing-guidelines.html\nBEGIN\n  api.p1;\n  api.p2;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/package-writing-guidelines-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/package-writing-guidelines.html\nBEGIN\n  helper.h1;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/pl-sql-function-result-cache-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/pl-sql-function-result-cache.html\nSELECT rc1.NAME, rc2.STATUS, rc3.STATUS, rc2.BLOCK_COUNT\nFROM V$RESULT_CACHE_OBJECTS rc1, V$RESULT_CACHE_OBJECTS rc2\nWHERE rc1.TYPE = 'Result'\nAND rc2.TYPE = 'Temp'\nAND rc1.CACHE_KEY = rc2.CACHE_KEY;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/pl-sql-function-result-cache-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/pl-sql-function-result-cache.html\nSELECT SCAN_COUNT, COUNT(CACHE_KEY)\nFROM V$RESULT_CACHE_OBJECTS\nWHERE NAMESPACE = 'PLSQL'\nGROUP BY SCAN_COUNT;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/pl-sql-function-result-cache-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/pl-sql-function-result-cache.html\nCREATE OR REPLACE FUNCTION get_hire_date (emp_id NUMBER)\n  RETURN VARCHAR\n  RESULT_CACHE\n  AUTHID DEFINER\nIS\n  date_hired DATE;\nBEGIN\n  SELECT hire_date INTO date_hired\n    FROM HR.EMPLOYEES\n      WHERE EMPLOYEE_ID = emp_id;\n  RETURN TO_CHAR(date_hired);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/pl-sql-function-result-cache-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/pl-sql-function-result-cache.html\nSELECT value FROM config_tab WHERE name = param_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/pl-sql-function-result-cache-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/pl-sql-function-result-cache.html\nSELECT value FROM config_tab\nWHERE name = param_name\nAND app_id = SYS_CONTEXT('Config', 'App_ID');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/pl-sql-function-result-cache-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/pl-sql-function-result-cache.html\nCREATE OR REPLACE FUNCTION get_param_value (\n  param_name VARCHAR,\n  appctx     VARCHAR  DEFAULT SYS_CONTEXT('Config', 'App_ID')\n) RETURN VARCHAR\n  RESULT_CACHE\n  AUTHID DEFINER\nIS\n  rec VARCHAR(2000);\nBEGIN\n  SELECT val INTO rec\n  FROM config_tab\n  WHERE name = param_name;\n\n  RETURN rec;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/pl-sql-function-result-cache-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/pl-sql-function-result-cache.html\nCREATE OR REPLACE FUNCTION get_product_name_1 (\n  prod_id NUMBER,\n  lang_id VARCHAR2\n)\n  RETURN NVARCHAR2\n  RESULT_CACHE\n  AUTHID DEFINER\nIS\n  result_ VARCHAR2(50);\nBEGIN\n  SELECT translated_name INTO result_\n  FROM OE.Product_Descriptions\n  WHERE PRODUCT_ID = prod_id\n  AND LANGUAGE_ID = lang_id;\n  RETURN result_;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/pl-sql-function-result-cache-16.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/pl-sql-function-result-cache.html\nCREATE OR REPLACE FUNCTION get_product_name_2 (\n  prod_id NUMBER,\n  lang_id VARCHAR2\n)\n  RETURN NVARCHAR2\n  AUTHID DEFINER\nIS\n  TYPE product_names IS TABLE OF NVARCHAR2(50) INDEX BY PLS_INTEGER;\n\n  FUNCTION all_product_names (lang_id VARCHAR2)\n    RETURN product_names\n    RESULT_CACHE\n  IS\n    all_names product_names;\n  BEGIN\n    FOR c IN (SELECT * FROM OE.Product_Descriptions\n              WHERE LANGUAGE_ID = lang_id) LOOP\n      all_names(c.PRODUCT_ID) := c.TRANSLATED_NAME;\n    END LOOP;\n    RETURN all_names;\n  END;\nBEGIN\n  RETURN all_product_names(lang_id)(prod_id);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/pl-sql-function-result-cache-17.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/pl-sql-function-result-cache.html\nSELECT cache_id, COUNT(cache_key) AS uniq_args\nFROM GV$RESULT_CACHE_OBJECTS\nWHERE type = 'Result'\nGROUP BY cache_id\nORDER BY uniq_args DESC;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/pl-sql-function-result-cache-18.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/pl-sql-function-result-cache.html\nSELECT object_no, SUM(invalidations) AS num_invals\nFROM GV$RESULT_CACHE_OBJECTS\nWHERE type = 'Dependency'\nGROUP BY object_no\nORDER BY num_invals DESC;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/pl-sql-function-result-cache-19.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/pl-sql-function-result-cache.html\nBEGIN\n  DBMS_RESULT_CACHE.Bypass(TRUE);\n  DBMS_RESULT_CACHE.Flush;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/pl-sql-function-result-cache-20.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/pl-sql-function-result-cache.html\nBEGIN\n  DBMS_RESULT_CACHE.Bypass(FALSE);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/pl-sql-function-result-cache-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/pl-sql-function-result-cache.html\nCREATE OR REPLACE PACKAGE department_pkg AUTHID DEFINER IS\n \n  TYPE dept_info_record IS RECORD (\n    dept_name  departments.department_name%TYPE,\n    mgr_name   employees.last_name%TYPE,\n    dept_size  PLS_INTEGER\n  );\n\n  -- Function declaration\n\n  FUNCTION get_dept_info (dept_id NUMBER)\n    RETURN dept_info_record\n    RESULT_CACHE;\n\nEND department_pkg;\n/\nCREATE OR REPLACE PACKAGE BODY department_pkg IS\n  -- Function definition\n  FUNCTION get_dept_info (dept_id NUMBER)\n    RETURN dept_info_record\n    RESULT_CACHE\n  IS\n    rec  dept_info_record;\n  BEGIN\n    SELECT department_name INTO rec.dept_name\n    FROM departments\n    WHERE department_id = dept_id;\n\n    SELECT e.last_name INTO rec.mgr_name\n    FROM departments d, employees e\n    WHERE d.department_id = dept_id\n    AND d.manager_id = e.employee_id;\n\n    SELECT COUNT(*) INTO rec.dept_size\n    FROM EMPLOYEES\n    WHERE department_id = dept_id;\n\n    RETURN rec;\n  END get_dept_info;\nEND department_pkg;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/pl-sql-function-result-cache-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/pl-sql-function-result-cache.html\nDROP TABLE global_config_params;\nCREATE TABLE global_config_params\n  (name  VARCHAR2(20), -- parameter NAME\n   val   VARCHAR2(20), -- parameter VALUE\n   PRIMARY KEY (name)\n  );\nCREATE TABLE app_level_config_params\n  (app_id  VARCHAR2(20), -- application ID\n   name    VARCHAR2(20), -- parameter NAME\n   val     VARCHAR2(20), -- parameter VALUE\n   PRIMARY KEY (app_id, name)\n  );\nCREATE TABLE role_level_config_params\n  (role_id  VARCHAR2(20), -- application (role) ID\n   name     VARCHAR2(20),  -- parameter NAME\n   val      VARCHAR2(20),  -- parameter VALUE\n   PRIMARY KEY (role_id, name)\n  );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/pl-sql-function-result-cache-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/pl-sql-function-result-cache.html\nCREATE OR REPLACE FUNCTION get_value\n  (p_param VARCHAR2,\n   p_app_id  NUMBER,\n   p_role_id NUMBER\n  )\n  RETURN VARCHAR2\n  RESULT_CACHE\n  AUTHID DEFINER\nIS\n  answer VARCHAR2(20);\nBEGIN\n  -- Is parameter set at role level?\n  BEGIN\n    SELECT val INTO answer\n      FROM role_level_config_params\n        WHERE role_id = p_role_id\n          AND name = p_param;\n    RETURN answer;  -- Found\n    EXCEPTION\n      WHEN no_data_found THEN\n        NULL;  -- Fall through to following code\n  END;\n  -- Is parameter set at application level?\n  BEGIN\n    SELECT val INTO answer\n      FROM app_level_config_params\n        WHERE app_id = p_app_id\n          AND name = p_param;\n    RETURN answer;  -- Found\n    EXCEPTION\n      WHEN no_data_found THEN\n        NULL;  -- Fall through to following code\n  END;\n  -- Is parameter set at global level?\n    SELECT val INTO answer\n     FROM global_config_params\n      WHERE name = p_param;\n    RETURN answer;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/pl-sql-function-result-cache-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/pl-sql-function-result-cache.html\nCREATE OR REPLACE FUNCTION fibonacci (n NUMBER)\n  RETURN NUMBER\n  RESULT_CACHE\n  AUTHID DEFINER\nIS\nBEGIN\n  IF (n =0) OR (n =1) THEN\n    RETURN 1;\n  ELSE\n    RETURN fibonacci(n - 1) + fibonacci(n - 2);\n  END IF;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/pl-sql-function-result-cache-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/pl-sql-function-result-cache.html\nCREATE OR REPLACE FUNCTION get_hire_date (emp_id NUMBER, fmt VARCHAR)\n  RETURN VARCHAR\n  RESULT_CACHE\n  AUTHID DEFINER\nIS\n  date_hired DATE;\nBEGIN\n  SELECT hire_date INTO date_hired\n    FROM HR.EMPLOYEES\n      WHERE EMPLOYEE_ID = emp_id;\n  RETURN TO_CHAR(date_hired, fmt);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/pls_integer-and-binary_integer-data-types-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/pls_integer-and-binary_integer-data-types.html\nDECLARE\n  p1 PLS_INTEGER := 2147483647;\n  p2 PLS_INTEGER := 1;\n  n NUMBER;\nBEGIN\n  n := p1 + p2;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/pls_integer-and-binary_integer-data-types-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/pls_integer-and-binary_integer-data-types.html\nDECLARE\n  p1 PLS_INTEGER := 2147483647;\n  p2 INTEGER := 1;\n  n NUMBER;\nBEGIN\n  n := p1 + p2;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/pls_integer-and-binary_integer-data-types-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/pls_integer-and-binary_integer-data-types.html\nDECLARE\n  a SIMPLE_INTEGER := 1;\n  b PLS_INTEGER := NULL;\nBEGIN\n  a := b;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/pls_integer-and-binary_integer-data-types-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/pls_integer-and-binary_integer-data-types.html\nDECLARE\n  n SIMPLE_INTEGER := 2147483645;\nBEGIN\n  FOR j IN 1..4 LOOP\n    n := n + 1;\n    DBMS_OUTPUT.PUT_LINE(TO_CHAR(n, 'S9999999999'));\n  END LOOP;\n  FOR j IN 1..4 LOOP\n   n := n - 1;\n   DBMS_OUTPUT.PUT_LINE(TO_CHAR(n, 'S9999999999'));\n  END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/plsql-program-limits-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/plsql-program-limits.html\nCREATE OR REPLACE PACKAGE pkg1 AS\n  TYPE numset_t IS TABLE OF NUMBER;\n  FUNCTION f1(x NUMBER) RETURN numset_t PIPELINED;\nEND pkg1;\n/\nCREATE OR REPLACE PACKAGE BODY pkg1 AS\n  -- FUNCTION f1 returns a collection of elements (1,2,3,... x)\n  FUNCTION f1(x NUMBER) RETURN numset_t PIPELINED IS\n  BEGIN\n    FOR i IN 1..x LOOP\n      PIPE ROW(i);\n    END LOOP;\n    RETURN;\n  END f1;\nEND pkg1;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/plsql-program-limits-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/plsql-program-limits.html\nCOLUMN name FORMAT A4\n\nCOLUMN type FORMAT A12\n\nCOLUMN source_size FORMAT 999\n\nCOLUMN parsed_size FORMAT 999\n\nCOLUMN code_size FORMAT 999\n\nCOLUMN error_size FORMAT 999\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/plsql-program-limits-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/plsql-program-limits.html\nSELECT * FROM user_object_size WHERE name = 'PKG1' ORDER BY type;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/predefined-exceptions-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/predefined-exceptions.html\nDECLARE\n  stock_price   NUMBER := 9.73;\n  net_earnings  NUMBER := 0;\n  pe_ratio      NUMBER;\nBEGIN\n  pe_ratio := stock_price / net_earnings;  -- raises ZERO_DIVIDE exception\n  DBMS_OUTPUT.PUT_LINE('Price/earnings ratio = ' || pe_ratio);\nEXCEPTION\n  WHEN ZERO_DIVIDE THEN\n    DBMS_OUTPUT.PUT_LINE('Company had zero earnings.');\n    pe_ratio := NULL;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/predefined-exceptions-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/predefined-exceptions.html\nDECLARE\n  stock_price   NUMBER := 9.73;\n  net_earnings  NUMBER := 0;\n  pe_ratio      NUMBER;\nBEGIN\n  pe_ratio :=\n    CASE net_earnings\n      WHEN 0 THEN NULL\n      ELSE stock_price / net_earnings\n    END;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/predefined-exceptions-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/predefined-exceptions.html\nCREATE OR REPLACE PACKAGE emp_dept_data AUTHID DEFINER AS\n  TYPE cv_type IS REF CURSOR;\n\n  PROCEDURE open_cv (\n    cv       IN OUT cv_type,\n    discrim  IN     POSITIVE\n  );\n  END emp_dept_data;\n/\nCREATE OR REPLACE PACKAGE BODY emp_dept_data AS\n  PROCEDURE open_cv (\n    cv      IN OUT cv_type,\n    discrim IN     POSITIVE) IS\n  BEGIN\n    IF discrim = 1 THEN\n    OPEN cv FOR\n      SELECT * FROM EMPLOYEES ORDER BY employee_id;\n    ELSIF discrim = 2 THEN\n      OPEN cv FOR\n        SELECT * FROM DEPARTMENTS ORDER BY department_id;\n    END IF;\n  END open_cv;\nEND emp_dept_data;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/predefined-exceptions-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/predefined-exceptions.html\nDECLARE\n  emp_rec   EMPLOYEES%ROWTYPE;\n  dept_rec  DEPARTMENTS%ROWTYPE;\n  cv        Emp_dept_data.CV_TYPE;\nBEGIN\n  emp_dept_data.open_cv(cv, 1);  -- Open cv for EMPLOYEES fetch.\n  FETCH cv INTO dept_rec;        -- Fetch from DEPARTMENTS.\n  DBMS_OUTPUT.PUT(dept_rec.DEPARTMENT_ID);\n  DBMS_OUTPUT.PUT_LINE('  ' || dept_rec.LOCATION_ID);\nEXCEPTION\n  WHEN ROWTYPE_MISMATCH THEN\n     BEGIN\n       DBMS_OUTPUT.PUT_LINE\n         ('Row type mismatch, fetching EMPLOYEES data ...');\n       FETCH cv INTO emp_rec;\n       DBMS_OUTPUT.PUT(emp_rec.DEPARTMENT_ID);\n       DBMS_OUTPUT.PUT_LINE('  ' || emp_rec.LAST_NAME);\n     END;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/processing-query-result-sets-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/processing-query-result-sets.html\nBEGIN\n  FOR item IN (\n    SELECT last_name, job_id\n    FROM employees\n    WHERE job_id LIKE '%CLERK%'\n    AND manager_id > 120\n    ORDER BY last_name\n  )\n  LOOP\n    DBMS_OUTPUT.PUT_LINE\n      ('Name = ' || item.last_name || ', Job = ' || item.job_id);\n  END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/processing-query-result-sets-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/processing-query-result-sets.html\nDECLARE\n  CURSOR c1 IS\n    SELECT department_id, last_name, salary\n    FROM employees t\n    WHERE salary > ( SELECT AVG(salary)\n                     FROM employees\n                     WHERE t.department_id = department_id\n                   )\n    ORDER BY department_id, last_name;\nBEGIN\n  FOR person IN c1\n  LOOP\n    DBMS_OUTPUT.PUT_LINE('Making above-average salary = ' || person.last_name);\n  END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/processing-query-result-sets-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/processing-query-result-sets.html\nDECLARE\n  CURSOR c1 IS\n    SELECT last_name, job_id FROM employees\n    WHERE job_id LIKE '%CLERK%' AND manager_id > 120\n    ORDER BY last_name;\nBEGIN\n  FOR item IN c1\n  LOOP\n    DBMS_OUTPUT.PUT_LINE\n      ('Name = ' || item.last_name || ', Job = ' || item.job_id);\n  END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/processing-query-result-sets-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/processing-query-result-sets.html\nDECLARE\n  CURSOR c1 (job VARCHAR2, max_wage NUMBER) IS\n    SELECT * FROM employees\n    WHERE job_id = job\n    AND salary > max_wage;\nBEGIN\n  FOR person IN c1('ST_CLERK', 3000)\n  LOOP\n     -- process data record\n    DBMS_OUTPUT.PUT_LINE (\n      'Name = ' || person.last_name || ', salary = ' ||\n      person.salary || ', Job Id = ' || person.job_id\n    );\n  END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/processing-query-result-sets-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/processing-query-result-sets.html\nBEGIN\n  FOR item IN (\n    SELECT first_name || ' ' || last_name AS full_name,\n           salary * 10                    AS dream_salary \n    FROM employees\n    WHERE ROWNUM <= 5\n    ORDER BY dream_salary DESC, last_name ASC\n  ) LOOP\n    DBMS_OUTPUT.PUT_LINE\n      (item.full_name || ' dreams of making ' || item.dream_salary);\n  END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/processing-query-result-sets-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/processing-query-result-sets.html\nDECLARE\n  CURSOR c1 IS\n    SELECT t1.department_id, department_name, staff\n    FROM departments t1,\n         ( SELECT department_id, COUNT(*) AS staff\n           FROM employees\n           GROUP BY department_id\n         ) t2\n    WHERE (t1.department_id = t2.department_id) AND staff >= 5\n    ORDER BY staff;\n\nBEGIN\n   FOR dept IN c1\n   LOOP\n     DBMS_OUTPUT.PUT_LINE ('Department = '\n       || dept.department_name || ', staff = ' || dept.staff);\n   END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/qualified-names-and-dot-notation-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/qualified-names-and-dot-notation.html\nCREATE OR REPLACE PACKAGE pkg1 AUTHID DEFINER AS\n  m NUMBER;\n  TYPE t1 IS RECORD (a NUMBER);\n  v1 t1;\n  TYPE t2 IS TABLE OF t1 INDEX BY PLS_INTEGER;\n  v2 t2; \n  FUNCTION f1 (p1 NUMBER) RETURN t1;\n  FUNCTION f2 (q1 NUMBER) RETURN t2;\nEND pkg1;\n/\nCREATE OR REPLACE PACKAGE BODY pkg1 AS\n  FUNCTION f1 (p1 NUMBER) RETURN t1 IS\n    n NUMBER;\n  BEGIN\n     n := m;             -- Unqualified variable name\n     n := pkg1.m;        -- Variable name qualified by package name\n     n := pkg1.f1.p1;    -- Parameter name qualified by function name,\n                         --  which is qualified by package name\n     n := v1.a;          -- Variable name followed by component name\n     n := pkg1.v1.a;     -- Variable name qualified by package name\n                         --  and followed by component name\n     n := v2(10).a;      -- Indexed name followed by component name\n     n := f1(10).a;      -- Function invocation followed by component name\n     n := f2(10)(10).a;  -- Function invocation followed by indexed name\n                         --  and followed by component name\n     n := hr.pkg1.f2(10)(10).a;  -- Schema name, package name,\n                                 -- function invocation, index, component name\n     v1.a := p1;\n     RETURN v1;\n   END f1;\n\n   FUNCTION f2 (q1 NUMBER) RETURN t2 IS\n     v_t1 t1;\n     v_t2 t2;\n   BEGIN\n     v_t1.a := q1;\n     v_t2(1) := v_t1;\n     RETURN v_t2;\n   END f2;\nEND pkg1;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/raising-exceptions-explicitly-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/raising-exceptions-explicitly.html\nCREATE PROCEDURE account_status (\n  due_date DATE,\n  today    DATE\n) AUTHID DEFINER\nIS\n  past_due  EXCEPTION;  -- declare exception\nBEGIN\n  IF due_date < today THEN\n    RAISE past_due;  -- explicitly raise exception\n  END IF;\nEXCEPTION\n  WHEN past_due THEN  -- handle exception\n    DBMS_OUTPUT.PUT_LINE ('Account past due.');\nEND;\n/\nBEGIN\n  account_status (TO_DATE('01-JUL-2010', 'DD-MON-YYYY'),\n                  TO_DATE('09-JUL-2010', 'DD-MON-YYYY'));\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/raising-exceptions-explicitly-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/raising-exceptions-explicitly.html\nDROP TABLE t;\nCREATE TABLE t (c NUMBER);\nCREATE PROCEDURE p (n NUMBER) AUTHID DEFINER IS\n  default_number NUMBER := 0;\nBEGIN\n  IF n < 0 THEN\n    RAISE INVALID_NUMBER;  -- raise explicitly\n  ELSE\n    INSERT INTO t VALUES(TO_NUMBER('100.00', '9G999'));  -- raise implicitly\n  END IF;\nEXCEPTION\n  WHEN INVALID_NUMBER THEN\n    DBMS_OUTPUT.PUT_LINE('Substituting default value for invalid number.');\n    INSERT INTO t VALUES(default_number);\nEND;\n/\nBEGIN\n  p(-1);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/raising-exceptions-explicitly-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/raising-exceptions-explicitly.html\nBEGIN\n  p(1);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/raising-exceptions-explicitly-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/raising-exceptions-explicitly.html\nDECLARE\n  salary_too_high   EXCEPTION;\n  current_salary    NUMBER := 20000;\n  max_salary        NUMBER := 10000;\n  erroneous_salary  NUMBER;\nBEGIN\n\n  BEGIN\n    IF current_salary > max_salary THEN\n      RAISE salary_too_high;   -- raise exception\n    END IF;\n  EXCEPTION\n    WHEN salary_too_high THEN  -- start handling exception\n      erroneous_salary := current_salary;\n      DBMS_OUTPUT.PUT_LINE('Salary ' || erroneous_salary ||' is out of range.');\n      DBMS_OUTPUT.PUT_LINE ('Maximum salary is ' || max_salary || '.');\n      RAISE;  -- reraise current exception (exception name is optional)\n  END;\n\nEXCEPTION\n  WHEN salary_too_high THEN    -- finish handling exception\n    current_salary := max_salary;\n\n    DBMS_OUTPUT.PUT_LINE (\n      'Revising salary from ' || erroneous_salary ||\n      ' to ' || current_salary || '.'\n    );\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/raising-exceptions-explicitly-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/raising-exceptions-explicitly.html\nCREATE OR REPLACE PROCEDURE account_status (\n  due_date DATE,\n  today    DATE\n) AUTHID DEFINER\nIS\nBEGIN\n  IF due_date < today THEN                   -- explicitly raise exception\n    RAISE_APPLICATION_ERROR(-20000, 'Account past due.');\n  END IF;\nEND;\n/\nDECLARE\n  past_due  EXCEPTION;                       -- declare exception\n  PRAGMA EXCEPTION_INIT (past_due, -20000);  -- assign error code to exception\nBEGIN\n  account_status (TO_DATE('01-JUL-2010', 'DD-MON-YYYY'),\n                  TO_DATE('09-JUL-2010', 'DD-MON-YYYY'));   -- invoke procedure\n\nEXCEPTION\n  WHEN past_due THEN                         -- handle exception\n    DBMS_OUTPUT.PUT_LINE(TO_CHAR(SQLERRM(-20000)));\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/record-variables-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/record-variables.html\nDECLARE\n  TYPE My_Rec IS RECORD (a NUMBER, b NUMBER);\n  r CONSTANT My_Rec := My_Rec(0,1);\nBEGIN\n  DBMS_OUTPUT.PUT_LINE('r.a = ' || r.a);\n  DBMS_OUTPUT.PUT_LINE('r.b = ' || r.b);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/record-variables-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/record-variables.html\nCREATE OR REPLACE PACKAGE My_Types AUTHID CURRENT_USER IS\n  TYPE My_Rec IS RECORD (a NUMBER, b NUMBER);\n  FUNCTION Init_My_Rec RETURN My_Rec;\nEND My_Types;\n/\nCREATE OR REPLACE PACKAGE BODY My_Types IS\n  FUNCTION Init_My_Rec RETURN My_Rec IS\n    Rec My_Rec;\n  BEGIN\n    Rec.a := 0;\n    Rec.b := 1;\n    RETURN Rec;\n  END Init_My_Rec;\nEND My_Types;\n/\nDECLARE\n  r CONSTANT My_Types.My_Rec := My_Types.Init_My_Rec();\nBEGIN\n  DBMS_OUTPUT.PUT_LINE('r.a = ' || r.a);\n  DBMS_OUTPUT.PUT_LINE('r.b = ' || r.b);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/record-variables-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/record-variables.html\nCREATE OR REPLACE PACKAGE pkg AS\n  TYPE rec_type IS RECORD (       -- package RECORD type\n    f1 INTEGER,\n    f2 VARCHAR2(4)\n  );\n  PROCEDURE print_rec_type (rec rec_type);\nEND pkg;\n/\nCREATE OR REPLACE PACKAGE BODY pkg AS\n  PROCEDURE print_rec_type (rec rec_type) IS\n  BEGIN\n    DBMS_OUTPUT.PUT_LINE(rec.f1);\n    DBMS_OUTPUT.PUT_LINE(rec.f2);\n  END; \nEND pkg;\n/\nDECLARE\n  TYPE rec_type IS RECORD (       -- local RECORD type\n    f1 INTEGER,\n    f2 VARCHAR2(4)\n  );\n  r1 pkg.rec_type;                -- package type\n  r2     rec_type;                -- local type\n\nBEGIN\n  r1.f1 := 10; r1.f2 := 'abcd';\n  r2.f1 := 25; r2.f2 := 'wxyz';\n\n  pkg.print_rec_type(r1);  -- succeeds\n  pkg.print_rec_type(r2);  -- fails\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/record-variables-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/record-variables.html\nDECLARE\n  dept_rec departments%ROWTYPE;\nBEGIN\n  -- Assign values to fields:\n\n  dept_rec.department_id   := 10;\n  dept_rec.department_name := 'Administration';\n  dept_rec.manager_id      := 200;\n  dept_rec.location_id     := 1700;\n\n  -- Print fields:\n\n  DBMS_OUTPUT.PUT_LINE('dept_id:   ' || dept_rec.department_id);\n  DBMS_OUTPUT.PUT_LINE('dept_name: ' || dept_rec.department_name);\n  DBMS_OUTPUT.PUT_LINE('mgr_id:    ' || dept_rec.manager_id);\n  DBMS_OUTPUT.PUT_LINE('loc_id:    ' || dept_rec.location_id);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/record-variables-16.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/record-variables.html\nCREATE OR REPLACE PROCEDURE print (n INTEGER) IS \nBEGIN \n  IF n IS NOT NULL THEN \n    DBMS_OUTPUT.PUT_LINE(n); \n  ELSE \n    DBMS_OUTPUT.PUT_LINE('NULL'); \n  END IF; \nEND print; \n/\nDROP TABLE t1;\nCREATE TABLE t1 (\n  c1 INTEGER DEFAULT 0 NOT NULL,\n  c2 INTEGER DEFAULT 1 NOT NULL\n);\nDECLARE\n  t1_row t1%ROWTYPE;\nBEGIN\n  DBMS_OUTPUT.PUT('t1.c1 = ');\n  DBMS_OUTPUT.PUT_LINE(NVL(TO_CHAR(t1_row.c1), 'NULL'));\n\n  DBMS_OUTPUT.PUT('t1.c2 = '); print(t1_row.c2);\n  DBMS_OUTPUT.PUT_LINE(NVL(TO_CHAR(t1_row.c2), 'NULL'));\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/record-variables-19.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/record-variables.html\nDECLARE\n  CURSOR c IS\n    SELECT first_name, last_name, phone_number\n    FROM employees;\n\n  friend c%ROWTYPE;\nBEGIN\n  friend.first_name   := 'John';\n  friend.last_name    := 'Smith';\n  friend.phone_number := '1-650-555-1234';\n\n  DBMS_OUTPUT.PUT_LINE (\n    friend.first_name  || ' ' ||\n    friend.last_name   || ', ' ||\n    friend.phone_number\n  );\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/record-variables-21.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/record-variables.html\nDECLARE\n  CURSOR c2 IS\n    SELECT employee_id, email, employees.manager_id, location_id\n    FROM employees, departments\n    WHERE employees.department_id = departments.department_id;\n\n  join_rec c2%ROWTYPE;  -- includes columns from two tables\n\nBEGIN\n  NULL;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/record-variables-22.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/record-variables.html\nDROP TABLE plch_departure;\nCREATE TABLE plch_departure (\n  destination    VARCHAR2(100),\n  departure_time DATE,\n  delay          NUMBER(10),\n  expected       GENERATED ALWAYS AS (departure_time + delay/24/60/60)\n);\nDECLARE\n dep_rec plch_departure%ROWTYPE;\nBEGIN\n  dep_rec.destination := 'X'; \n  dep_rec.departure_time := SYSDATE;\n  dep_rec.delay := 1500;\n\n  INSERT INTO plch_departure VALUES dep_rec;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/record-variables-24.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/record-variables.html\nDECLARE\n  dep_rec plch_departure%rowtype;\nBEGIN\n  dep_rec.destination := 'X';\n  dep_rec.departure_time := SYSDATE;\n  dep_rec.delay := 1500;\n\n  INSERT INTO plch_departure (destination, departure_time, delay)\n  VALUES (dep_rec.destination, dep_rec.departure_time, dep_rec.delay);\nend;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/record-variables-26.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/record-variables.html\nCREATE TABLE t (a INT, b INT, c INT INVISIBLE);\nINSERT INTO t (a, b, c) VALUES (1, 2, 3);\nCOMMIT;\nDECLARE\n  t_rec t%ROWTYPE;  -- t_rec has fields a and b, but not c\nBEGIN\n  SELECT * INTO t_rec FROM t WHERE ROWNUM < 2;  -- t_rec(a)=1, t_rec(b)=2\n  DBMS_OUTPUT.PUT_LINE('c = ' || t_rec.c);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/record-variables-28.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/record-variables.html\nALTER TABLE t MODIFY (c VISIBLE);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/record-variables-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/record-variables.html\nDECLARE\n  TYPE t_size IS RECORD (x NUMBER, y NUMBER);\n  c_small  CONSTANT t_size := t_size(32,36);\n  c_large  CONSTANT t_size := t_size(x => 192, y => 292);\nBEGIN\n  DBMS_OUTPUT.PUT_LINE('Small size is ' || c_small.x  || ' by ' || c_small.y);\n  DBMS_OUTPUT.PUT_LINE('Large size is ' || c_large.x  || ' by ' || c_large.y);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/record-variables-30.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/record-variables.html\nDECLARE\n  t_rec t%ROWTYPE;  -- t_rec has fields a, b, and c\nBEGIN\n  SELECT * INTO t_rec FROM t WHERE ROWNUM < 2;  -- t_rec(a)=1, t_rec(b)=2,\n                                                  -- t_rec(c)=3\n  DBMS_OUTPUT.PUT_LINE('c = ' || t_rec.c);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/record-variables-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/record-variables.html\nDECLARE\n  TYPE DeptRecTyp IS RECORD (\n    dept_id    NUMBER(4) NOT NULL := 10,\n    dept_name  VARCHAR2(30) NOT NULL := 'Administration',\n    mgr_id     NUMBER(6) := 200,\n    loc_id     NUMBER(4) := 1700\n  );\n\n  dept_rec DeptRecTyp;\nBEGIN\n  DBMS_OUTPUT.PUT_LINE('dept_id:   ' || dept_rec.dept_id);\n  DBMS_OUTPUT.PUT_LINE('dept_name: ' || dept_rec.dept_name);\n  DBMS_OUTPUT.PUT_LINE('mgr_id:    ' || dept_rec.mgr_id);\n  DBMS_OUTPUT.PUT_LINE('loc_id:    ' || dept_rec.loc_id);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/record-variables-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/record-variables.html\nDECLARE\n  TYPE name_rec IS RECORD (\n    first  employees.first_name%TYPE,\n    last   employees.last_name%TYPE\n  );\n\n  TYPE contact IS RECORD (\n    name  name_rec,                    -- nested record\n    phone employees.phone_number%TYPE\n  );\n\n  friend contact;\nBEGIN\n  friend.name.first := 'John';\n  friend.name.last := 'Smith';\n  friend.phone := '1-650-555-1234';\n\n  DBMS_OUTPUT.PUT_LINE (\n    friend.name.first  || ' ' ||\n    friend.name.last   || ', ' ||\n    friend.phone\n  );\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/record-variables-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/record-variables.html\nDECLARE\n  TYPE full_name IS VARRAY(2) OF VARCHAR2(20);\n\n  TYPE contact IS RECORD (\n    name  full_name := full_name('John', 'Smith'),  -- varray field\n    phone employees.phone_number%TYPE\n  );\n\n  friend contact;\nBEGIN\n  friend.phone := '1-650-555-1234';\n\n  DBMS_OUTPUT.PUT_LINE (\n    friend.name(1) || ' ' ||\n    friend.name(2) || ', ' ||\n    friend.phone\n  );\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/recursive-subprograms-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/recursive-subprograms.html\nCREATE OR REPLACE FUNCTION factorial (\n  n POSITIVE\n) RETURN POSITIVE\n  AUTHID DEFINER\nIS\nBEGIN\n  IF n = 1 THEN                 -- terminating condition\n    RETURN n;\n  ELSE\n    RETURN n * factorial(n-1);  -- recursive invocation\n  END IF;\nEND;\n/\nBEGIN\n  FOR i IN 1..5 LOOP\n    DBMS_OUTPUT.PUT_LINE(i || '! = ' || factorial(i));\n  END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/recursive-subprograms-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/recursive-subprograms.html\nCREATE OR REPLACE FUNCTION fibonacci (\n  n PLS_INTEGER\n) RETURN PLS_INTEGER\n  AUTHID DEFINER\nIS\n  fib_1 PLS_INTEGER := 0;\n  fib_2 PLS_INTEGER := 1;\nBEGIN\n  IF n = 1 THEN                              -- terminating condition\n    RETURN fib_1;\n  ELSIF n = 2 THEN\n    RETURN fib_2;                           -- terminating condition\n  ELSE\n    RETURN fibonacci(n-2) + fibonacci(n-1);  -- recursive invocations\n  END IF;\nEND;\n/\nBEGIN\n  FOR i IN 1..10 LOOP\n    DBMS_OUTPUT.PUT(fibonacci(i));\n    IF i < 10 THEN\n      DBMS_OUTPUT.PUT(', ');\n    END IF;\n  END LOOP;\n\n  DBMS_OUTPUT.PUT_LINE(' ...');\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/redeclared-predefined-exceptions-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/redeclared-predefined-exceptions.html\nDROP TABLE t;\nCREATE TABLE t (c NUMBER);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/redeclared-predefined-exceptions-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/redeclared-predefined-exceptions.html\nDECLARE\n  default_number NUMBER := 0;\nBEGIN\n  INSERT INTO t VALUES(TO_NUMBER('100.00', '9G999'));\nEXCEPTION\n  WHEN INVALID_NUMBER THEN\n    DBMS_OUTPUT.PUT_LINE('Substituting default value for invalid number.');\n    INSERT INTO t VALUES(default_number);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/redeclared-predefined-exceptions-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/redeclared-predefined-exceptions.html\nDECLARE\n  default_number NUMBER := 0;\n  i NUMBER := 5;\n  invalid_number EXCEPTION;    -- redeclare predefined exception\nBEGIN\n  INSERT INTO t VALUES(TO_NUMBER('100.00', '9G999'));\nEXCEPTION\n  WHEN INVALID_NUMBER THEN\n    DBMS_OUTPUT.PUT_LINE('Substituting default value for invalid number.');\n    INSERT INTO t VALUES(default_number); \nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/redeclared-predefined-exceptions-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/redeclared-predefined-exceptions.html\nDECLARE\n  default_number NUMBER := 0;\n  i NUMBER := 5;\n  invalid_number EXCEPTION;    -- redeclare predefined exception\nBEGIN\n  INSERT INTO t VALUES(TO_NUMBER('100.00', '9G999'));\nEXCEPTION\n  WHEN STANDARD.INVALID_NUMBER THEN\n    DBMS_OUTPUT.PUT_LINE('Substituting default value for invalid number.');\n    INSERT INTO t VALUES(default_number); \nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/references-identifiers-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/references-identifiers.html\nDECLARE\n  a INTEGER;  -- Declaration\nBEGIN\n  a := 1;     -- Reference with simple name\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/release-changes-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/release-changes.html\nCREATE OR REPLACE FUNCTION useBool(p1 BOOLEAN) RETURN NUMBER AS\nBEGIN\n    IF p1 THEN RETURN 100;\n    ELSE\n        RETURN 200;\n    END IF;\nEND;\n/\nSET SERVEROUTPUT ON;\nDECLARE\n    v1 NUMBER;\n    v2 BOOLEAN := TRUE;\nBEGIN\n    SELECT useBool(v2) INTO v1 FROM dual; --boolean argument function called from SELECT\n    DBMS_OUTPUT.PUT_LINE(v1);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/release-changes-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/release-changes.html\nCREATE PROCEDURE IF NOT EXISTS hello AS\nBEGIN\n  DBMS_OUTPUT.PUT_LINE('Hello there');\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/release-changes-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/release-changes.html\nCREATE PROCEDURE IF NOT EXISTS hello AS\nBEGIN\n  DBMS_OUTPUT.PUT_LINE('Second hello');\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/release-changes-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/release-changes.html\nSELECT TEXT FROM USER_SOURCE WHERE NAME='HELLO';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/retrieving-error-code-and-error-message-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/retrieving-error-code-and-error-message.html\nDROP TABLE errors;\nCREATE TABLE errors (\n  code      NUMBER,\n  message   VARCHAR2(64)\n);\nCREATE OR REPLACE PROCEDURE p AUTHID DEFINER AS\n  name    EMPLOYEES.LAST_NAME%TYPE;\n  v_code  NUMBER;\n  v_errm  VARCHAR2(64);\nBEGIN\n  SELECT last_name INTO name\n  FROM EMPLOYEES\n  WHERE EMPLOYEE_ID = -1;\nEXCEPTION\n  WHEN OTHERS THEN\n    v_code := SQLCODE;\n    v_errm := SUBSTR(SQLERRM, 1, 64);\n    DBMS_OUTPUT.PUT_LINE\n      ('Error code ' || v_code || ': ' || v_errm);\n\n    /* Invoke another procedure,\n       declared with PRAGMA AUTONOMOUS_TRANSACTION,\n       to insert information about errors. */\n\n    INSERT INTO errors (code, message)\n    VALUES (v_code, v_errm);\n\n    RAISE;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/retrying-transactions-handling-exceptions-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/retrying-transactions-handling-exceptions.html\nDROP TABLE results;\nCREATE TABLE results (\n  res_name   VARCHAR(20),\n  res_answer VARCHAR2(3)\n);\nCREATE UNIQUE INDEX res_name_ix ON results (res_name);\nINSERT INTO results (res_name, res_answer) VALUES ('SMYTHE', 'YES');\nINSERT INTO results (res_name, res_answer) VALUES ('JONES', 'NO');\nDECLARE\n  name    VARCHAR2(20) := 'SMYTHE';\n  answer  VARCHAR2(3) := 'NO';\n  suffix  NUMBER := 1;\nBEGIN\n  FOR i IN 1..5 LOOP  -- Try transaction at most 5 times.\n\n    DBMS_OUTPUT.PUT('Try #' || i);\n\n    BEGIN  -- sub-block begins\n\n       SAVEPOINT start_transaction;\n\n       -- transaction begins\n\n       DELETE FROM results WHERE res_answer = 'NO';\n\n       INSERT INTO results (res_name, res_answer) VALUES (name, answer);\n\n       -- Nonunique name raises DUP_VAL_ON_INDEX.\n\n       -- If transaction succeeded:\n\n       COMMIT;\n       DBMS_OUTPUT.PUT_LINE(' succeeded.');\n       EXIT;\n\n    EXCEPTION\n      WHEN DUP_VAL_ON_INDEX THEN\n        DBMS_OUTPUT.PUT_LINE(' failed; trying again.');\n        ROLLBACK TO start_transaction;    -- Undo changes.\n        suffix := suffix + 1;             -- Try to fix problem.\n        name := name || TO_CHAR(suffix);\n    END;  -- sub-block ends\n\n  END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/scope-and-visibility-identifiers-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/scope-and-visibility-identifiers.html\nDECLARE\n  a CHAR;  -- Scope of a (CHAR) begins\n  b REAL;    -- Scope of b begins\nBEGIN\n  -- Visible: a (CHAR), b\n\n  -- First sub-block:\n  DECLARE\n    a INTEGER;  -- Scope of a (INTEGER) begins\n    c REAL;       -- Scope of c begins\n  BEGIN\n    -- Visible: a (INTEGER), b, c\n    NULL;\n  END;          -- Scopes of a (INTEGER) and c end\n\n  -- Second sub-block:\n  DECLARE\n    d REAL;     -- Scope of d begins\n  BEGIN\n    -- Visible: a (CHAR), b, d\n    NULL;\n  END;          -- Scope of d ends\n\n-- Visible: a (CHAR), b\nEND;            -- Scopes of a (CHAR) and b end\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/scope-and-visibility-identifiers-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/scope-and-visibility-identifiers.html\n<<outer>>  -- label\nDECLARE\n  birthdate DATE := TO_DATE('09-AUG-70', 'DD-MON-YY');\nBEGIN\n  DECLARE\n    birthdate DATE := TO_DATE('29-SEP-70', 'DD-MON-YY');\n  BEGIN\n    IF birthdate = outer.birthdate THEN\n      DBMS_OUTPUT.PUT_LINE ('Same Birthday');\n    ELSE\n      DBMS_OUTPUT.PUT_LINE ('Different Birthday');\n    END IF;\n  END;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/scope-and-visibility-identifiers-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/scope-and-visibility-identifiers.html\n<<compute_ratio>>\n<<another_label>>\nDECLARE\n  numerator   NUMBER := 22;\n  denominator NUMBER := 7;\nBEGIN\n  <<another_label>>\n  DECLARE\n    denominator NUMBER := 0;\n  BEGIN\n    DBMS_OUTPUT.PUT_LINE('Ratio with compute_ratio.denominator = ');\n    DBMS_OUTPUT.PUT_LINE(numerator/compute_ratio.denominator);\n\n    DBMS_OUTPUT.PUT_LINE('Ratio with another_label.denominator = ');\n    DBMS_OUTPUT.PUT_LINE(numerator/another_label.denominator);\n\n  EXCEPTION\n    WHEN ZERO_DIVIDE THEN\n      DBMS_OUTPUT.PUT_LINE('Divide-by-zero error: can''t divide '\n        || numerator || ' by ' || denominator);\n    WHEN OTHERS THEN\n      DBMS_OUTPUT.PUT_LINE('Unexpected error.');\n  END another_label;\nEND compute_ratio;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/scope-and-visibility-identifiers-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/scope-and-visibility-identifiers.html\nCREATE OR REPLACE PROCEDURE check_credit (credit_limit NUMBER) AS\n  rating NUMBER := 3;\n\n  FUNCTION check_rating RETURN BOOLEAN IS\n    rating  NUMBER := 1;\n    over_limit  BOOLEAN;\n  BEGIN\n    IF check_credit.rating <= credit_limit THEN  -- reference global variable\n      over_limit := FALSE;\n    ELSE\n      over_limit := TRUE;\n      rating := credit_limit;                    -- reference local variable\n    END IF;\n    RETURN over_limit;\n  END check_rating;\nBEGIN\n  IF check_rating THEN\n    DBMS_OUTPUT.PUT_LINE\n      ('Credit rating over limit (' || TO_CHAR(credit_limit) || ').  '\n      || 'Rating: ' || TO_CHAR(rating));\n  ELSE\n    DBMS_OUTPUT.PUT_LINE\n      ('Credit rating OK.  ' || 'Rating: ' || TO_CHAR(rating));\n  END IF;\nEND;\n/\nBEGIN\n  check_credit(1);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/scope-and-visibility-identifiers-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/scope-and-visibility-identifiers.html\nDECLARE\n  id  BOOLEAN;\n  id  VARCHAR2(5);  -- duplicate identifier\nBEGIN\n  id := FALSE;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/scope-and-visibility-identifiers-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/scope-and-visibility-identifiers.html\nDECLARE\n  PROCEDURE p\n  IS\n    x VARCHAR2(1);\n  BEGIN\n    x := 'a';  -- Assign the value 'a' to x\n    DBMS_OUTPUT.PUT_LINE('In procedure p, x = ' || x);\n  END;\n\n  PROCEDURE q\n  IS\n    x VARCHAR2(1);\n  BEGIN\n    x := 'b';  -- Assign the value 'b' to x\n    DBMS_OUTPUT.PUT_LINE('In procedure q, x = ' || x);\n  END;\n\nBEGIN\n  p;\n  q;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/scope-and-visibility-identifiers-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/scope-and-visibility-identifiers.html\n<<echo>>\nDECLARE\n  x  NUMBER := 5;\n\n  PROCEDURE echo AS\n    x  NUMBER := 0;\n  BEGIN\n    DBMS_OUTPUT.PUT_LINE('x = ' || x);\n    DBMS_OUTPUT.PUT_LINE('echo.x = ' || echo.x);\n  END;\n\nBEGIN\n  echo;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sequential-control-statements-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sequential-control-statements.html\nDECLARE\n  v_job_id  VARCHAR2(10);\n   v_emp_id  NUMBER(6) := 110;\nBEGIN\n  SELECT job_id INTO v_job_id\n  FROM employees\n  WHERE employee_id = v_emp_id;\n\n  IF v_job_id = 'SA_REP' THEN\n    UPDATE employees\n    SET commission_pct = commission_pct * 1.2;\n  ELSE\n    NULL;  -- Employee is not a sales rep\n  END IF;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sequential-control-statements-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sequential-control-statements.html\nCREATE OR REPLACE PROCEDURE award_bonus (\n  emp_id NUMBER,\n  bonus NUMBER\n) AUTHID DEFINER AS\nBEGIN    -- Executable part starts here\n  NULL;  -- Placeholder\n  -- (raises \"unreachable code\" if warnings enabled)\nEND award_bonus;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sequential-control-statements-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sequential-control-statements.html\nCREATE OR REPLACE PROCEDURE print_grade (\n  grade CHAR\n) AUTHID DEFINER AS\nBEGIN\n  CASE grade\n    WHEN 'A' THEN DBMS_OUTPUT.PUT_LINE('Excellent');\n    WHEN 'B' THEN DBMS_OUTPUT.PUT_LINE('Very Good');\n    WHEN 'C' THEN DBMS_OUTPUT.PUT_LINE('Good');\n    WHEN 'D' THEN DBMS_OUTPUT.PUT_LINE('Fair');\n    WHEN 'F' THEN DBMS_OUTPUT.PUT_LINE('Poor');\n    ELSE NULL;\n  END CASE;\nEND;\n/\nBEGIN\n  print_grade('A');\n  print_grade('S');\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/serially_reusable-packages-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/serially_reusable-packages.html\nCREATE OR REPLACE PACKAGE bodiless_pkg AUTHID DEFINER IS\n  PRAGMA SERIALLY_REUSABLE;\n  n NUMBER := 5;\nEND;\n/\nCREATE OR REPLACE PACKAGE pkg AUTHID DEFINER IS\n  PRAGMA SERIALLY_REUSABLE;\n  n NUMBER := 5;\nEND;\n/\nCREATE OR REPLACE PACKAGE BODY pkg IS\n  PRAGMA SERIALLY_REUSABLE;\nBEGIN\n  n := 5;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/serially_reusable-packages-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/serially_reusable-packages.html\nCREATE OR REPLACE PACKAGE pkg IS\n  n NUMBER := 5;\nEND pkg;\n/\nCREATE OR REPLACE PACKAGE sr_pkg IS\n  PRAGMA SERIALLY_REUSABLE;\n  n NUMBER := 5;\nEND sr_pkg;\n/\nBEGIN\n  pkg.n := 10;\n  sr_pkg.n := 10;\nEND;\n/\nBEGIN\n  DBMS_OUTPUT.PUT_LINE('pkg.n: ' || pkg.n);\n  DBMS_OUTPUT.PUT_LINE('sr_pkg.n: ' || sr_pkg.n);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/serially_reusable-packages-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/serially_reusable-packages.html\nDROP TABLE people;\nCREATE TABLE people (name VARCHAR2(20));\nINSERT INTO people (name) VALUES ('John Smith');\nINSERT INTO people (name) VALUES ('Mary Jones');\nINSERT INTO people (name) VALUES ('Joe Brown');\nINSERT INTO people (name) VALUES ('Jane White');\nCREATE OR REPLACE PACKAGE sr_pkg IS\n  PRAGMA SERIALLY_REUSABLE;\n  CURSOR c IS SELECT name FROM people;\nEND sr_pkg;\n/\nCREATE OR REPLACE PROCEDURE fetch_from_cursor IS\n  v_name  people.name%TYPE;\nBEGIN\n  IF sr_pkg.c%ISOPEN THEN\n    DBMS_OUTPUT.PUT_LINE('Cursor is open.');\n  ELSE\n    DBMS_OUTPUT.PUT_LINE('Cursor is closed; opening now.');\n    OPEN sr_pkg.c;\n  END IF;\n\n  FETCH sr_pkg.c INTO v_name;\n  DBMS_OUTPUT.PUT_LINE('Fetched: ' || v_name);\n\n  FETCH sr_pkg.c INTO v_name;\n    DBMS_OUTPUT.PUT_LINE('Fetched: ' || v_name);\n  END fetch_from_cursor;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/serially_reusable-packages-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/serially_reusable-packages.html\nBEGIN\n  fetch_from_cursor;\n  fetch_from_cursor;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/serially_reusable-packages-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/serially_reusable-packages.html\nBEGIN\n  fetch_from_cursor;\n  fetch_from_cursor;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-data-types-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-data-types.html\nDECLARE\n  t_b boolean := TRUE;\n  f_b boolean := FALSE;\nBEGIN\n  DBMS_OUTPUT.PUT_LINE('My bool is: ' || t_b);\n  DBMS_OUTPUT.PUT_LINE('My bool is: ' || f_b);\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-data-types-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-data-types.html\nDECLARE\n    TYPE theNSTTAB IS TABLE OF NUMBER;\n    myNSTTAB theNSTTAB;\nBEGIN\n    myNSTTAB := JSON_VALUE(JSON('{\"1\":10, \"2\":20, \"3\":30, \"4\":40}'), '$' RETURNING theNSTTAB);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-data-types-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-data-types.html\nDECLARE\n    TYPE theIBPLS IS TABLE OF NUMBER INDEX BY PLS_INTEGER;\n    myIBPLS theIBPLS := theIBPLS(-1=>1, 2=>2, -3=>3);\n    myJSON JSON;\nBEGIN\n    myJSON := JSON(myIBPLS);\n    DBMS_OUTPUT.PUT_LINE(JSON_SERIALIZE(myJSON));\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-data-types-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-data-types.html\nDECLARE\n    TYPE theNSTTAB IS TABLE OF NUMBER;\n    myNSTTAB theNSTTAB := theNSTTAB(1=>1, 2=>2, 3=>3);\n    myJSON JSON;\nBEGIN\n    myNSTTAB.delete(2); --myNSTTAB becomes sparse when elements are deleted\n    myJSON := JSON(myNSTTAB);\n    DBMS_OUTPUT.PUT_LINE(JSON_SERIALIZE(myJSON));\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-data-types-16.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-data-types.html\nDECLARE\n    TYPE theIBPLS IS TABLE OF NUMBER INDEX BY PLS_INTEGER;\n    myIBPLS theIBPLS;\nBEGIN\n    myIBPLS := JSON_VALUE(JSON('[1, 2, 3, 4, 5]'), '$' RETURNING theIBPLS);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-data-types-18.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-data-types.html\nDECLARE\n    TYPE theVARRAY IS VARRAY(5) OF NUMBER;\n    myVARRAY theVARRAY;\nBEGIN\n    myVARRAY := JSON_VALUE(JSON('[1, 2, 3, 4, 5]'), '$' RETURNING theVARRAY);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-data-types-20.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-data-types.html\nDECLARE\n    TYPE theNESTEDTABLE IS TABLE OF NUMBER;\n    myNESTEDTABLE theNESTEDTABLE;\nBEGIN\n    myNESTEDTABLE := JSON_VALUE(JSON('[1, 2, 3, 4, 5]'), '$' RETURNING theNESTEDTABLE);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-data-types-22.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-data-types.html\nDECLARE\n    TYPE theVarray IS VARRAY(4) OF NUMBER;\n    myVarray theVarray := theVarray(1, 2, 3, null);\n    myJSON JSON;\nBEGIN\n    myJSON := JSON(myVarray);\n    DBMS_OUTPUT.PUT_LINE(JSON_SERIALIZE(myJSON));\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-data-types-24.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-data-types.html\nDECLARE\n    TYPE theASCARRAY IS TABLE OF NUMBER INDEX BY VARCHAR2(10);\n    myAscArray theASCARRAY;\nBEGIN\n    myAscArray := JSON_VALUE(JSON('{\"Key1\":10, \"Key2\":20}'), '$' RETURNING theASCARRAY);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-data-types-26.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-data-types.html\nDECLARE\n    TYPE AsscArray IS TABLE OF VARCHAR2(10) INDEX BY VARCHAR2(10);\n    myAsscArray AsscArray := AsscArray('FIRST_NAME' => 'Bob', 'LAST_NAME' => 'Jones');\n    myJson JSON;\nBEGIN\n    myJson := JSON(myAsscArray);\n    DBMS_OUTPUT.PUT_LINE(JSON_SERIALIZE(myJson));\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-data-types-29.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-data-types.html\nCREATE TABLE PLS_VEC_TAB(\n    v1 vector, \n    v2 vector(100), \n    v3 vector(*, INT8),\n    v4 vector(100, INT8), \n    v5 vector(1024, BINARY),\n    v6 vector(100, FLOAT32, DENSE),\n    v7 vector(100, FLOAT32, SPARSE)\n);\nDECLARE\n    vec0 vector;                 -- dimension and format are flexible, storage format is DENSE\n    vec1 PLS_VEC_TAB.v1%TYPE;    -- dimension and format are flexible, storage format is DENSE\n    vec2 PLS_VEC_TAB.v2%TYPE;    -- dimension is 100, format is flexible, storage format is DENSE\n    vec3 PLS_VEC_TAB.v3%TYPE;    -- dimension is flexible, format is INT8, storage format is DENSE\n    vec4 PLS_VEC_TAB.v4%TYPE;    -- dimension is 100, format is INT8, storage format is DENSE\n    vec5 PLS_VEC_TAB.v5%TYPE;    -- dimension is 1024, format is BINARY, storage format is DENSE\n    vec6 PLS_VEC_TAB.v6%TYPE;    -- dimension is 100, format is FLOAT32, storage format is DENSE\n    vec7 PLS_VEC_TAB.v7%TYPE;    -- dimension is 100, format is FLOAT32, storage format is SPARSE\n\n    vec_0 vec0%TYPE;    -- dimension and format are flexible, storage format is DENSE\n    vec_1 vec1%TYPE;    -- dimension and format are flexible, storage format is DENSE\n    vec_2 vec2%TYPE;    -- dimension is 100, format is flexible, storage format is DENSE\n    vec_3 vec3%TYPE;    -- dimension is flexible, format is INT8, storage format is DENSE\n    vec_4 vec4%TYPE;    -- dimension is 100, format is INT8, storage format is DENSE\n    vec_5 vec5%TYPE;    -- dimension is 1024, format is BINARY, storage format is DENSE\n    vec_6 vec6%TYPE;    -- dimension is 100, format is FLOAT32, storage format is DENSE\n    vec_7 vec7%TYPE;    -- dimension is 100, format is FLOAT32, storage format is SPARSE\nBEGIN\n    NULL;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-data-types-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-data-types.html\nDECLARE\n    TYPE personrecord IS RECORD(first VARCHAR2(10), last VARCHAR2(10));\n    p personrecord;\nBEGIN\n    p := JSON_VALUE(JSON('{\"FIRST\":\"Jane\", \"LAST\":\"Cooper\"}'), '$'\n    RETURNING personrecord USING CASE_SENSITIVE MAPPING);\n    DBMS_OUTPUT.PUT_LINE(p.first ||' '|| p.last);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-data-types-31.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-data-types.html\nSELECT VECTOR_DISTANCE(v1, v2, COSINE) INTO dist;\nSELECT v1 <=> v2 INTO dist;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-data-types-32.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-data-types.html\nDROP TABLE theVectorTable;\nCREATE TABLE theVectorTable (embedding VECTOR(3, float32), id NUMBER);\nINSERT INTO theVectorTable VALUES ('[1.11, 2.22, 3.33]', 1);\nINSERT INTO theVectorTable VALUES ('[4.44, 5.55, 6.66]', 2);\nINSERT INTO theVectorTable VALUES ('[7.77, 8.88, 9.99]', 3);\nSET SERVEROUTPUT ON;\nDECLARE\n  v_embedding theVectorTable.embedding%TYPE;\nBEGIN\n  SELECT embedding INTO v_embedding FROM theVectorTable WHERE id=3;\n  DBMS_OUTPUT.PUT_LINE('Embedding is ' || FROM_VECTOR(v_embedding));\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-data-types-34.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-data-types.html\nDECLARE\n  TYPE vecTabT IS TABLE OF theVectorTable%ROWTYPE INDEX BY BINARY_INTEGER;\n  v_vecTabT vecTabT;\n  CURSOR c IS SELECT * FROM theVectorTable;\nBEGIN\n  OPEN c;\n  FETCH c BULK COLLECT INTO v_vecTabT;\n  CLOSE c;\n\n  -- display the contents of the vector index table\n  FOR i IN 1..v_vecTabT.LAST LOOP\n    DBMS_OUTPUT.PUT_LINE('Embedding ID ' || v_vecTabT(i).id || ': ' ||\n            FROM_VECTOR(v_vecTabT(i).embedding));\n  END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-data-types-36.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-data-types.html\nDROP TABLE vecLogTable;\nDROP SEQUENCE vecTrgSeq;\nCREATE TABLE vecLogTable (embedding VECTOR(3, float32), \n        describe VARCHAR2(25), seq NUMBER);\nCREATE SEQUENCE vecTrgSeq;\nCREATE OR REPLACE TRIGGER vecTrg \nBEFORE UPDATE ON theVectorTable\nFOR EACH ROW\nBEGIN\n  INSERT INTO vecLogTable VALUES (:old.embedding, 'OLD.VECTRG',\n          vecTrgSeq.NEXTVAL);\n  INSERT INTO vecLogTable VALUES (:new.embedding, 'NEW.VECTRG',\n          vecTrgSeq.NEXTVAL);\nEND;\n/\nUPDATE theVectorTable SET embedding='[2.22, 4.44, 6.66]' WHERE id=2;\nSELECT * FROM vecLogTable ORDER BY seq;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-data-types-38.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-data-types.html\nDECLARE\n  v1 VECTOR := TO_VECTOR('[1, 2, 3]');\n  v2 VECTOR := TO_VECTOR('[4, 5, 6]');\n  v3 VECTOR := TO_VECTOR('[1, 2, 0, 6]', *, BINARY);\n  v4 VECTOR := TO_VECTOR('[0, 6, 0, 3]', *, BINARY);\n  man_dist NUMBER;\n  euc_dist NUMBER;\n  cos_dist NUMBER;\n  inn_dist NUMBER;\n  ham_dist NUMBER;\n  dot_dist NUMBER;\n  jac_dist NUMBER;\nBEGIN\n  man_dist := L1_DISTANCE(v1, v2); --Manhattan Distance\n  euc_dist := L2_DISTANCE(v1, v2); --Euclidean Distance\n  cos_dist := COSINE_DISTANCE(v1, v2); --Cosine Distance\n  inn_dist := INNER_PRODUCT(v1, v2); --Inner Product\n\n  --The Hamming Distance has no standalone function in PL/SQL\n  ham_dist := VECTOR_DISTANCE(v1, v2, HAMMING);\n\n  --The Negative Inner (Dot) Product has no standalone function in PL/SQL\n  dot_dist := VECTOR_DISTANCE(v1, v2, DOT);\n\n  --The Jaccard Distance has no standalone function in PL/SQL\n  jac_dist := VECTOR_DISTANCE(v3, v4, JACCARD);\n\n  DBMS_OUTPUT.PUT_LINE('The Manhattan distance is: ' || man_dist);\n  DBMS_OUTPUT.PUT_LINE('The Euclidean distance is: ' || euc_dist);\n  DBMS_OUTPUT.PUT_LINE('The Cosine distance is: ' || cos_dist);\n  DBMS_OUTPUT.PUT_LINE('The Inner Product is: ' || inn_dist);\n  DBMS_OUTPUT.PUT_LINE('The Hamming distance is: ' || ham_dist);\n  DBMS_OUTPUT.PUT_LINE('The Dot Product is: ' || dot_dist);\n  DBMS_OUTPUT.PUT_LINE('The Jaccard Distance between the BINARY vectors v3 and v4 is: ' || jac_dist);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-data-types-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-data-types.html\nDECLARE\n    TYPE theRec1 IS RECORD (field1 NUMBER, field2 VARCHAR2(10));\n    TYPE theRec2 IS RECORD (\"fIeLd2\" VARCHAR2(20), \"FielD1\" NUMBER);\n\n    Rec1 theRec1;\n    Rec2 theRec2;\nBEGIN\n    Rec1 := JSON_VALUE(JSON('{\"FIELD1\":10, \"field2\":\"hello\"}'), '$' RETURNING theRec1);\n    Rec2 := JSON_VALUE(JSON('{\"FIELD1\":10, \"field2\":\"hello\"}'), '$' RETURNING theRec2);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-data-types-42.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-data-types.html\nDECLARE\n  v1 VECTOR := VECTOR('[10, 20, 30]', 3, INT8);\n  v2 VECTOR := VECTOR('[6, 4, 2]', 3, INT8);\nBEGIN\n  DBMS_OUTPUT.PUT_LINE(TO_CHAR(v1 + v2));\n  DBMS_OUTPUT.PUT_LINE(TO_CHAR(v1 - v2));\n  DBMS_OUTPUT.PUT_LINE(TO_CHAR(v1 * v2));\nEND;  \n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-data-types-44.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-data-types.html\nDECLARE\n  vs1 VECTOR(*, *, SPARSE) := VECTOR('[10, [0, 3, 4, 6, 7], [1.9, 4, 7.2, 30, 60]]', *, *, SPARSE);\n  vs2 VECTOR(*, *, SPARSE) := VECTOR('[10, [1, 3, 4, 8, 9], [4.5, 7.6, 4, 8.1, 5]]', *, *, SPARSE);\n\n  vd1 VECTOR(*, *, DENSE) := VECTOR('[1.9, 0, 0, 4, 7.2, 0, 30, 60, 0, 0]', *, *, DENSE);\n  vd2 VECTOR(*, *, DENSE) := VECTOR('[0, 4.5, 0, 7.6, 4, 0, 0, 0, 8.1, 5]', *, *, DENSE);\nBEGIN\n  DBMS_OUTPUT.PUT_LINE('Vector Distance Sparse: ' || TRUNC(VECTOR_DISTANCE(vs1, vs2), 5));\n  DBMS_OUTPUT.PUT_LINE('Vector Distance Dense:  ' || TRUNC(VECTOR_DISTANCE(vd1, vd2), 5));\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-data-types-46.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-data-types.html\nDECLARE\n  c VARCHAR2(3 CHAR);\nBEGIN\n  c := 'abc  ';\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-data-types-48.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-data-types.html\nDROP TABLE t;\nCREATE TABLE t (c CHAR(3 CHAR));\nDECLARE\n  s VARCHAR2(5 CHAR) := 'abc  ';\nBEGIN\n  INSERT INTO t(c) VALUES(s);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-data-types-50.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-data-types.html\nDECLARE\n  c VARCHAR2(3 CHAR);\nBEGIN\n  c := RTRIM('abc  ');\n  INSERT INTO t(c) VALUES(RTRIM('abc  '));\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-data-types-52.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-data-types.html\nDECLARE\n  first_name  CHAR(10 CHAR);\n  last_name   VARCHAR2(10 CHAR);\nBEGIN\n  first_name := 'John ';\n  last_name  := 'Chen ';\n\n  DBMS_OUTPUT.PUT_LINE('*' || first_name || '*');\n  DBMS_OUTPUT.PUT_LINE('*' || last_name || '*');\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-data-types-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-data-types.html\nDECLARE\n    TYPE theRec IS RECORD(field1 NUMBER, \"Field2\" NUMBER);\n    myRec theRec := theRec(10, 20);\n    myJson JSON;\nBEGIN\n    myJson := JSON(myRec);\n    DBMS_OUTPUT.PUT_LINE(JSON_SERIALIZE(myJson));\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-data-types-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-data-types.html\nDECLARE\n    TYPE theIBPLS IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;\n    myIBPLS theIBPLS;\nBEGIN\n    myIBPLS := JSON_VALUE(JSON('{\"-10\":10, \"-1\":1, \"100\":-100}'), '$' RETURNING theIBPLS);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-injection-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-injection.html\nDROP TABLE secret_records;\nCREATE TABLE secret_records (\n  user_name    VARCHAR2(9),\n  service_type VARCHAR2(12),\n  value        VARCHAR2(30),\n  date_created DATE\n);\nINSERT INTO secret_records (\n  user_name, service_type, value, date_created\n)\nVALUES ('Andy', 'Waiter', 'Serve dinner at Cafe Pete', SYSDATE);\nINSERT INTO secret_records (\n  user_name, service_type, value, date_created\n)\nVALUES ('Chuck', 'Merger', 'Buy company XYZ', SYSDATE);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-injection-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-injection.html\nCREATE OR REPLACE PROCEDURE get_record (\n  user_name    IN  VARCHAR2,\n  service_type IN  VARCHAR2,\n  rec          OUT VARCHAR2\n) AUTHID DEFINER\nIS\n  query VARCHAR2(4000);\nBEGIN\n  -- Following SELECT statement is vulnerable to modification\n  -- because it uses concatenation to build WHERE clause.\n  query := 'SELECT value FROM secret_records WHERE user_name='''\n           || user_name \n           || ''' AND service_type=''' \n           || service_type \n           || '''';\n  DBMS_OUTPUT.PUT_LINE('Query: ' || query);\n  EXECUTE IMMEDIATE query INTO rec ;\n  DBMS_OUTPUT.PUT_LINE('Rec: ' || rec );\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-injection-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-injection.html\nSELECT * FROM secret_records ORDER BY user_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-injection-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-injection.html\nBEGIN\n  p('Anybody', 'Anything'');\n  DELETE FROM secret_records WHERE service_type=INITCAP(''Merger');\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-injection-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-injection.html\n       DELETE FROM secret_records WHERE service_type=INITCAP('Merger');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-injection-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-injection.html\nSELECT * FROM secret_records;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-injection-16.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-injection.html\nSELECT * FROM secret_records;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-injection-18.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-injection.html\nCREATE OR REPLACE PROCEDURE get_recent_record (\n  user_name    IN  VARCHAR2,\n  service_type IN  VARCHAR2,\n  rec          OUT VARCHAR2\n) AUTHID DEFINER\nIS\n  query VARCHAR2(4000);\nBEGIN\n  /* Following SELECT statement is vulnerable to modification\n     because it uses concatenation to build WHERE clause\n     and because SYSDATE depends on the value of NLS_DATE_FORMAT. */\n\n  query := 'SELECT value FROM secret_records WHERE user_name='''\n           || user_name\n           || ''' AND service_type='''\n           || service_type\n           || ''' AND date_created>'''\n           || (SYSDATE - 30)\n           || '''';\n\n  DBMS_OUTPUT.PUT_LINE('Query: ' || query);\n  EXECUTE IMMEDIATE query INTO rec;\n  DBMS_OUTPUT.PUT_LINE('Rec: ' || rec);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-injection-19.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-injection.html\nSET SERVEROUTPUT ON;\nALTER SESSION SET NLS_DATE_FORMAT='DD-MON-YYYY';\nDECLARE\n  record_value VARCHAR2(4000);\nBEGIN\n  get_recent_record('Andy', 'Waiter', record_value);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-injection-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-injection.html\nSET SERVEROUTPUT ON;\nDECLARE\n  record_value VARCHAR2(4000);\nBEGIN\n  get_record('Andy', 'Waiter', record_value);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-injection-21.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-injection.html\nALTER SESSION SET NLS_DATE_FORMAT='\"'' OR service_type=''Merger\"';\nDECLARE\n  record_value VARCHAR2(4000);\nBEGIN\n  get_recent_record('Anybody', 'Anything', record_value);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-injection-23.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-injection.html\nCREATE OR REPLACE PROCEDURE get_record_2 (\n  user_name    IN  VARCHAR2,\n  service_type IN  VARCHAR2,\n  rec          OUT VARCHAR2\n) AUTHID DEFINER\nIS\n  query VARCHAR2(4000);\nBEGIN\n  query := 'SELECT value FROM secret_records\n            WHERE user_name=:a\n            AND service_type=:b';\n\n  DBMS_OUTPUT.PUT_LINE('Query: ' || query);\n\n  EXECUTE IMMEDIATE query INTO rec USING user_name, service_type;\n\n  DBMS_OUTPUT.PUT_LINE('Rec: ' || rec);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-injection-24.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-injection.html\nSET SERVEROUTPUT ON;\nDECLARE\n  record_value VARCHAR2(4000);\nBEGIN\n  get_record_2('Andy', 'Waiter', record_value);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-injection-26.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-injection.html\nDECLARE\n  record_value VARCHAR2(4000);\nBEGIN\n  get_record_2('Anybody '' OR service_type=''Merger''--',\n               'Anything',\n               record_value);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-injection-28.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-injection.html\nCREATE OR REPLACE PROCEDURE raise_emp_salary (\n  column_value  NUMBER,\n  emp_column    VARCHAR2,\n  amount NUMBER ) AUTHID DEFINER\nIS\n  v_column  VARCHAR2(30);\n  sql_stmt  VARCHAR2(200);\nBEGIN\n  -- Check validity of column name that was given as input:\n  SELECT column_name INTO v_column\n  FROM USER_TAB_COLS\n  WHERE TABLE_NAME = 'EMPLOYEES'\n  AND COLUMN_NAME = emp_column;\n\n  sql_stmt := 'UPDATE employees SET salary = salary + :1 WHERE '\n    || DBMS_ASSERT.ENQUOTE_NAME(v_column,FALSE) || ' = :2';\n\n  EXECUTE IMMEDIATE sql_stmt USING amount, column_value;\n\n  -- If column name is valid:\n  IF SQL%ROWCOUNT > 0 THEN\n    DBMS_OUTPUT.PUT_LINE('Salaries were updated for: '\n      || emp_column || ' = ' || column_value);\n  END IF;\n\n  -- If column name is not valid:\n  EXCEPTION\n    WHEN NO_DATA_FOUND THEN\n      DBMS_OUTPUT.PUT_LINE ('Invalid Column: ' || emp_column);\nEND raise_emp_salary;\n/\nDECLARE\n  plsql_block  VARCHAR2(500);\nBEGIN\n  -- Invoke raise_emp_salary from a dynamic PL/SQL block:\n  plsql_block :=\n    'BEGIN raise_emp_salary(:cvalue, :cname, :amt); END;';\n\n  EXECUTE IMMEDIATE plsql_block\n    USING 110, 'DEPARTMENT_ID', 10;\n\n  -- Invoke raise_emp_salary from a dynamic SQL statement:\n  EXECUTE IMMEDIATE 'BEGIN raise_emp_salary(:cvalue, :cname, :amt); END;'\n    USING 112, 'EMPLOYEE_ID', 10;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-injection-30.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-injection.html\nCREATE OR REPLACE PROCEDURE get_recent_record (\n  user_name     IN  VARCHAR2,\n  service_type  IN  VARCHAR2,\n  rec           OUT VARCHAR2\n) AUTHID DEFINER\nIS\n  query VARCHAR2(4000);\nBEGIN\n  /* Following SELECT statement is vulnerable to modification\n     because it uses concatenation to build WHERE clause. */\n\n  query := 'SELECT value FROM secret_records WHERE user_name='''\n           || user_name \n           || ''' AND service_type=''' \n           || service_type \n           || ''' AND date_created> DATE ''' \n           || TO_CHAR(SYSDATE - 30,'YYYY-MM-DD') \n           || '''';\n\n  DBMS_OUTPUT.PUT_LINE('Query: ' || query);\n  EXECUTE IMMEDIATE query INTO rec;\n  DBMS_OUTPUT.PUT_LINE('Rec: ' || rec);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-injection-31.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-injection.html\nALTER SESSION SET NLS_DATE_FORMAT='\"'' OR service_type=''Merger\"';\nDECLARE\n  record_value VARCHAR2(4000);\nBEGIN\n  get_recent_record('Anybody', 'Anything', record_value);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-injection-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-injection.html\nDECLARE\n  record_value VARCHAR2(4000);\nBEGIN\n  get_record(\n  'Anybody '' OR service_type=''Merger''--',\n  'Anything',\n  record_value);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-injection-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-injection.html\nCREATE OR REPLACE PROCEDURE p (\n  user_name    IN  VARCHAR2,\n  service_type IN  VARCHAR2\n) AUTHID DEFINER\nIS\n  block1 VARCHAR2(4000);\nBEGIN\n  -- Following block is vulnerable to statement injection\n  -- because it is built by concatenation.\n  block1 :=\n    'BEGIN\n    DBMS_OUTPUT.PUT_LINE(''user_name: ' || user_name || ''');'\n    || 'DBMS_OUTPUT.PUT_LINE(''service_type: ' || service_type || ''');\n    END;';\n\n  DBMS_OUTPUT.PUT_LINE('Block1: ' || block1);\n\n  EXECUTE IMMEDIATE block1;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-injection-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-injection.html\nSET SERVEROUTPUT ON;\nBEGIN\n  p('Andy', 'Waiter');\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/sql-injection-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/sql-injection.html\nCOLUMN date_created FORMAT A12;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/subprogram-invocation-resolution-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/subprogram-invocation-resolution.html\nDECLARE\n  PROCEDURE swap (\n    n1 NUMBER,\n    n2 NUMBER\n  )\n  IS\n    num1 NUMBER;\n    num2 NUMBER;\n\n    FUNCTION balance\n      (bal NUMBER)\n      RETURN NUMBER\n    IS\n      x NUMBER := 10;\n\n      PROCEDURE swap (\n        d1 DATE,\n        d2 DATE\n      ) IS\n      BEGIN\n        NULL;\n      END;\n\n      PROCEDURE swap (\n        b1 BOOLEAN,\n        b2 BOOLEAN\n      ) IS\n      BEGIN\n        NULL;\n      END;\n\n    BEGIN  -- balance\n      swap(num1, num2);\n      RETURN x;\n    END balance;\n\n  BEGIN  -- enclosing procedure swap\n    NULL;\n  END swap;\n\nBEGIN  -- anonymous block\n  NULL;\nEND;   -- anonymous block\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/subprogram-parameters-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/subprogram-parameters.html\nCREATE OR REPLACE PROCEDURE p (\n  n NUMBER\n) AUTHID DEFINER IS\nBEGIN\n  NULL;\nEND;\n/\nDECLARE\n  x NUMBER      :=  1;\n  y VARCHAR2(1) := '1';\nBEGIN\n  p(x);             -- No conversion needed\n  p(y);             -- z implicitly converted from VARCHAR2 to NUMBER\n  p(TO_NUMBER(y));  -- z explicitly converted from VARCHAR2 to NUMBER\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/subprogram-parameters-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/subprogram-parameters.html\nCREATE OR REPLACE PROCEDURE p (x OUT INTEGER, y OUT INTEGER) AS\nBEGIN\n  x := 17; y := 93;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/subprogram-parameters-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/subprogram-parameters.html\nCREATE OR REPLACE PROCEDURE p (\n  a        PLS_INTEGER,  -- IN by default\n  b     IN PLS_INTEGER,\n  c    OUT PLS_INTEGER,\n  d IN OUT BINARY_FLOAT\n) AUTHID DEFINER IS\nBEGIN\n  -- Print values of parameters:\n \n  DBMS_OUTPUT.PUT_LINE('Inside procedure p:');\n\n  DBMS_OUTPUT.PUT('IN a = ');\n  DBMS_OUTPUT.PUT_LINE(NVL(TO_CHAR(a), 'NULL'));\n\n  DBMS_OUTPUT.PUT('IN b = ');\n  DBMS_OUTPUT.PUT_LINE(NVL(TO_CHAR(b), 'NULL'));\n\n  DBMS_OUTPUT.PUT('OUT c = ');\n  DBMS_OUTPUT.PUT_LINE(NVL(TO_CHAR(c), 'NULL'));\n\n  DBMS_OUTPUT.PUT_LINE('IN OUT d = ' || TO_CHAR(d));\n\n  -- Can reference IN parameters a and b,\n  -- but cannot assign values to them.\n\n  c := a+10;  -- Assign value to OUT parameter\n  d := 10/b;  -- Assign value to IN OUT parameter\nEND;\n/\nDECLARE\n  aa  CONSTANT PLS_INTEGER := 1;\n  bb  PLS_INTEGER  := 2;\n  cc  PLS_INTEGER  := 3;\n  dd  BINARY_FLOAT := 4;\n  ee  PLS_INTEGER;\n  ff  BINARY_FLOAT := 5;\nBEGIN\n  DBMS_OUTPUT.PUT_LINE('Before invoking procedure p:');\n\n  DBMS_OUTPUT.PUT('aa = ');\n  DBMS_OUTPUT.PUT_LINE(NVL(TO_CHAR(aa), 'NULL'));\n\n  DBMS_OUTPUT.PUT('bb = ');\n  DBMS_OUTPUT.PUT_LINE(NVL(TO_CHAR(bb), 'NULL'));\n\n  DBMS_OUTPUT.PUT('cc = ');\n  DBMS_OUTPUT.PUT_LINE(NVL(TO_CHAR(cc), 'NULL'));\n\n  DBMS_OUTPUT.PUT_LINE('dd = ' || TO_CHAR(dd));\n\n  p (aa, -- constant\n     bb, -- initialized variable\n     cc, -- initialized variable \n     dd  -- initialized variable\n  );\n\n  DBMS_OUTPUT.PUT_LINE('After invoking procedure p:');\n\n  DBMS_OUTPUT.PUT('aa = ');\n  DBMS_OUTPUT.PUT_LINE(NVL(TO_CHAR(aa), 'NULL'));\n\n  DBMS_OUTPUT.PUT('bb = ');\n  DBMS_OUTPUT.PUT_LINE(NVL(TO_CHAR(bb), 'NULL'));\n\n  DBMS_OUTPUT.PUT('cc = ');\n  DBMS_OUTPUT.PUT_LINE(NVL(TO_CHAR(cc), 'NULL'));\n\n  DBMS_OUTPUT.PUT_LINE('dd = ' || TO_CHAR(dd));\n\n  DBMS_OUTPUT.PUT_LINE('Before invoking procedure p:');\n\n  DBMS_OUTPUT.PUT('ee = ');\n  DBMS_OUTPUT.PUT_LINE(NVL(TO_CHAR(ee), 'NULL'));\n\n  DBMS_OUTPUT.PUT_LINE('ff = ' || TO_CHAR(ff));\n\n  p (1,        -- literal \n     (bb+3)*4, -- expression \n     ee,       -- uninitialized variable \n     ff        -- initialized variable\n   );\n\n  DBMS_OUTPUT.PUT_LINE('After invoking procedure p:');\n\n  DBMS_OUTPUT.PUT('ee = ');\n  DBMS_OUTPUT.PUT_LINE(NVL(TO_CHAR(ee), 'NULL'));\n\n  DBMS_OUTPUT.PUT_LINE('ff = ' || TO_CHAR(ff));\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/subprogram-parameters-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/subprogram-parameters.html\nDECLARE\n  j  PLS_INTEGER  := 10;\n  k  BINARY_FLOAT := 15;\nBEGIN\n  DBMS_OUTPUT.PUT_LINE('Before invoking procedure p:');\n\n  DBMS_OUTPUT.PUT('j = ');\n  DBMS_OUTPUT.PUT_LINE(NVL(TO_CHAR(j), 'NULL'));\n\n  DBMS_OUTPUT.PUT_LINE('k = ' || TO_CHAR(k));\n\n  p(4, 0, j, k);  -- causes p to exit with exception ZERO_DIVIDE\n\nEXCEPTION\n  WHEN ZERO_DIVIDE THEN\n    DBMS_OUTPUT.PUT_LINE('After invoking procedure p:');\n\n    DBMS_OUTPUT.PUT('j = ');\n    DBMS_OUTPUT.PUT_LINE(NVL(TO_CHAR(j), 'NULL'));\n\n    DBMS_OUTPUT.PUT_LINE('k = ' || TO_CHAR(k));\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/subprogram-parameters-17.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/subprogram-parameters.html\nCREATE OR REPLACE PACKAGE r_types AUTHID DEFINER IS\n  TYPE r_type_1 IS RECORD (f VARCHAR2(5) := 'abcde');\n  TYPE r_type_2 IS RECORD (f VARCHAR2(5));\nEND;\n/\nCREATE OR REPLACE PROCEDURE p (\n  x OUT r_types.r_type_1,\n  y OUT r_types.r_type_2,\n  z OUT VARCHAR2) \nAUTHID CURRENT_USER IS\nBEGIN\n  DBMS_OUTPUT.PUT_LINE('x.f is ' || NVL(x.f,'NULL'));\n  DBMS_OUTPUT.PUT_LINE('y.f is ' || NVL(y.f,'NULL'));\n  DBMS_OUTPUT.PUT_LINE('z is ' || NVL(z,'NULL'));\nEND;\n/\nDECLARE\n  r1 r_types.r_type_1;\n  r2 r_types.r_type_2;\n  s  VARCHAR2(5) := 'fghij';\nBEGIN\n  p (r1, r2, s);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/subprogram-parameters-19.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/subprogram-parameters.html\nDECLARE\n  TYPE Definition IS RECORD (\n    word     VARCHAR2(20),\n    meaning  VARCHAR2(200)\n  );\n\n  TYPE Dictionary IS VARRAY(2000) OF Definition;\n\n  lexicon  Dictionary := Dictionary();  -- global variable\n\n  PROCEDURE add_entry (\n    word_list IN OUT NOCOPY Dictionary  -- formal NOCOPY parameter\n  ) IS\n  BEGIN\n    word_list(1).word := 'aardvark';\n  END;\n\nBEGIN\n  lexicon.EXTEND;\n  lexicon(1).word := 'aardwolf';\n  add_entry(lexicon);  -- global variable is actual parameter\n  DBMS_OUTPUT.PUT_LINE(lexicon(1).word);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/subprogram-parameters-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/subprogram-parameters.html\nDECLARE\n  emp_num NUMBER(6) := 120;\n  bonus   NUMBER(6) := 100;\n  merit   NUMBER(4) := 50;\n\n  PROCEDURE raise_salary (\n    emp_id NUMBER,  -- formal parameter\n    amount NUMBER   -- formal parameter\n  ) IS\n  BEGIN\n    UPDATE employees\n    SET salary = salary + amount  -- reference to formal parameter\n    WHERE employee_id = emp_id;   -- reference to formal parameter\n  END raise_salary;\n\nBEGIN\n  raise_salary(emp_num, bonus);          -- actual parameters\n\n  /* raise_salary runs this statement:\n       UPDATE employees\n       SET salary = salary + 100\n       WHERE employee_id = 120;       */\n\n  raise_salary(emp_num, merit + bonus);  -- actual parameters\n\n  /* raise_salary runs this statement:\n       UPDATE employees\n       SET salary = salary + 150\n       WHERE employee_id = 120;       */\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/subprogram-parameters-21.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/subprogram-parameters.html\nDECLARE\n  n NUMBER := 10;\n\n  PROCEDURE p (\n    n1 IN NUMBER,\n    n2 IN OUT NUMBER,\n    n3 IN OUT NOCOPY NUMBER\n  ) IS\n  BEGIN\n    n2 := 20;  -- actual parameter is 20 only after procedure succeeds\n    DBMS_OUTPUT.put_line(n1);  -- actual parameter value is still 10\n    n3 := 30;  -- might change actual parameter immediately\n    DBMS_OUTPUT.put_line(n1);  -- actual parameter value is either 10 or 30\n  END;\n\nBEGIN\n  p(n, n, n);\n  DBMS_OUTPUT.put_line(n);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/subprogram-parameters-24.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/subprogram-parameters.html\nDECLARE\n  TYPE EmpCurTyp IS REF CURSOR;\n  c1 EmpCurTyp;\n  c2 EmpCurTyp;\n\n  PROCEDURE get_emp_data (\n    emp_cv1 IN OUT EmpCurTyp,\n    emp_cv2 IN OUT EmpCurTyp\n  )\n  IS\n    emp_rec employees%ROWTYPE;\n  BEGIN\n    OPEN emp_cv1 FOR SELECT * FROM employees;\n    emp_cv2 := emp_cv1;  -- now both variables refer to same location\n    FETCH emp_cv1 INTO emp_rec;  -- fetches first row of employees\n    FETCH emp_cv1 INTO emp_rec;  -- fetches second row of employees\n    FETCH emp_cv2 INTO emp_rec;  -- fetches third row of employees\n    CLOSE emp_cv1;  -- closes both variables\n    FETCH emp_cv2 INTO emp_rec; -- causes error when get_emp_data is invoked\n  END;\nBEGIN\n  get_emp_data(c1, c2);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/subprogram-parameters-26.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/subprogram-parameters.html\nDECLARE\n  PROCEDURE raise_salary (\n    emp_id IN employees.employee_id%TYPE,\n    amount IN employees.salary%TYPE := 100,\n    extra  IN employees.salary%TYPE := 50\n  ) IS\n  BEGIN\n    UPDATE employees\n    SET salary = salary + amount + extra\n    WHERE employee_id = emp_id;\n  END raise_salary;\n\nBEGIN\n  raise_salary(120);       -- same as raise_salary(120, 100, 50)\n  raise_salary(121, 200);  -- same as raise_salary(121, 200, 50)\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/subprogram-parameters-27.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/subprogram-parameters.html\nDECLARE\n  global PLS_INTEGER := 0;\n\n  FUNCTION f RETURN PLS_INTEGER IS\n  BEGIN\n    DBMS_OUTPUT.PUT_LINE('Inside f.');\n    global := global + 1;\n    RETURN global * 2;\n  END f;\n\n  PROCEDURE p (\n    x IN PLS_INTEGER := f()\n  ) IS\n  BEGIN  \n    DBMS_OUTPUT.PUT_LINE (\n      'Inside p. ' || \n      '  global = ' || global ||\n      ', x = ' || x || '.'\n    );\n    DBMS_OUTPUT.PUT_LINE('--------------------------------');\n  END p;\n\n  PROCEDURE pre_p IS\n  BEGIN\n    DBMS_OUTPUT.PUT_LINE (\n     'Before invoking p,  global = ' || global || '.'\n    );\n    DBMS_OUTPUT.PUT_LINE('Invoking p.');\n  END pre_p;\n\nBEGIN\n  pre_p;\n  p();     -- default expression is evaluated\n\n  pre_p;\n  p(100);  -- default expression is not evaluated\n\n  pre_p;\n  p();     -- default expression is evaluated\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/subprogram-parameters-29.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/subprogram-parameters.html\nCREATE OR REPLACE PROCEDURE print_name (\n  first VARCHAR2,\n  last VARCHAR2\n) AUTHID DEFINER IS\nBEGIN\n  DBMS_OUTPUT.PUT_LINE(first || ' ' || last);\nEND print_name;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/subprogram-parameters-30.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/subprogram-parameters.html\nBEGIN\n  print_name('John', 'Doe');\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/subprogram-parameters-32.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/subprogram-parameters.html\nCREATE OR REPLACE PROCEDURE print_name (\n  first VARCHAR2,\n  last VARCHAR2,\n  mi   VARCHAR2 := NULL\n) AUTHID DEFINER IS\nBEGIN\n  IF mi IS NULL THEN\n    DBMS_OUTPUT.PUT_LINE(first || ' ' || last);\n  ELSE\n    DBMS_OUTPUT.PUT_LINE(first || ' ' || mi || '. ' || last);\n  END IF;\nEND print_name;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/subprogram-parameters-33.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/subprogram-parameters.html\nBEGIN\n  print_name('John', 'Doe');          -- original invocation\n  print_name('John', 'Public', 'Q');  -- new invocation\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/subprogram-parameters-36.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/subprogram-parameters.html\nDECLARE\n  emp_num NUMBER(6) := 120;\n  bonus   NUMBER(6) := 50;\n\n  PROCEDURE raise_salary (\n    emp_id NUMBER,\n    amount NUMBER\n  ) IS\n  BEGIN\n    UPDATE employees\n    SET salary = salary + amount\n    WHERE employee_id = emp_id;\n  END raise_salary;\n\nBEGIN\n  -- Equivalent invocations:\n\n  raise_salary(emp_num, bonus);                      -- positional notation\n  raise_salary(amount => bonus, emp_id => emp_num);  -- named notation\n  raise_salary(emp_id => emp_num, amount => bonus);  -- named notation\n  raise_salary(emp_num, amount => bonus);            -- mixed notation\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/subprogram-parameters-37.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/subprogram-parameters.html\nCREATE OR REPLACE FUNCTION compute_bonus (\n  emp_id NUMBER,\n  bonus NUMBER\n) RETURN NUMBER\n  AUTHID DEFINER\nIS\n  emp_sal NUMBER;\nBEGIN\n  SELECT salary INTO emp_sal\n  FROM employees\n  WHERE employee_id = emp_id;\n\n  RETURN emp_sal + bonus;\nEND compute_bonus;\n/\nSELECT compute_bonus(120, 50) FROM DUAL;\nSELECT compute_bonus(bonus => 50, emp_id => 120) FROM DUAL;\nSELECT compute_bonus(120, bonus => 50) FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/subprogram-parameters-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/subprogram-parameters.html\nDECLARE\n  SUBTYPE License IS VARCHAR2(7) NOT NULL;\n  n  License := 'DLLLDDD';\n\n  PROCEDURE p (x License) IS\n  BEGIN\n    DBMS_OUTPUT.PUT_LINE(x);\n  END;\n\nBEGIN\n  p('1ABC123456789');  -- Succeeds; size is not inherited\n  p(NULL);             -- Raises error; NOT NULL is inherited\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/subprogram-parameters-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/subprogram-parameters.html\nDECLARE\n  FUNCTION test (p INTEGER) RETURN INTEGER IS\n  BEGIN\n    DBMS_OUTPUT.PUT_LINE('p = ' || p);\n    RETURN p;\n  END test;\n\nBEGIN\n  DBMS_OUTPUT.PUT_LINE('test(p) = ' || test(0.66));\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/subprogram-parameters-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/subprogram-parameters.html\nDECLARE\n  FUNCTION test (p NUMBER) RETURN NUMBER IS\n    q INTEGER := p;  -- Implicitly converts p to INTEGER\n  BEGIN\n    DBMS_OUTPUT.PUT_LINE('p = ' || q);  -- Display q, not p\n    RETURN q;                           -- Return q, not p\n  END test;\n\nBEGIN\n  DBMS_OUTPUT.PUT_LINE('test(p) = ' || test(0.66));\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/subprogram-parts-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/subprogram-parts.html\nDECLARE\n  first_name employees.first_name%TYPE;\n  last_name  employees.last_name%TYPE;\n  email      employees.email%TYPE;\n  employer   VARCHAR2(8) := 'AcmeCorp';\n\n  -- Declare and define procedure\n\n  PROCEDURE create_email (  -- Subprogram heading begins\n    name1   VARCHAR2,\n    name2   VARCHAR2,\n    company VARCHAR2\n  )                         -- Subprogram heading ends\n  IS\n                            -- Declarative part begins\n    error_message VARCHAR2(30) := 'Email address is too long.';\n  BEGIN                     -- Executable part begins\n    email := name1 || '.' || name2 || '@' || company;\n  EXCEPTION                      -- Exception-handling part begins\n    WHEN VALUE_ERROR THEN\n      DBMS_OUTPUT.PUT_LINE(error_message);\n  END create_email;\n\nBEGIN\n  first_name := 'John';\n  last_name  := 'Doe';\n\n  create_email(first_name, last_name, employer);  -- invocation\n  DBMS_OUTPUT.PUT_LINE ('With first name first, email is: ' || email);\n\n  create_email(last_name, first_name, employer);  -- invocation\n  DBMS_OUTPUT.PUT_LINE ('With last name first, email is: ' || email);\n\n  first_name := 'Elizabeth';\n  last_name  := 'MacDonald';\n  create_email(first_name, last_name, employer);  -- invocation\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/subprogram-parts-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/subprogram-parts.html\nBEGIN\n  BEGIN\n    DBMS_OUTPUT.PUT_LINE('Inside inner block.');\n    RETURN;\n    DBMS_OUTPUT.PUT_LINE('Unreachable statement.');\n  END;\n  DBMS_OUTPUT.PUT_LINE('Inside outer block. Unreachable statement.');\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/subprogram-parts-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/subprogram-parts.html\nDECLARE\n  -- Declare and define function\n\n  FUNCTION square (original NUMBER)   -- parameter list\n    RETURN NUMBER                     -- RETURN clause\n  AS\n                                      -- Declarative part begins\n    original_squared NUMBER;\n  BEGIN                               -- Executable part begins\n    original_squared := original * original;\n    RETURN original_squared;          -- RETURN statement\n  END;\nBEGIN\n  DBMS_OUTPUT.PUT_LINE(square(100));  -- invocation\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/subprogram-parts-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/subprogram-parts.html\nDECLARE\n  x INTEGER;\n\n  FUNCTION f (n INTEGER)\n  RETURN INTEGER\n  IS\n  BEGIN\n    RETURN (n*n);\n  END;\n\nBEGIN\n  DBMS_OUTPUT.PUT_LINE (\n    'f returns ' || f(2) || '. Execution returns here (1).'\n  );\n\n  x := f(2);\n  DBMS_OUTPUT.PUT_LINE('Execution returns here (2).');\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/subprogram-parts-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/subprogram-parts.html\nCREATE OR REPLACE FUNCTION f (n INTEGER)\n  RETURN INTEGER\n  AUTHID DEFINER\nIS\nBEGIN\n  IF n = 0 THEN\n    RETURN 1;\n  ELSIF n = 1 THEN\n    RETURN n;\n  END IF;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/subprogram-parts-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/subprogram-parts.html\nCREATE OR REPLACE FUNCTION f (n INTEGER)\n  RETURN INTEGER\n  AUTHID DEFINER\nIS\nBEGIN\n  IF n = 0 THEN\n    RETURN 1;\n  ELSIF n = 1 THEN\n    RETURN n;\n  ELSE\n    RETURN n*n;\n  END IF;\nEND;\n/\nBEGIN\n  FOR i IN 0 .. 3 LOOP\n    DBMS_OUTPUT.PUT_LINE('f(' || i || ') = ' || f(i));\n  END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/subprogram-parts-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/subprogram-parts.html\nDECLARE\n  PROCEDURE p IS\n  BEGIN\n    DBMS_OUTPUT.PUT_LINE('Inside p');\n    RETURN;\n    DBMS_OUTPUT.PUT_LINE('Unreachable statement.');\n  END;\nBEGIN\n  p;\n  DBMS_OUTPUT.PUT_LINE('Control returns here.');\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/subprograms-invoked-triggers-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/subprograms-invoked-triggers.html\nCREATE OR REPLACE PROCEDURE Before_delete (Id IN NUMBER, Ename VARCHAR2)\nIS LANGUAGE Java\nname 'thjvTriggers.beforeDelete (oracle.jdbc.NUMBER, oracle.jdbc.CHAR)';\n\nCREATE OR REPLACE TRIGGER Pre_del_trigger BEFORE DELETE ON Tab \nFOR EACH ROW\nCALL Before_delete (:OLD.Id, :OLD.Ename)\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/system-triggers-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/system-triggers.html\nCREATE OR REPLACE TRIGGER drop_trigger\n  BEFORE DROP ON hr.SCHEMA\n  BEGIN\n    RAISE_APPLICATION_ERROR (\n      num => -20000,\n      msg => 'Cannot drop object');\n  END;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/system-triggers-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/system-triggers.html\nCREATE TRIGGER log_errors\n  AFTER SERVERERROR ON DATABASE\n  BEGIN\n    IF (IS_SERVERERROR (1017)) THEN\n      NULL;  -- (substitute code that processes logon error)\n    ELSE\n      NULL;  -- (substitute code that logs error code)\n    END IF;\n  END;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/system-triggers-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/system-triggers.html\nCREATE OR REPLACE TRIGGER check_user\n  AFTER LOGON ON DATABASE\n  BEGIN\n    check_user;\n  EXCEPTION\n    WHEN OTHERS THEN\n      RAISE_APPLICATION_ERROR\n        (-20000, 'Unexpected error: '|| DBMS_Utility.Format_Error_Stack);\n END;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/system-triggers-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/system-triggers.html\nCREATE OR REPLACE TRIGGER t\n  INSTEAD OF CREATE ON SCHEMA\n  BEGIN\n    EXECUTE IMMEDIATE 'CREATE TABLE T (n NUMBER, m NUMBER)';\n  END;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/transaction-processing-and-control-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/transaction-processing-and-control.html\nDROP TABLE accounts;\nCREATE TABLE accounts (\n  account_id  NUMBER(6),\n  balance     NUMBER (10,2)\n);\nINSERT INTO accounts (account_id, balance)\nVALUES (7715, 6350.00);\nINSERT INTO accounts (account_id, balance)\nVALUES (7720, 5100.50);\nCREATE OR REPLACE PROCEDURE transfer (\n  from_acct  NUMBER,\n  to_acct    NUMBER,\n  amount     NUMBER\n) AUTHID CURRENT_USER AS\nBEGIN\n  UPDATE accounts\n  SET balance = balance - amount\n  WHERE account_id = from_acct;\n\n  UPDATE accounts\n  SET balance = balance + amount\n  WHERE account_id = to_acct;\n\n  COMMIT WRITE IMMEDIATE NOWAIT;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/transaction-processing-and-control-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/transaction-processing-and-control.html\nSELECT * FROM accounts;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/transaction-processing-and-control-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/transaction-processing-and-control.html\nDROP TABLE emp;\nCREATE TABLE emp AS SELECT * FROM employees;\nDECLARE\n  CURSOR c1 IS\n    SELECT last_name, job_id, rowid\n    FROM emp;  -- no FOR UPDATE clause\n\n  my_lastname   employees.last_name%TYPE;\n  my_jobid      employees.job_id%TYPE;\n  my_rowid      UROWID;\nBEGIN\n  OPEN c1;\n  LOOP\n    FETCH c1 INTO my_lastname, my_jobid, my_rowid;\n    EXIT WHEN c1%NOTFOUND;\n\n    UPDATE emp\n    SET salary = salary * 1.02\n    WHERE rowid = my_rowid;  -- simulates WHERE CURRENT OF c1\n\n    COMMIT;\n  END LOOP;\n  CLOSE c1;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/transaction-processing-and-control-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/transaction-processing-and-control.html\nBEGIN\n  transfer(7715, 7720, 250);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/transaction-processing-and-control-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/transaction-processing-and-control.html\nSELECT * FROM accounts;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/transaction-processing-and-control-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/transaction-processing-and-control.html\nDROP TABLE emp_name;\nCREATE TABLE emp_name AS \n  SELECT employee_id, last_name\n  FROM employees;\nCREATE UNIQUE INDEX empname_ix\nON emp_name (employee_id);\nDROP TABLE emp_sal;\nCREATE TABLE emp_sal AS\n  SELECT employee_id, salary\n  FROM employees;\nCREATE UNIQUE INDEX empsal_ix\nON emp_sal (employee_id);\nDROP TABLE emp_job;\nCREATE TABLE emp_job AS\n  SELECT employee_id, job_id\n  FROM employees;\nCREATE UNIQUE INDEX empjobid_ix\nON emp_job (employee_id);\nDECLARE\n  emp_id        NUMBER(6);\n  emp_lastname  VARCHAR2(25);\n  emp_salary    NUMBER(8,2);\n  emp_jobid     VARCHAR2(10);\nBEGIN\n  SELECT employee_id, last_name, salary, job_id\n  INTO emp_id, emp_lastname, emp_salary, emp_jobid\n  FROM employees\n  WHERE employee_id = 120;\n\n  INSERT INTO emp_name (employee_id, last_name)\n  VALUES (emp_id, emp_lastname);\n\n  INSERT INTO emp_sal (employee_id, salary) \n  VALUES (emp_id, emp_salary);\n\n  INSERT INTO emp_job (employee_id, job_id)\n  VALUES (emp_id, emp_jobid);\n\nEXCEPTION\n  WHEN DUP_VAL_ON_INDEX THEN\n    ROLLBACK;\n    DBMS_OUTPUT.PUT_LINE('Inserts were rolled back');\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/transaction-processing-and-control-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/transaction-processing-and-control.html\nDROP TABLE emp_name;\nCREATE TABLE emp_name AS\n  SELECT employee_id, last_name, salary\n  FROM employees;\nCREATE UNIQUE INDEX empname_ix\nON emp_name (employee_id);\nDECLARE\n  emp_id        employees.employee_id%TYPE;\n  emp_lastname  employees.last_name%TYPE;\n  emp_salary    employees.salary%TYPE;\n\nBEGIN\n  SELECT employee_id, last_name, salary\n  INTO emp_id, emp_lastname, emp_salary \n  FROM employees\n  WHERE employee_id = 120;\n\n  UPDATE emp_name\n  SET salary = salary * 1.1\n  WHERE employee_id = emp_id;\n\n  DELETE FROM emp_name\n  WHERE employee_id = 130;\n\n  SAVEPOINT do_insert;\n\n  INSERT INTO emp_name (employee_id, last_name, salary)\n  VALUES (emp_id, emp_lastname, emp_salary);\n\nEXCEPTION\n  WHEN DUP_VAL_ON_INDEX THEN\n    ROLLBACK TO do_insert;\n  DBMS_OUTPUT.PUT_LINE('Insert was rolled back');\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/transaction-processing-and-control-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/transaction-processing-and-control.html\nDROP TABLE emp_name;\nCREATE TABLE emp_name AS\n  SELECT employee_id, last_name, salary\n  FROM employees;\nCREATE UNIQUE INDEX empname_ix\nON emp_name (employee_id);\nDECLARE\n  emp_id        employees.employee_id%TYPE;\n  emp_lastname  employees.last_name%TYPE;\n  emp_salary    employees.salary%TYPE;\n\nBEGIN\n  SELECT employee_id, last_name, salary\n  INTO emp_id, emp_lastname, emp_salary\n  FROM employees\n  WHERE employee_id = 120;\n\n  SAVEPOINT my_savepoint;\n\n  UPDATE emp_name\n  SET salary = salary * 1.1\n  WHERE employee_id = emp_id;\n\n  DELETE FROM emp_name\n  WHERE employee_id = 130;\n\n  SAVEPOINT my_savepoint;\n\n  INSERT INTO emp_name (employee_id, last_name, salary)\n  VALUES (emp_id, emp_lastname, emp_salary);\n\nEXCEPTION\n  WHEN DUP_VAL_ON_INDEX THEN\n    ROLLBACK TO my_savepoint;\n    DBMS_OUTPUT.PUT_LINE('Transaction rolled back.');\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/transaction-processing-and-control-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/transaction-processing-and-control.html\nDECLARE\n  daily_order_total    NUMBER(12,2);\n  weekly_order_total   NUMBER(12,2); \n  monthly_order_total  NUMBER(12,2);\nBEGIN\n   COMMIT; -- end previous transaction\n   SET TRANSACTION READ ONLY NAME 'Calculate Order Totals';\n\n   SELECT SUM (order_total)\n   INTO daily_order_total\n   FROM orders\n   WHERE order_date = SYSDATE;\n\n   SELECT SUM (order_total)\n   INTO weekly_order_total\n   FROM orders\n   WHERE order_date = SYSDATE - 7;\n\n   SELECT SUM (order_total)\n   INTO monthly_order_total\n   FROM orders\n   WHERE order_date = SYSDATE - 30;\n\n   COMMIT; -- ends read-only transaction\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/transaction-processing-and-control-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/transaction-processing-and-control.html\nDROP TABLE emp;\nCREATE TABLE emp AS SELECT * FROM employees;\nDECLARE\n  CURSOR c1 IS\n    SELECT * FROM emp\n    FOR UPDATE OF salary\n    ORDER BY employee_id;\n\n  emp_rec  emp%ROWTYPE;\nBEGIN\n  OPEN c1;\n  LOOP\n    FETCH c1 INTO emp_rec;  -- fails on second iteration\n    EXIT WHEN c1%NOTFOUND;\n    DBMS_OUTPUT.PUT_LINE (\n      'emp_rec.employee_id = ' ||\n      TO_CHAR(emp_rec.employee_id)\n    );\n\n    UPDATE emp\n    SET salary = salary * 1.05\n    WHERE employee_id = 105;\n\n    COMMIT;  -- releases locks\n  END LOOP;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/trigger-design-guidelines-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/trigger-design-guidelines.html\nSELECT Username FROM USER_USERS;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/trigger-design-guidelines-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/trigger-design-guidelines.html\nCREATE OR REPLACE TRIGGER my_trigger\n  AFTER CREATE ON DATABASE\nBEGIN\n  NULL;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/trigger-restrictions-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/trigger-restrictions.html\nDROP TABLE log;\nCREATE TABLE log (\n  emp_id  NUMBER(6),\n  l_name  VARCHAR2(25),\n  f_name  VARCHAR2(20)\n);\nCREATE OR REPLACE TRIGGER log_deletions\n  AFTER DELETE ON employees\n  FOR EACH ROW\nDECLARE\n  n INTEGER;\nBEGIN\n  INSERT INTO log VALUES (\n    :OLD.employee_id,\n    :OLD.last_name,\n    :OLD.first_name\n  );\n\n  SELECT COUNT(*) INTO n FROM employees;\n  DBMS_OUTPUT.PUT_LINE('There are now ' || n || ' employees.');\nEND;\n/\nDELETE FROM employees WHERE employee_id = 197;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/trigger-restrictions-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/trigger-restrictions.html\nUPDATE p SET p1 = p1+1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/trigger-restrictions-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/trigger-restrictions.html\nSELECT * FROM p ORDER BY p1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/trigger-restrictions-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/trigger-restrictions.html\nSELECT * FROM f ORDER BY f1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/trigger-restrictions-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/trigger-restrictions.html\nSELECT count(*) FROM log;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/trigger-restrictions-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/trigger-restrictions.html\nSELECT employee_id, last_name FROM employees WHERE employee_id = 197;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/trigger-restrictions-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/trigger-restrictions.html\nDROP TABLE p;\nCREATE TABLE p (p1 NUMBER CONSTRAINT pk_p_p1 PRIMARY KEY);\nINSERT INTO p VALUES (1);\nINSERT INTO p VALUES (2);\nINSERT INTO p VALUES (3);\nDROP TABLE f;\nCREATE TABLE f (f1 NUMBER CONSTRAINT fk_f_f1 REFERENCES p);\nINSERT INTO f VALUES (1);\nINSERT INTO f VALUES (2);\nINSERT INTO f VALUES (3);\nCREATE TRIGGER pt\n  AFTER UPDATE ON p\n  FOR EACH ROW\nBEGIN\n  UPDATE f SET f1 = :NEW.p1 WHERE f1 = :OLD.p1;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/trigger-restrictions-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/trigger-restrictions.html\nSELECT * FROM p ORDER BY p1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/trigger-restrictions-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/trigger-restrictions.html\nSELECT * FROM f ORDER BY f1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/triggers-publishing-events-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/triggers-publishing-events.html\nTYPE ora_name_list_t IS TABLE OF VARCHAR2(2*(ORA_MAX_NAME_LEN+2)+1);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/triggers-publishing-events-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/triggers-publishing-events.html\nDECLARE\n  name_list ora_name_list_t;\n  number_modified PLS_INTEGER;\nBEGIN\n  IF (ora_sysevent='ASSOCIATE STATISTICS') THEN\n    number_modified :=\n     ora_dict_obj_name_list(name_list);\n  END IF;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/triggers-publishing-events-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/triggers-publishing-events.html\nINSERT INTO event_table\nVALUES ('object owner is' || \n        ora_dict_obj_owner);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/triggers-publishing-events-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/triggers-publishing-events.html\nDECLARE\n  owner_list ora_name_list_t;\n  number_modified PLS_INTEGER;\nBEGIN\n  IF (ora_sysevent='ASSOCIATE STATISTICS') THEN\n    number_modified :=\n      ora_dict_obj_name_list(owner_list);\n  END IF;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/triggers-publishing-events-16.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/triggers-publishing-events.html\nINSERT INTO event_table\nVALUES ('This object is a ' || \n        ora_dict_obj_type);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/triggers-publishing-events-18.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/triggers-publishing-events.html\nDECLARE\n  user_list ora_name_list_t;\n  number_of_grantees PLS_INTEGER;\nBEGIN\n  IF (ora_sysevent = 'GRANT') THEN\n    number_of_grantees := \n     ora_grantee(user_list);\n  END IF;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/triggers-publishing-events-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/triggers-publishing-events.html\nDECLARE\n  v_addr VARCHAR2(11);\nBEGIN\n  IF (ora_sysevent = 'LOGON') THEN\n    v_addr := ora_client_ip_address;\n  END IF;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/triggers-publishing-events-20.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/triggers-publishing-events.html\n  INSERT INTO event_table VALUES ('1');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/triggers-publishing-events-24.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/triggers-publishing-events.html\n    INSERT INTO event_table\n    VALUES ('A nested table is created');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/triggers-publishing-events-28.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/triggers-publishing-events.html\n  INSERT INTO event_table\n  VALUES ('Server error!!');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/triggers-publishing-events-30.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/triggers-publishing-events.html\nSELECT ora_login_user FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/triggers-publishing-events-34.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/triggers-publishing-events.html\nDECLARE\n  privilege_list ora_name_list_t;\n  number_of_privileges PLS_INTEGER;\nBEGIN\n  IF (ora_sysevent = 'GRANT' OR\n      ora_sysevent = 'REVOKE') THEN\n    number_of_privileges :=\n      ora_privilege_list(privilege_list);\n  END IF;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/triggers-publishing-events-36.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/triggers-publishing-events.html\nDECLARE\n  user_list ora_name_list_t;\n  number_of_users PLS_INTEGER;\nBEGIN\n  IF (ora_sysevent = 'REVOKE') THEN\n    number_of_users := ora_revokee(user_list);\n  END IF;\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/triggers-publishing-events-38.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/triggers-publishing-events.html\nINSERT INTO event_table\nVALUES ('top stack error ' || \n        ora_server_error(1));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/triggers-publishing-events-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/triggers-publishing-events.html\nDECLARE\n  v_db_name VARCHAR2(50);\nBEGIN\n  v_db_name := ora_database_name;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/triggers-publishing-events-42.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/triggers-publishing-events.html\nINSERT INTO event_table\nVALUES ('top stack error message' ||\n        ora_server_error_msg(1));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/triggers-publishing-events-48.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/triggers-publishing-events.html\nCREATE TABLE event_table (col VARCHAR2(2030));\nDECLARE\n  sql_text ora_name_list_t;\n  n PLS_INTEGER;\n  v_stmt VARCHAR2(2000);\nBEGIN\n  n := ora_sql_txt(sql_text);\n\n  FOR i IN 1..n LOOP\n    v_stmt := v_stmt || sql_text(i);\n  END LOOP;\n\n  INSERT INTO event_table VALUES ('text of\n    triggering statement: ' || v_stmt);\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/triggers-publishing-events-50.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/triggers-publishing-events.html\nINSERT INTO event_table\nVALUES (ora_sysevent);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/triggers-publishing-events-52.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/triggers-publishing-events.html\n    INSERT INTO event_table \n    VALUES ('with grant option');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/triggers-publishing-events-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/triggers-publishing-events.html\n  INSERT INTO event_table\n  VALUES (ora_des_encrypted_password);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/triggers-publishing-events-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/triggers-publishing-events.html\nINSERT INTO event_table \nVALUES ('Changed object is ' ||\n        ora_dict_obj_name);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/updating-rows-records-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/updating-rows-records.html\nDECLARE\n  default_week  schedule%ROWTYPE;\nBEGIN\n  default_week.Mon := 'Day Off';\n  default_week.Tue := '0900-1800';\n  default_week.Wed := '0900-1800';\n  default_week.Thu := '0900-1800';\n  default_week.Fri := '0900-1800';\n  default_week.Sat := '0900-1800';\n  default_week.Sun := 'Day Off';\n\n  FOR i IN 1..3 LOOP\n    default_week.week    := i;\n\n    UPDATE schedule\n    SET ROW = default_week\n    WHERE week = i;\n  END LOOP;\nEND;\n/\nSELECT * FROM schedule;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/user-defined-pl-sql-subtypes-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/user-defined-pl-sql-subtypes.html\nDECLARE\n  SUBTYPE Balance IS NUMBER;\n\n  checking_account        Balance(6,2);\n  savings_account         Balance(8,2);\n  certificate_of_deposit  Balance(8,2);\n  max_insured  CONSTANT   Balance(8,2) := 250000.00;\n\n  SUBTYPE Counter IS NATURAL;\n\n  accounts     Counter := 1;\n  deposits     Counter := 0;\n  withdrawals  Counter := 0;\n  overdrafts   Counter := 0;\n\n  PROCEDURE deposit (\n    account  IN OUT Balance,\n    amount   IN     Balance\n  ) IS\n  BEGIN\n    account  := account + amount;\n    deposits := deposits + 1;\n  END;\n\nBEGIN\n  NULL;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/user-defined-pl-sql-subtypes-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/user-defined-pl-sql-subtypes.html\nDECLARE\n  SUBTYPE Balance IS NUMBER(8,2);\n\n  checking_account  Balance;\n  savings_account   Balance;\n\nBEGIN\n  checking_account := 2000.00;\n  savings_account  := 1000000.00;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/user-defined-pl-sql-subtypes-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/user-defined-pl-sql-subtypes.html\nDECLARE\n  SUBTYPE Digit        IS PLS_INTEGER RANGE 0..9;\n  SUBTYPE Double_digit IS PLS_INTEGER RANGE 10..99;\n  SUBTYPE Under_100    IS PLS_INTEGER RANGE 0..99;\n\n  d   Digit        :=  4;\n  dd  Double_digit := 35;\n  u   Under_100;\nBEGIN\n  u := d;   -- Succeeds; Under_100 range includes Digit range\n  u := dd;  -- Succeeds; Under_100 range includes Double_digit range\n  dd := d;  -- Raises error; Double_digit range does not include Digit range\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/user-defined-pl-sql-subtypes-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/user-defined-pl-sql-subtypes.html\nDECLARE\n  SUBTYPE Word IS CHAR(6);\n  SUBTYPE Text IS VARCHAR2(15);\n\n  verb       Word := 'run';\n  sentence1  Text;\n  sentence2  Text := 'Hurry!';\n  sentence3  Text := 'See Tom run.';\n\nBEGIN\n  sentence1 := verb;  -- 3-character value, 15-character limit\n  verb := sentence2;  -- 6-character value, 6-character limit\n  verb := sentence3;  -- 12-character value, 6-character limit\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/views-information-triggers-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/views-information-triggers.html\nCREATE OR REPLACE TRIGGER Emp_count\n  AFTER DELETE ON employees\nDECLARE\n  n  INTEGER;\nBEGIN\n  SELECT COUNT(*) INTO n FROM employees;\n  DBMS_OUTPUT.PUT_LINE('There are now ' || n || ' employees.');\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/views-information-triggers-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/views-information-triggers.html\nCOLUMN Trigger_type FORMAT A15\n\nCOLUMN Triggering_event FORMAT A16\n\nCOLUMN Table_name FORMAT A11\n\nCOLUMN Trigger_body FORMAT A50\n\nSET LONG 9999"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/views-information-triggers-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/views-information-triggers.html\nSELECT Trigger_type, Triggering_event, Table_name\nFROM USER_TRIGGERS\nWHERE Trigger_name = 'EMP_COUNT';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/views-information-triggers-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/views-information-triggers.html\nSELECT Trigger_body\nFROM USER_TRIGGERS\nWHERE Trigger_name = 'EMP_COUNT';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/views-information-triggers-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/views-information-triggers.html\nDECLARE\n  n  INTEGER;\nBEGIN\n  SELECT COUNT(*) INTO n FROM employees;\n  DBMS_OUTPUT.PUT_LINE('There are now ' || n || '\nemployees.');\nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/what-is-capture-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/what-is-capture.html\nDROP TABLE tab1;\nCREATE TABLE tab1 (col1 NUMBER, col2 NUMBER);\nINSERT INTO tab1 (col1, col2) VALUES (100, 10);\nDROP TABLE tab2;\nCREATE TABLE tab2 (col1 NUMBER);\nINSERT INTO tab2 (col1) VALUES (100);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/what-is-capture-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/what-is-capture.html\nCREATE OR REPLACE PROCEDURE proc AUTHID DEFINER AS\n  CURSOR c1 IS\n    SELECT * FROM tab1\n    WHERE EXISTS (SELECT * FROM tab2 WHERE col2 = 10);\nBEGIN\n  OPEN c1;\n  CLOSE c1;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/what-is-capture-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/what-is-capture.html\nALTER TABLE tab2 ADD (col2 NUMBER);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/wrapping-pl-sql-source-text-dbms_ddl-subprograms-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/wrapping-pl-sql-source-text-dbms_ddl-subprograms.html\nDECLARE\n  package_text  VARCHAR2(32767); -- text for creating package spec and body\n\n  FUNCTION generate_spec (pkgname VARCHAR2) RETURN VARCHAR2 AS\n  BEGIN\n    RETURN 'CREATE PACKAGE ' || pkgname || ' AUTHID CURRENT_USER AS\n      PROCEDURE raise_salary (emp_id NUMBER, amount NUMBER);\n      PROCEDURE fire_employee (emp_id NUMBER);\n      END ' || pkgname || ';';\n  END generate_spec;\n\n  FUNCTION generate_body (pkgname VARCHAR2) RETURN VARCHAR2 AS\n  BEGIN\n    RETURN 'CREATE PACKAGE BODY ' || pkgname || ' AS\n      PROCEDURE raise_salary (emp_id NUMBER, amount NUMBER) IS\n      BEGIN\n        UPDATE employees\n          SET salary = salary + amount WHERE employee_id = emp_id;\n      END raise_salary;\n      PROCEDURE fire_employee (emp_id NUMBER) IS\n      BEGIN\n        DELETE FROM employees WHERE employee_id = emp_id;\n      END fire_employee;\n    END ' || pkgname || ';';\n  END generate_body;\n\nBEGIN\n  package_text := generate_spec('emp_actions');  -- Generate package spec\n  EXECUTE IMMEDIATE package_text;                -- Create package spec\n  package_text := generate_body('emp_actions');  -- Generate package body\n  SYS.DBMS_DDL.CREATE_WRAPPED(package_text);     -- Create wrapped package body\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/wrapping-pl-sql-source-text-dbms_ddl-subprograms-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/wrapping-pl-sql-source-text-dbms_ddl-subprograms.html\nSELECT text FROM USER_SOURCE WHERE name = 'EMP_ACTIONS';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/wrapping-pl-sql-source-text-dbms_ddl-subprograms-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/wrapping-pl-sql-source-text-dbms_ddl-subprograms.html\nPROCEDURE raise_salary (emp_id NUMBER, amount NUMBER);\nPROCEDURE fire_employee (emp_id NUMBER);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/wrapping-pl-sql-source-text-dbms_ddl-subprograms-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/wrapping-pl-sql-source-text-dbms_ddl-subprograms.html\nDECLARE\n  s employees.salary%TYPE;\nBEGIN\n  SELECT salary INTO s FROM employees WHERE employee_id=130;\n  DBMS_OUTPUT.PUT_LINE('Old salary: ' || s);\n  emp_actions.raise_salary(130, 100);\n  SELECT salary INTO s FROM employees WHERE employee_id=130;\n  DBMS_OUTPUT.PUT_LINE('New salary: ' || s);\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/wrapping-pl-sql-source-text-pl-sql-wrapper-utility-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/wrapping-pl-sql-source-text-pl-sql-wrapper-utility.html\nSELECT COUNT(*) FROM EMPLOYEES\n/\nCREATE PROCEDURE wraptest AUTHID CURRENT_USER /* C style comment in procedure declaration */ IS\n  TYPE emp_tab IS TABLE OF employees%ROWTYPE INDEX BY PLS_INTEGER;\n  all_emps  emp_tab;\nBEGIN\n  SELECT * BULK COLLECT INTO all_emps FROM employees;\n  FOR i IN 1..10 LOOP /* C style in pl/sql source */\n    DBMS_OUTPUT.PUT_LINE('Emp Id: ' || all_emps(i).employee_id);\n  END LOOP;\nEND;\n/\nCREATE OR REPLACE FUNCTION fibonacci (\n  n PLS_INTEGER\n) RETURN PLS_INTEGER\nAUTHID CURRENT_USER -- PL/SQL style comment inside fibonacci function spec\nIS\n  fib_1 PLS_INTEGER := 0;\n  fib_2 PLS_INTEGER := 1;\nBEGIN\n  IF n = 1 THEN                              -- terminating condition\n    RETURN fib_1;\n  ELSIF n = 2 THEN\n    RETURN fib_2;                           -- terminating condition\n  ELSE\n    RETURN fibonacci(n-2) + fibonacci(n-1);  -- recursive invocations\n  END IF;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/lnpls/wrapping-pl-sql-source-text-pl-sql-wrapper-utility-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/wrapping-pl-sql-source-text-pl-sql-wrapper-utility.html\nSELECT COUNT(*) FROM EMPLOYEES\n/\nCREATE OR REPLACE PROCEDURE wraptest wrapped \na000000\n1\nabcd\nabcd\nabcd\nabcd\nabcd\nabcd\nabcd\nabcd\nabcd\nabcd\nabcd\nabcd\nabcd\nabcd\nabcd\n7\n129 138\nqf4HggDBeNMPlWAsPn6pGf+2LGwwg+nwJK5qZ3SVWE4+GayDZaL1bF7RwYm2/zr1qjZY3FrN\n48M1bKc/MG5aY9YB+DrtT4SJN370Rpq7ck5D0sc1D5sKAwTyX13HYvRmjwkdXa0vEZ4q/mCU\nEQusX23UZbZjxha7CtlCDCx8guGw/M/oHZXc8wDHXL8V8OsqQMv/Hj7z68gINl7OstalRScr\nuSZ/l/W1YaaA9Lj8Fbx5/nJw96ZNy1SCY8VsB/G6O5f/65+EDxdThpnfU4e1vrrE9iB3/IpI\n+7fE1Tv29fwc+aZq3S7O\n\n/\nCREATE OR REPLACE FUNCTION fibonacci wrapped \na000000\n1\nabcd\nabcd\nabcd\nabcd\nabcd\nabcd\nabcd\nabcd\nabcd\nabcd\nabcd\nabcd\nabcd\nabcd\nabcd\n8\n150 ff\nBFDvTL9OR04SJbx+qOy5H/h8IcwwgxDcAJnWZ3TNz51mjAmegdQcpNJfq8hUuQtv1Y5xg7Wd\nKqMH/HBANhnZ+E1mBWekavYjPxlqV9zIFqZAgB4SBqkqe42sai9Vb0cLEU02/ZCEyxDSfWf3\nH1Lp6U9ztRXNy+oDZSNykWCUVLaZro0UmeFrNUBqzE6j9mI3AyRhPw1QbZX5oRMLgLOG3OtS\nSGJsz7M+bnhnp+xP4ww+SIlxx5LhDtnyPw==\n\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ABS-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ABS.html\nSELECT ABS(-15) \"Absolute\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ACOS-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ACOS.html\nSELECT ACOS(.3)\"Arc_Cosine\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ADD_MONTHS-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ADD_MONTHS.html\nSELECT TO_CHAR(ADD_MONTHS(hire_date, 1), 'DD-MON-YYYY') \"Next month\"\n  FROM employees \n  WHERE last_name = 'Baer';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ADMINISTER-KEY-MANAGEMENT-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ADMINISTER-KEY-MANAGEMENT.html\nADMINISTER KEY MANAGEMENT\n  SET KEYSTORE OPEN\n  IDENTIFIED BY \"user_id:password\";"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ADMINISTER-KEY-MANAGEMENT-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ADMINISTER-KEY-MANAGEMENT.html\nADMINISTER KEY MANAGEMENT\n  SET KEYSTORE OPEN\n  IDENTIFIED BY EXTERNAL STORE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ADMINISTER-KEY-MANAGEMENT-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ADMINISTER-KEY-MANAGEMENT.html\nADMINISTER KEY MANAGEMENT\n  SET KEYSTORE CLOSE\n  IDENTIFIED BY password;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ADMINISTER-KEY-MANAGEMENT-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ADMINISTER-KEY-MANAGEMENT.html\nADMINISTER KEY MANAGEMENT\n  SET KEYSTORE CLOSE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ADMINISTER-KEY-MANAGEMENT-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ADMINISTER-KEY-MANAGEMENT.html\nADMINISTER KEY MANAGEMENT\n  SET KEYSTORE CLOSE\n  IDENTIFIED BY \"user_id:password\";"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ADMINISTER-KEY-MANAGEMENT-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ADMINISTER-KEY-MANAGEMENT.html\nADMINISTER KEY MANAGEMENT\n  SET KEYSTORE CLOSE\n  IDENTIFIED BY EXTERNAL STORE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ADMINISTER-KEY-MANAGEMENT-16.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ADMINISTER-KEY-MANAGEMENT.html\nADMINISTER KEY MANAGEMENT\n  BACKUP KEYSTORE USING 'hr.emp_keystore'\n  IDENTIFIED BY password\n  TO '/etc/ORACLE/KEYSTORE/DB1/';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ADMINISTER-KEY-MANAGEMENT-17.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ADMINISTER-KEY-MANAGEMENT.html\nADMINISTER KEY MANAGEMENT\n  ALTER KEYSTORE PASSWORD IDENTIFIED BY old_password\n  SET new_password WITH BACKUP USING 'pwd_change';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ADMINISTER-KEY-MANAGEMENT-18.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ADMINISTER-KEY-MANAGEMENT.html\nADMINISTER KEY MANAGEMENT\n  MERGE KEYSTORE '/etc/ORACLE/KEYSTORE/DB1'\n  AND KEYSTORE '/etc/ORACLE/KEYSTORE/DB2'\n    IDENTIFIED BY existing_keystore_password\n  INTO NEW KEYSTORE '/etc/ORACLE/KEYSTORE/DB3'\n    IDENTIFIED BY new_keystore_password;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ADMINISTER-KEY-MANAGEMENT-19.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ADMINISTER-KEY-MANAGEMENT.html\nADMINISTER KEY MANAGEMENT\n  MERGE KEYSTORE '/etc/ORACLE/KEYSTORE/DB1'\n  INTO EXISTING KEYSTORE '/etc/ORACLE/KEYSTORE/DB2'\n    IDENTIFIED BY existing_keystore_password\n  WITH BACKUP;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ADMINISTER-KEY-MANAGEMENT-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ADMINISTER-KEY-MANAGEMENT.html\nSELECT KEY_ID FROM V$ENCRYPTION_KEYS WHERE TAG LIKE 'mytag%'"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ADMINISTER-KEY-MANAGEMENT-20.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ADMINISTER-KEY-MANAGEMENT.html\nADMINISTER KEY MANAGEMENT\n  SET KEY USING ALGORITHM 'SEED128'\n  IDENTIFIED BY password\n  WITH BACKUP;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ADMINISTER-KEY-MANAGEMENT-21.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ADMINISTER-KEY-MANAGEMENT.html\nADMINISTER KEY MANAGEMENT\n  CREATE KEY USING TAG 'mykey1'\n  IDENTIFIED BY password\n  WITH BACKUP;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ADMINISTER-KEY-MANAGEMENT-22.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ADMINISTER-KEY-MANAGEMENT.html\nSELECT TAG, KEY_ID\n  FROM V$ENCRYPTION_KEYS\n  WHERE TAG = 'mykey1';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ADMINISTER-KEY-MANAGEMENT-23.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ADMINISTER-KEY-MANAGEMENT.html\nADMINISTER KEY MANAGEMENT\n  USE KEY 'ARgEtzPxpE/Nv8WdPu8LJJUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'\n  IDENTIFIED BY password\n  WITH BACKUP;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ADMINISTER-KEY-MANAGEMENT-24.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ADMINISTER-KEY-MANAGEMENT.html\nADMINISTER KEY MANAGEMENT\n  SET TAG 'mykey2' FOR 'ARgEtzPxpE/Nv8WdPu8LJJUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'\n  FORCE KEYSTORE\n  IDENTIFIED BY password\n  WITH BACKUP;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ADMINISTER-KEY-MANAGEMENT-25.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ADMINISTER-KEY-MANAGEMENT.html\nADMINISTER KEY MANAGEMENT\n  EXPORT KEYS WITH SECRET \"my_secret\"\n  TO '/etc/TDE/export.exp'\n  IDENTIFIED BY password\n  WITH IDENTIFIER IN 'AdoxnJ0uH08cv7xkz83ovwsAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',\n                     'AW5z3CoyKE/yv3cNT5CWCXUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ADMINISTER-KEY-MANAGEMENT-26.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ADMINISTER-KEY-MANAGEMENT.html\nADMINISTER KEY MANAGEMENT\n  EXPORT KEYS WITH SECRET \"my_secret\"\n  TO '/etc/TDE/export.exp'\n  IDENTIFIED BY password\n  WITH IDENTIFIER IN\n    (SELECT KEY_ID FROM V$ENCRYPTION_KEYS WHERE TAG IN ('mytag1', 'mytag2'));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ADMINISTER-KEY-MANAGEMENT-27.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ADMINISTER-KEY-MANAGEMENT.html\nADMINISTER KEY MANAGEMENT\n  EXPORT KEYS WITH SECRET \"my_secret\"\n  TO '/etc/TDE/export.exp'\n  IDENTIFIED BY password;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ADMINISTER-KEY-MANAGEMENT-28.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ADMINISTER-KEY-MANAGEMENT.html\nALTER SESSION SET CONTAINER = salespdb;\nADMINISTER KEY MANAGEMENT\n  EXPORT KEYS WITH SECRET \"my_secret\"\n  TO '/etc/TDE/salespdb.exp'\n  IDENTIFIED BY password;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ADMINISTER-KEY-MANAGEMENT-29.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ADMINISTER-KEY-MANAGEMENT.html\nADMINISTER KEY MANAGEMENT\n  IMPORT KEYS WITH SECRET \"my_secret\"\n  FROM '/etc/TDE/export.exp'\n  IDENTIFIED BY password\n  WITH BACKUP;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ADMINISTER-KEY-MANAGEMENT-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ADMINISTER-KEY-MANAGEMENT.html\nADMINISTER KEY MANAGEMENT\n  USE ENCRYPTION KEY '0673C1262AA1D04F14BF26D720480C55B2'\n  IDENTIFIED BY \"external_keystore_password\"\n  MIGRATE USING software_keystore_password;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ADMINISTER-KEY-MANAGEMENT-30.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ADMINISTER-KEY-MANAGEMENT.html\nADMINISTER KEY MANAGEMENT\n  SET ENCRYPTION KEY IDENTIFIED BY \"user_id:password\"\n  MIGRATE USING software_keystore_password\n  WITH BACKUP;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ADMINISTER-KEY-MANAGEMENT-31.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ADMINISTER-KEY-MANAGEMENT.html\nADMINISTER KEY MANAGEMENT\n  SET ENCRYPTION KEY IDENTIFIED BY software_keystore_password\n  REVERSE MIGRATE USING \"user_id:password\";"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ADMINISTER-KEY-MANAGEMENT-32.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ADMINISTER-KEY-MANAGEMENT.html\nADMINISTER KEY MANAGEMENT\n  ADD SECRET 'secret1' FOR CLIENT 'client1'\n  USING TAG 'My first secret'\n  IDENTIFIED BY password\n  WITH BACKUP;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ADMINISTER-KEY-MANAGEMENT-33.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ADMINISTER-KEY-MANAGEMENT.html\nADMINISTER KEY MANAGEMENT\n  ADD SECRET 'secret2' FOR CLIENT 'client2'\n  USING TAG 'My second secret'\n  IDENTIFIED BY \"user_id:password\";"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ADMINISTER-KEY-MANAGEMENT-34.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ADMINISTER-KEY-MANAGEMENT.html\nADMINISTER KEY MANAGEMENT\n  UPDATE SECRET 'secret1' FOR CLIENT 'client1'\n  USING TAG 'New Tag 1'\n  IDENTIFIED BY password\n  WITH BACKUP;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ADMINISTER-KEY-MANAGEMENT-35.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ADMINISTER-KEY-MANAGEMENT.html\nADMINISTER KEY MANAGEMENT\n  UPDATE SECRET 'secret2' FOR CLIENT 'client2'\n  USING TAG 'New Tag 2'\n  IDENTIFIED BY \"user_id:password\";"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ADMINISTER-KEY-MANAGEMENT-36.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ADMINISTER-KEY-MANAGEMENT.html\nADMINISTER KEY MANAGEMENT\n  DELETE SECRET FOR CLIENT 'client1'\n  IDENTIFIED BY password\n  WITH BACKUP;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ADMINISTER-KEY-MANAGEMENT-37.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ADMINISTER-KEY-MANAGEMENT.html\nADMINISTER KEY MANAGEMENT\n  DELETE SECRET FOR CLIENT 'client2'\n  IDENTIFIED BY \"user_id:password\";"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ADMINISTER-KEY-MANAGEMENT-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ADMINISTER-KEY-MANAGEMENT.html\nADMINISTER KEY MANAGEMENT\n  CREATE KEYSTORE '/etc/ORACLE/WALLETS/orcl'\n  IDENTIFIED BY password;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ADMINISTER-KEY-MANAGEMENT-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ADMINISTER-KEY-MANAGEMENT.html\nADMINISTER KEY MANAGEMENT\n  CREATE AUTO_LOGIN KEYSTORE FROM KEYSTORE '/etc/ORACLE/WALLETS/orcl'\n  IDENTIFIED BY password;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ADMINISTER-KEY-MANAGEMENT-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ADMINISTER-KEY-MANAGEMENT.html\nADMINISTER KEY MANAGEMENT\n  SET KEYSTORE OPEN\n  IDENTIFIED BY password;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ADMINISTER-KEY-MANAGEMENT-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ADMINISTER-KEY-MANAGEMENT.html\nADMINISTER KEY MANAGEMENT\n  SET KEYSTORE OPEN\n  IDENTIFIED BY password\n  CONTAINER = CURRENT;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-ANALYTIC-VIEW-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-ANALYTIC-VIEW.html\nALTER ANALYTIC VIEW sales_av RENAME TO mysales_av;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-ANALYTIC-VIEW-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-ANALYTIC-VIEW.html\nALTER ANALYTIC VIEW TKHCSGL308_UNITS_AVIEW_CACHE ADD CACHE\n    MEASURE GROUP (sales, units, cost)\n    LEVELS (TIME.FISCAL.FISCAL_QUARTER, WAREHOUSE);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing.html\nALTER AUDIT POLICY hr_audit_policy ADD ONLY TOPLEVEL"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing.html\nALTER AUDIT POLICY hr_audit_policy DROP ONLY TOPLEVEL"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing.html\nALTER AUDIT POLICY dp_actions_pol\n  ADD ACTIONS COMPONENT = datapump EXPORT\n  DROP ACTIONS COMPONENT = datapump IMPORT;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing.html\nALTER AUDIT POLICY order_updates_pol\n  CONDITION DROP;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing.html\nALTER AUDIT POLICY emp_updates_pol\n  CONDITION 'UID = 102'\n  EVALUATE PER STATEMENT;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing.html\nCREATE AUDIT POLICY employee_audit_policy ACTIONS SELECT(sal) on scott.emp;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing.html\nALTER AUDIT POLICY employee_audit_policy ACTIONS ADD INSERT(dname) on scott.dept;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing.html\nALTER AUDIT POLICY dml_pol\n  ADD PRIVILEGES CREATE ANY TABLE, DROP ANY TABLE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing.html\nALTER AUDIT POLICY java_pol\n  ADD ACTIONS CREATE JAVA, ALTER JAVA, DROP JAVA;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing.html\nALTER AUDIT POLICY table_pol\n  ADD ROLES dba;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing.html\nALTER AUDIT POLICY security_pol\n  ADD PRIVILEGES CREATE ANY LIBRARY, DROP ANY LIBRARY\n      ACTIONS DELETE on hr.employees,\n              INSERT on hr.employees,\n              UPDATE on hr.employees,\n              ALL on hr.departments\n      ROLES dba, connect;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing.html\nALTER AUDIT POLICY table_pol\n  DROP PRIVILEGES CREATE ANY TABLE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing.html\nALTER AUDIT POLICY dml_pol\n  DROP ACTIONS INSERT on hr.employees,\n               UPDATE on hr.employees;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing.html\nALTER AUDIT POLICY java_pol\n  DROP ROLES java_deploy;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-AUDIT-POLICY-Unified-Auditing.html\nALTER AUDIT POLICY hr_admin_pol\n  DROP PRIVILEGES CREATE ANY TABLE\n       ACTIONS LOCK TABLE\n       ROLES audit_viewer;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-CLUSTER-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-CLUSTER.html\nALTER CLUSTER personnel\n   SIZE 1024 CACHE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-CLUSTER-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-CLUSTER.html\nALTER CLUSTER language \n   DEALLOCATE UNUSED KEEP 30 K;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-CLUSTER-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-CLUSTER.html\nCREATE CLUSTER EMP_DEPT (DEPTNO NUMBER(3))   \n   SIZE 600   \n   TABLESPACE USERS   \n   STORAGE (INITIAL 200K   \n      NEXT 300K   \n      MINEXTENTS 2   \n      PCTINCREASE 33);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-CLUSTER-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-CLUSTER.html\nSELECT CLUSTER_NAME, TABLESPACE_NAME, KEY_SIZE, CLUSTER_TYPE, AVG_BLOCKS_PER_KEY, MIN_EXTENTS, MAX_EXTENTS FROM USER_CLUSTERS;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-CLUSTER-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-CLUSTER.html\nALTER CLUSTER EMP_DEPT SIZE 1024;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-CLUSTER-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-CLUSTER.html\nSELECT CLUSTER_NAME, TABLESPACE_NAME, KEY_SIZE, CLUSTER_TYPE, AVG_BLOCKS_PER_KEY, MIN_EXTENTS, MAX_EXTENTS FROM USER_CLUSTERS;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-CLUSTER-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-CLUSTER.html\nALTER CLUSTER EMP_DEPT DEALLOCATE UNUSED KEEP 30 K;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-CLUSTER-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-CLUSTER.html\nSELECT CLUSTER_NAME, TABLESPACE_NAME, KEY_SIZE, CLUSTER_TYPE, AVG_BLOCKS_PER_KEY, MIN_EXTENTS, MAX_EXTENTS FROM USER_CLUSTERS;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DATABASE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DATABASE.html\nSELECT PROPERTY_VALUE FROM DATABASE_PROPERTIES \n  WHERE PROPERTY_NAME = 'DEFAULT_EDITION';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DATABASE-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DATABASE.html\nALTER DATABASE db_name PREPARE MIRROR COPY mirror_name WITH HIGH REDUNDANCY"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DATABASE-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DATABASE.html\nALTER DATABASE\n  ADD LOGFILE GROUP 3 \n    ('diska:log3.log' ,  \n     'diskb:log3.log') SIZE 50K;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DATABASE-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DATABASE.html\nALTER DATABASE  \n    ADD LOGFILE THREAD 5 GROUP 4  \n        ('diska:log4.log', \n         'diskb:log4:log');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DATABASE-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DATABASE.html\nALTER DATABASE   \n   ADD LOGFILE MEMBER 'diskc:log3.log'  \n   TO GROUP 3;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DATABASE-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DATABASE.html\nALTER DATABASE\n    DROP LOGFILE MEMBER 'diskb:log3.log';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DATABASE-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DATABASE.html\nALTER DATABASE DROP LOGFILE GROUP 3;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DATABASE-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DATABASE.html\nALTER DATABASE   \n    RENAME FILE 'diskc:log3.log' TO 'diskb:log3.log';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DATABASE-16.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DATABASE.html\nALTER DATABASE\n    SET DEFAULT BIGFILE TABLESPACE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DATABASE-17.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DATABASE.html\nALTER DATABASE \n   DEFAULT TEMPORARY TABLESPACE tbs_05;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DATABASE-18.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DATABASE.html\nALTER DATABASE\n   DEFAULT TEMPORARY TABLESPACE tbs_grp_01;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DATABASE-19.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DATABASE.html\nALTER DATABASE \n    CREATE DATAFILE 'tbs_f03.dbf' \n                 AS 'tbs_f04.dbf';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DATABASE-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DATABASE.html\nALTER DATABASE DATAFILE td_file.df ENABLE LOST WRITE PROTECTION"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DATABASE-20.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DATABASE.html\nALTER DATABASE TEMPFILE 'temp02.dbf' OFFLINE;\nALTER DATABASE RENAME FILE 'temp02.dbf' TO 'temp03.dbf';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DATABASE-21.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DATABASE.html\nALTER DATABASE  \n    RENAME GLOBAL_NAME TO demo.world.example.com;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DATABASE-22.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DATABASE.html\nALTER DATABASE\n  ENABLE BLOCK CHANGE TRACKING\n    USING FILE 'tracking_file' REUSE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DATABASE-23.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DATABASE.html\nALTER DATABASE\n  DISABLE BLOCK CHANGE TRACKING;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DATABASE-24.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DATABASE.html\nALTER DATABASE  \n    DATAFILE 'diskb:tbs_f5.dbf' RESIZE 10 M;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DATABASE-25.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DATABASE.html\nALTER DATABASE  \n    CLEAR LOGFILE 'diskc:log3.log';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DATABASE-26.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DATABASE.html\nALTER DATABASE \n  RECOVER AUTOMATIC DATABASE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DATABASE-27.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DATABASE.html\nALTER DATABASE \n    RECOVER LOGFILE 'diskc:log3.log';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DATABASE-28.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DATABASE.html\nALTER DATABASE \n    RECOVER AUTOMATIC UNTIL TIME '2001-10-27:14:00:00';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DATABASE-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DATABASE.html\nALTER DATABASE DATAFILE td_file.df REMOVE LOST WRITE PROTECTION"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DATABASE-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DATABASE.html\nALTER DATABASE DATAFILE td_file.df SUSPEND LOST WRITE PROTECTION"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DATABASE-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DATABASE.html\nALTER DATABASE ENABLE LOST WRITE PROTECTION"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DATABASE-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DATABASE.html\nALTER DATABASE DISABLE LOST WRITE PROTECTION"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DATABASE-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DATABASE.html\nALTER DATABASE OPEN READ ONLY;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DATABASE-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DATABASE.html\nALTER DATABASE OPEN READ WRITE RESETLOGS;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DATABASE-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DATABASE.html\nALTER DATABASE\n   RECOVER TABLESPACE tbs_03\n   PARALLEL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DATABASE-LINK-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DATABASE-LINK.html\nALTER DATABASE LINK private_link \n  CONNECT TO hr IDENTIFIED BY hr_new_password;\nALTER PUBLIC DATABASE LINK public_link\n  CONNECT TO scott IDENTIFIED BY scott_new_password;\nALTER SHARED PUBLIC DATABASE LINK shared_pub_link\n  CONNECT TO scott IDENTIFIED BY scott_new_password\n  AUTHENTICATED BY hr IDENTIFIED BY hr_new_password;\nALTER SHARED DATABASE LINK shared_pub_link\n  CONNECT TO scott IDENTIFIED BY scott_new_password;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DIMENSION-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DIMENSION.html\nALTER DIMENSION customers_dim\n   DROP ATTRIBUTE country;\nALTER DIMENSION customers_dim\n   ADD LEVEL zone IS customers.cust_postal_code\n   ADD ATTRIBUTE zone DETERMINES (cust_city);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DISKGROUP-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DISKGROUP.html\nALTER DISKGROUP hmdg ADD FILEGROUP fgtem TEMPLATE SET 'datafile.redundancy'='unprotected'\n    ALTER DISKGROUP hmdg ADD FILEGROUP fgdb DATABASE NONE FROM TEMPLATE fgtem"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DISKGROUP-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DISKGROUP.html\nALTER DISKGROUP dgroup_01\n  MODIFY TEMPLATE template_01\n    ATTRIBUTES (FINE);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DISKGROUP-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DISKGROUP.html\nALTER DISKGROUP dgroup_01\n  DROP TEMPLATE template_01;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DISKGROUP-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DISKGROUP.html\nALTER DISKGROUP dgroup_01\n  ADD DIRECTORY '+dgroup_01/alias_dir';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DISKGROUP-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DISKGROUP.html\nALTER DISKGROUP dgroup_01\n  ADD ALIAS '+dgroup_01/alias_dir/datafile.dbf'\n    FOR '+dgroup_01.261.1';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DISKGROUP-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DISKGROUP.html\nALTER DISKGROUP dgroup_01\n  SCRUB REPAIR WAIT;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DISKGROUP-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DISKGROUP.html\nALTER DISKGROUP dgroup_01\n  DISMOUNT FORCE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DISKGROUP-16.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DISKGROUP.html\nALTER DISKGROUP dgroup_01\n  MOUNT;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DISKGROUP-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DISKGROUP.html\nALTER DISKGROUP hmdg ADD FILEGROUP fgtem2 TEMPLATE \n    CREATE TABLESPACE tbs1 datafile '+hmdg(fg$fgtem2)/dbs/tbs1.f' size 1M"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DISKGROUP-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DISKGROUP.html\nALTER DISKGROUP dgroup_01\n  ADD DISK '/devices/disks/d100';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DISKGROUP-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DISKGROUP.html\nALTER DISKGROUP dgroup_01\n  DROP DISK dgroup_01_0000;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DISKGROUP-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DISKGROUP.html\nALTER DISKGROUP dgroup_01\n  UNDROP DISKS;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DISKGROUP-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DISKGROUP.html\nALTER DISKGROUP dgroup_01\n  RESIZE ALL\n  SIZE 36G;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DISKGROUP-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DISKGROUP.html\nALTER DISKGROUP dgroup_01\n  REBALANCE POWER 11 WAIT;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DISKGROUP-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DISKGROUP.html\nALTER DISKGROUP dgroup_01\n  CHECK ALL\n  REPAIR;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-DISKGROUP-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-DISKGROUP.html\nALTER DISKGROUP dgroup_01\n  ADD TEMPLATE template_01\n    ATTRIBUTES (UNPROTECTED COARSE);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-HIERARCHY-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-HIERARCHY.html\nALTER HIERARCHY product_hier RENAME TO myproduct_hier;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-INDEX-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-INDEX.html\nALTER INDEX ord_customer_ix REBUILD REVERSE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-INDEX-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-INDEX.html\nALTER INDEX ord_customer_ix REBUILD PARALLEL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-INDEX-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-INDEX.html\nALTER INDEX cost_ix\n   SPLIT PARTITION p2 AT (1500) \n   INTO ( PARTITION p2a TABLESPACE tbs_01 LOGGING,\n          PARTITION p2b TABLESPACE tbs_02);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-INDEX-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-INDEX.html\nALTER INDEX cost_ix\n   DROP PARTITION p1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-INDEX-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-INDEX.html\nALTER INDEX prod_idx\n      MODIFY DEFAULT ATTRIBUTES INITRANS 5;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-INDEX-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-INDEX.html\nALTER INDEX oe.cust_lname_ix  \n    INITRANS 5;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-INDEX-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-INDEX.html\nALTER INDEX upper_ix PARALLEL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-INDEX-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-INDEX.html\nALTER INDEX upper_ix RENAME TO upper_name_ix;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-INDEX-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-INDEX.html\nALTER INDEX cost_ix\n   MODIFY PARTITION p2 UNUSABLE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-INDEX-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-INDEX.html\nALTER INDEX cost_ix UNUSABLE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-INDEX-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-INDEX.html\nALTER INDEX cost_ix \n   REBUILD PARTITION p2;\nALTER INDEX cost_ix\n   REBUILD PARTITION p3 NOLOGGING;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-INDEX-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-INDEX.html\nALTER INDEX cost_ix MODIFY PARTITION p3\n   STORAGE(MAXEXTENTS 30) LOGGING;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-INDEX-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-INDEX.html\nALTER INDEX cost_ix\n   RENAME PARTITION p3 TO p3_Q3;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-INDEXTYPE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-INDEXTYPE.html\nALTER INDEXTYPE position_indextype COMPILE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-INMEMORY-JOIN-GROUP-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-INMEMORY-JOIN-GROUP.html\nALTER INMEMORY JOIN GROUP prod_id1\n  ADD(product_descriptions(product_id));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-INMEMORY-JOIN-GROUP-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-INMEMORY-JOIN-GROUP.html\nALTER INMEMORY JOIN GROUP prod_id1\n  REMOVE(product_descriptions(product_id));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-JAVA-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-JAVA.html\nALTER JAVA CLASS \"Agent\"\n   RESOLVER ((\"/usr/bin/bfile_dir/*\" pm)(* public))\n   RESOLVE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-LOCKDOWN-PROFILE-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-LOCKDOWN-PROFILE.html\nALTER LOCKDOWN PROFILE hr_prof\n  DISABLE OPTION = ('DATABASE QUEUING');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-LOCKDOWN-PROFILE-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-LOCKDOWN-PROFILE.html\nALTER LOCKDOWN PROFILE hr_prof\n  DISABLE OPTION = ('PARTITIONING');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-LOCKDOWN-PROFILE-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-LOCKDOWN-PROFILE.html\nALTER LOCKDOWN PROFILE hr_prof\n  ENABLE OPTION = ('DATABASE QUEUING');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-LOCKDOWN-PROFILE-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-LOCKDOWN-PROFILE.html\nALTER LOCKDOWN PROFILE hr_prof\n  ENABLE OPTION ALL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-LOCKDOWN-PROFILE-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-LOCKDOWN-PROFILE.html\nALTER LOCKDOWN PROFILE hr_prof\n  DISABLE STATEMENT = ('ALTER DATABASE');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-LOCKDOWN-PROFILE-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-LOCKDOWN-PROFILE.html\nALTER LOCKDOWN PROFILE hr_prof\n  DISABLE STATEMENT = ('ALTER SYSTEM')\n          CLAUSE = ('SUSPEND', 'RESUME');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-LOCKDOWN-PROFILE-16.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-LOCKDOWN-PROFILE.html\nALTER LOCKDOWN PROFILE hr_prof\n  DISABLE STATEMENT = ('ALTER PLUGGABLE DATABASE')\n          CLAUSE ALL EXCEPT = ('DEFAULT TABLESPACE', 'DEFAULT TEMPORARY TABLESPACE');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-LOCKDOWN-PROFILE-17.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-LOCKDOWN-PROFILE.html\nALTER LOCKDOWN PROFILE hr_prof\n  DISABLE STATEMENT = ('ALTER SESSION')\n          CLAUSE = ('SET')\n          OPTION = ('COMMIT_WAIT', 'CURSOR_SHARING');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-LOCKDOWN-PROFILE-18.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-LOCKDOWN-PROFILE.html\nALTER LOCKDOWN PROFILE hr_prof\n  DISABLE STATEMENT = ('ALTER SYSTEM')\n          CLAUSE = ('SET')\n          OPTION = ('PDB_FILE_NAME_CONVERT')\n          VALUE = ('cdb1_pdb0', 'cdb1_pdb1');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-LOCKDOWN-PROFILE-19.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-LOCKDOWN-PROFILE.html\nALTER LOCKDOWN PROFILE hr_prof\n  DISABLE STATEMENT = ('ALTER SYSTEM')\n          CLAUSE = ('SET')\n          OPTION = ('CPU_COUNT')\n          MINVALUE = '8';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-LOCKDOWN-PROFILE-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-LOCKDOWN-PROFILE.html\nCREATE LOCKDOWN PROFILE hr_prof;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-LOCKDOWN-PROFILE-20.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-LOCKDOWN-PROFILE.html\nALTER LOCKDOWN PROFILE hr_prof\n  DISABLE STATEMENT = ('ALTER SYSTEM')\n          CLAUSE = ('SET')\n          OPTION = ('CPU_COUNT')\n          MAXVALUE = '2';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-LOCKDOWN-PROFILE-21.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-LOCKDOWN-PROFILE.html\nALTER LOCKDOWN PROFILE hr_prof\n  DISABLE STATEMENT = ('ALTER SYSTEM')\n          CLAUSE = ('SET')\n          OPTION = ('CPU_COUNT')\n          MINVALUE = '2'\n          MAXVALUE = '6';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-LOCKDOWN-PROFILE-22.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-LOCKDOWN-PROFILE.html\nALTER LOCKDOWN PROFILE hr_prof\n  ENABLE STATEMENT ALL EXCEPT = ('ALTER DATABASE');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-LOCKDOWN-PROFILE-23.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-LOCKDOWN-PROFILE.html\nALTER LOCKDOWN PROFILE hr_prof\n  ENABLE STATEMENT = ('ALTER DATABASE')\n          CLAUSE = ('MOUNT', 'OPEN');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-LOCKDOWN-PROFILE-24.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-LOCKDOWN-PROFILE.html\nALTER LOCKDOWN PROFILE hr_prof\n  ENABLE STATEMENT = ('ALTER PLUGGABLE DATABASE')\n         CLAUSE ALL EXCEPT = ('DEFAULT TABLESPACE', 'DEFAULT TEMPORARY TABLESPACE');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-LOCKDOWN-PROFILE-25.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-LOCKDOWN-PROFILE.html\nALTER LOCKDOWN PROFILE hr_prof\n  ENABLE STATEMENT = ('ALTER SESSION')\n         CLAUSE = ('SET')\n         OPTION = ('COMMIT_WAIT', 'CURSOR_SHARING');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-LOCKDOWN-PROFILE-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-LOCKDOWN-PROFILE.html\nALTER LOCKDOWN PROFILE hr_prof\n  DISABLE FEATURE = ('NETWORK_ACCESS');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-LOCKDOWN-PROFILE-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-LOCKDOWN-PROFILE.html\nALTER LOCKDOWN PROFILE hr_prof\n  DISABLE FEATURE = ('LOB_FILE_ACCESS', 'TRACE_VIEW_ACCESS');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-LOCKDOWN-PROFILE-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-LOCKDOWN-PROFILE.html\nALTER LOCKDOWN PROFILE hr_prof\n  DISABLE FEATURE ALL EXCEPT = ('COMMON_USER_LOCAL_SCHEMA_ACCESS', 'LOCAL_USER_COMMON_SCHEMA_ACCESS');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-LOCKDOWN-PROFILE-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-LOCKDOWN-PROFILE.html\nALTER LOCKDOWN PROFILE hr_prof\n  DISABLE FEATURE ALL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-LOCKDOWN-PROFILE-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-LOCKDOWN-PROFILE.html\nALTER LOCKDOWN PROFILE hr_prof\n  ENABLE FEATURE = ('UTL_HTTP', 'UTL_SMTP', 'OS_ACCESS');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-LOCKDOWN-PROFILE-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-LOCKDOWN-PROFILE.html\nALTER LOCKDOWN PROFILE hr_prof\n  ENABLE FEATURE ALL EXCEPT = ('AQ_PROTOCOLS', 'CTX_PROTOCOLS');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-LOCKDOWN-PROFILE-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-LOCKDOWN-PROFILE.html\nALTER LOCKDOWN PROFILE hr_prof\n  ENABLE FEATURE ALL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-MATERIALIZED-VIEW-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-MATERIALIZED-VIEW.html\nALTER MATERIALIZED VIEW sales_by_month_by_state\n   REFRESH FAST;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-MATERIALIZED-VIEW-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-MATERIALIZED-VIEW.html\nALTER MATERIALIZED VIEW sales_by_month_by_state\n   REFRESH NEXT SYSDATE+7;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-MATERIALIZED-VIEW-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-MATERIALIZED-VIEW.html\nALTER MATERIALIZED VIEW sales_by_month_by_state CONSIDER FRESH;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-MATERIALIZED-VIEW-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-MATERIALIZED-VIEW.html\nALTER MATERIALIZED VIEW emp_data\n   REFRESH COMPLETE   \n   START WITH TRUNC(SYSDATE+1) + 9/24  \n   NEXT SYSDATE+7;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-MATERIALIZED-VIEW-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-MATERIALIZED-VIEW.html\nALTER MATERIALIZED VIEW emp_data\n   ENABLE QUERY REWRITE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-MATERIALIZED-VIEW-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-MATERIALIZED-VIEW.html\nALTER MATERIALIZED VIEW order_data \n   REFRESH WITH PRIMARY KEY;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-MATERIALIZED-VIEW-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-MATERIALIZED-VIEW.html\nALTER MATERIALIZED VIEW order_data COMPILE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-MATERIALIZED-VIEW-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-MATERIALIZED-VIEW.html\nALTER MATERIALIZED VIEW MView1 ANNOTATIONS(DROP Snapshot);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-MATERIALIZED-VIEW-LOG-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-MATERIALIZED-VIEW-LOG.html\nALTER MATERIALIZED VIEW LOG ON order_items ADD ROWID;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-MATERIALIZED-VIEW-LOG-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-MATERIALIZED-VIEW-LOG.html\nALTER MATERIALIZED VIEW LOG ON employees\n   ADD (commission_pct)\n   EXCLUDING NEW VALUES;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-MATERIALIZED-ZONEMAP-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-MATERIALIZED-ZONEMAP.html\nALTER MATERIALIZED ZONEMAP sales_zmap\n  PCTFREE 20 PCTUSED 50 NOCACHE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-MATERIALIZED-ZONEMAP-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-MATERIALIZED-ZONEMAP.html\nALTER MATERIALIZED ZONEMAP sales_zmap\n  REFRESH FAST ON COMMIT;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-MATERIALIZED-ZONEMAP-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-MATERIALIZED-ZONEMAP.html\nALTER MATERIALIZED ZONEMAP sales_zmap\n  DISABLE PRUNING;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-MATERIALIZED-ZONEMAP-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-MATERIALIZED-ZONEMAP.html\nALTER MATERIALIZED ZONEMAP sales_zmap\n  COMPILE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-MATERIALIZED-ZONEMAP-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-MATERIALIZED-ZONEMAP.html\nALTER MATERIALIZED ZONEMAP sales_zmap\n  REBUILD;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-MATERIALIZED-ZONEMAP-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-MATERIALIZED-ZONEMAP.html\nALTER MATERIALIZED ZONEMAP sales_zmap\n  UNUSABLE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-OPERATOR-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-OPERATOR.html\nALTER OPERATOR eq_op COMPILE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-OUTLINE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-OUTLINE.html\nALTER OUTLINE salaries REBUILD;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-PLUGGABLE-DATABASE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-PLUGGABLE-DATABASE.html\nALTER PLUGGABLE DATABASE CDB1_PDB2 UNPLUG INTO '/tmp/cdb1_pdb2.xml' ENCRYPT USING transport_secret"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-PLUGGABLE-DATABASE-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-PLUGGABLE-DATABASE.html\nALTER PLUGGABLE DATABASE CDB1_PDB1_1 UNPLUG INTO '/tmp/CDB1_PDB1_1.pdb' ENCRYPT USING transport_secret"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-PLUGGABLE-DATABASE-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-PLUGGABLE-DATABASE.html\nALTER PLUGGABLE DATABASE \n   ENABLE LOST WRITE PROTECTION"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-PLUGGABLE-DATABASE-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-PLUGGABLE-DATABASE.html\nALTER PLUGGABLE DATABASE \n   DISABLE LOST WRITE PROTECTION"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-PLUGGABLE-DATABASE-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-PLUGGABLE-DATABASE.html\nALTER PLUGGABLE DATABASE pdb1\n  UNPLUG INTO '/oracle/data/pdb1.xml';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-PLUGGABLE-DATABASE-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-PLUGGABLE-DATABASE.html\nALTER PLUGGABLE DATABASE pdb2\n  STORAGE (MAXSIZE 500M);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-PLUGGABLE-DATABASE-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-PLUGGABLE-DATABASE.html\nALTER PLUGGABLE DATABASE pdb3\n  DATAFILE ALL OFFLINE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-PLUGGABLE-DATABASE-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-PLUGGABLE-DATABASE.html\nALTER PLUGGABLE DATABASE pdb4\n  OPEN READ ONLY;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-PLUGGABLE-DATABASE-16.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-PLUGGABLE-DATABASE.html\nALTER PLUGGABLE DATABASE pdb4\n  OPEN READ WRITE FORCE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-PLUGGABLE-DATABASE-17.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-PLUGGABLE-DATABASE.html\nALTER PLUGGABLE DATABASE pdb4\n  CLOSE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-PLUGGABLE-DATABASE-18.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-PLUGGABLE-DATABASE.html\nALTER PLUGGABLE DATABASE pdb4\n  OPEN READ ONLY RESTRICTED;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-PLUGGABLE-DATABASE-19.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-PLUGGABLE-DATABASE.html\nALTER PLUGGABLE DATABASE pdb5\n  OPEN READ WRITE INSTANCES = ('ORCLDB_1', 'ORCLDB_2');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-PLUGGABLE-DATABASE-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-PLUGGABLE-DATABASE.html\nALTER PLUGGABLE DATABASE CONTAINERS HOST='myhost.example.com';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-PLUGGABLE-DATABASE-20.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-PLUGGABLE-DATABASE.html\nALTER PLUGGABLE DATABASE pdb6\n  CLOSE RELOCATE TO 'ORCLDB_3';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-PLUGGABLE-DATABASE-21.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-PLUGGABLE-DATABASE.html\nALTER PLUGGABLE DATABASE ALL\n  OPEN READ ONLY;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-PLUGGABLE-DATABASE-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-PLUGGABLE-DATABASE.html\nALTER PLUGGABLE DATABASE CONTAINERS PORT=1599;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-PLUGGABLE-DATABASE-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-PLUGGABLE-DATABASE.html\nALTER PLUGGABLE DATABASE APPLICATION hrapp payrollapp employeesapp SYNC"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-PLUGGABLE-DATABASE-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-PLUGGABLE-DATABASE.html\nALTER PLUGGABLE DATABASE APPLICATION ALL EXCEPT hrapp payrollapp SYNC"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-PLUGGABLE-DATABASE-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-PLUGGABLE-DATABASE.html\nALTER PLUGGABLE DATABASE pdb_name PREPARE MIRROR COPY mirror_name WITH HIGH REDUNDANCY"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-PLUGGABLE-DATABASE-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-PLUGGABLE-DATABASE.html\nALTER PLUGGABLE DATABASE PREPARE MIRROR COPY mirror_name WITH HIGH REDUNDANCY"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-PROFILE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-PROFILE.html\nALTER PROFILE new_profile \n   LIMIT PASSWORD_REUSE_TIME 90 \n   PASSWORD_REUSE_MAX UNLIMITED;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-PROFILE-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-PROFILE.html\nALTER PROFILE app_user \n   LIMIT PASSWORD_REUSE_TIME DEFAULT\n   PASSWORD_REUSE_MAX UNLIMITED;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-PROFILE-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-PROFILE.html\nALTER PROFILE app_user LIMIT\n   FAILED_LOGIN_ATTEMPTS 5\n   PASSWORD_LOCK_TIME 1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-PROFILE-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-PROFILE.html\nALTER PROFILE app_user2 LIMIT\n   PASSWORD_LIFE_TIME 90\n   PASSWORD_GRACE_TIME 5;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-PROFILE-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-PROFILE.html\nALTER PROFILE app_user2 LIMIT\n  INACTIVE_ACCOUNT_TIME 30;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-PROFILE-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-PROFILE.html\nALTER PROFILE app_user LIMIT SESSIONS_PER_USER 5;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-PROFILE-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-PROFILE.html\nALTER PROFILE app_user LIMIT IDLE_TIME DEFAULT;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-PROFILE-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-PROFILE.html\nALTER PROFILE default LIMIT IDLE_TIME  2;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-PROFILE-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-PROFILE.html\nALTER PROFILE app_user2 LIMIT IDLE_TIME UNLIMITED;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-PROFILE-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-PROFILE.html\nALTER PROFILE usr_prof LIMIT PASSWORD_ROLLOVER_TIME 2 ;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-RESOURCE-COST-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-RESOURCE-COST.html\nALTER RESOURCE COST \n   CPU_PER_SESSION 100\n   CONNECT_TIME      1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-RESOURCE-COST-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-RESOURCE-COST.html\nALTER RESOURCE COST \n   LOGICAL_READS_PER_SESSION 2\n   CONNECT_TIME 0;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-ROLE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-ROLE.html\nALTER ROLE warehouse_user NOT IDENTIFIED;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-ROLE-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-ROLE.html\nALTER ROLE dw_manager \n   IDENTIFIED BY data;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-ROLE-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-ROLE.html\nALTER ROLE dw_manager IDENTIFIED USING hr.admin;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-ROLLBACK-SEGMENT-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-ROLLBACK-SEGMENT.html\nALTER ROLLBACK SEGMENT rbs_one ONLINE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-ROLLBACK-SEGMENT-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-ROLLBACK-SEGMENT.html\nALTER ROLLBACK SEGMENT rbs_one \n   SHRINK TO 100M;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SEQUENCE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SEQUENCE.html\nALTER SEQUENCE customers_seq \n   MAXVALUE 1500;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SEQUENCE-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SEQUENCE.html\nALTER SEQUENCE customers_seq \n   CYCLE\n   CACHE 5;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SESSION-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SESSION.html\nSELECT SYS_CONTEXT('USERENV', 'CURRENT_EDITION_NAME') FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SESSION-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SESSION.html\nSELECT SYS_CONTEXT('USERENV', 'CON_NAME') FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SESSION-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SESSION.html\nALTER SESSION ENABLE PARALLEL DML;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SESSION-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SESSION.html\nALTER SESSION\n   ADVISE COMMIT;\nINSERT INTO employees@remote\n   VALUES (8002, 'Juan', 'Fernandez', 'juanf@example.com', NULL, \n   TO_DATE('04-OCT-1992', 'DD-MON-YYYY'), 'SA_CLERK', 3000, \n   NULL, 121, 20);\nALTER SESSION\n   ADVISE ROLLBACK;\nDELETE FROM employees@local\n   WHERE employee_id = 8002;\nCOMMIT;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SESSION-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SESSION.html\nUPDATE jobs@local SET min_salary = 3000\n   WHERE job_id = 'SH_CLERK';\nCOMMIT;\nALTER SESSION\n   CLOSE DATABASE LINK local;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SESSION-16.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SESSION.html\nALTER SESSION \n   SET NLS_DATE_FORMAT = 'YYYY MM DD HH24:MI:SS';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SESSION-17.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SESSION.html\nSELECT TO_CHAR(SYSDATE) Today\n   FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SESSION-18.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SESSION.html\nALTER SESSION \n   SET NLS_DATE_LANGUAGE = French;\nSELECT TO_CHAR(SYSDATE, 'Day DD Month YYYY') Today\n   FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SESSION-19.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SESSION.html\nALTER SESSION\n   SET NLS_ISO_CURRENCY = America;\nSELECT TO_CHAR( SUM(salary), 'C999G999D99') Total\n   FROM employees;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SESSION-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SESSION.html\nSELECT SYS_CONTEXT('USERENV', 'SESSION_DEFAULT_COLLATION') FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SESSION-20.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SESSION.html\nALTER SESSION SET NLS_NUMERIC_CHARACTERS = ',.' ;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SESSION-21.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SESSION.html\nALTER SESSION SET NLS_CURRENCY = 'FF';\nSELECT TO_CHAR( SUM(salary), 'L999G999D99') Total FROM employees;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SESSION-22.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SESSION.html\nALTER SESSION\n   SET NLS_CURRENCY = 'DM';\nSELECT TO_CHAR( SUM(salary), 'L999G999D99') Total\n   FROM employees;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SESSION-23.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SESSION.html\nALTER SESSION\n   SET NLS_LANGUAGE = FRENCH;\nSELECT * FROM DMP;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SESSION-24.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SESSION.html\nALTER SESSION\n   SET NLS_SORT = XSpanish;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SESSION-25.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SESSION.html\nALTER SESSION\n  SET QUERY_REWRITE_ENABLED = TRUE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SYNONYM-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SYNONYM.html\nALTER SYNONYM offices COMPILE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SYNONYM-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SYNONYM.html\nALTER PUBLIC SYNONYM emp_table COMPILE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SYNONYM-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SYNONYM.html\nALTER SYNONYM offices NONEDITIONABLE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SYSTEM-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SYSTEM.html\nALTER SYSTEM KILL SESSION '20,1' FORCE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SYSTEM-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SYSTEM.html\nALTER SYSTEM KILL SESSION '20,1' TIMEOUT 20;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SYSTEM-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SYSTEM.html\nALTER SYSTEM\n   ENABLE RESTRICTED SESSION;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SYSTEM-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SYSTEM.html\nALTER SYSTEM\n   DISABLE RESTRICTED SESSION;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SYSTEM-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SYSTEM.html\nALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY \"password\";\nALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY \"password\";"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SYSTEM-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SYSTEM.html\nALTER SYSTEM SET ENCRYPTION WALLET CLOSE IDENTIFIED BY \"password\";"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SYSTEM-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SYSTEM.html\nALTER SYSTEM SET ENCRYPTION WALLET CLOSE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SYSTEM-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SYSTEM.html\nALTER SYSTEM FLUSH SHARED_POOL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SYSTEM-16.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SYSTEM.html\nALTER SYSTEM CHECKPOINT;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SYSTEM-17.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SYSTEM.html\nALTER SYSTEM SET RESOURCE_LIMIT = TRUE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SYSTEM-18.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SYSTEM.html\nALTER SYSTEM SET SHARED_SERVERS = 25;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SYSTEM-19.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SYSTEM.html\nALTER SYSTEM \n   SET DISPATCHERS = \n      '(INDEX=0)(PROTOCOL=TCP)(DISPATCHERS=5)',\n      '(INDEX=1)(PROTOCOL=ipc)(DISPATCHERS=10)';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SYSTEM-20.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SYSTEM.html\nALTER SYSTEM \n   SET LICENSE_MAX_SESSIONS = 64 \n   LICENSE_SESSIONS_WARNING = 54;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SYSTEM-21.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SYSTEM.html\nALTER SYSTEM SET LICENSE_MAX_SESSIONS = 0;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SYSTEM-22.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SYSTEM.html\nALTER SYSTEM SET LICENSE_MAX_USERS = 200;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SYSTEM-23.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SYSTEM.html\nALTER SYSTEM SWITCH LOGFILE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SYSTEM-24.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SYSTEM.html\nALTER SYSTEM ENABLE DISTRIBUTED RECOVERY;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SYSTEM-25.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SYSTEM.html\nALTER SYSTEM DISABLE DISTRIBUTED RECOVERY;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SYSTEM-26.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SYSTEM.html\nSELECT sid, serial#, username\n   FROM V$SESSION;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SYSTEM-27.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SYSTEM.html\nALTER SYSTEM KILL SESSION '39, 23';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SYSTEM-28.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SYSTEM.html\nALTER SYSTEM DISCONNECT SESSION '13, 8' POST_TRANSACTION;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SYSTEM-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SYSTEM.html\nSELECT SYS_CONTEXT('SYS_CLUSTER_PROPERTIES', 'CLUSTER_STATE') FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SYSTEM-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SYSTEM.html\nSELECT SYS_CONTEXT('SYS_CLUSTER_PROPERTIES', 'CURRENT_PATCHLVL') FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SYSTEM-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SYSTEM.html\nALTER SYSTEM SET MANDATORY_USER_PROFILE=c##cdb_profile;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SYSTEM-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SYSTEM.html\nALTER SYSTEM ARCHIVE LOG CHANGE 9356083;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SYSTEM-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SYSTEM.html\nALTER SYSTEM ARCHIVE LOG \n    LOGFILE 'diskl:log6.log' \n    TO 'diska:[arch$]';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-SYSTEM-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-SYSTEM.html\nALTER SYSTEM SET QUERY_REWRITE_ENABLED = TRUE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE employee RESULT_CACHE (MODE DEFAULT) \n    ALTER TABLE employee RESULT_CACHE (STANDBY ENABLE)   \n    ALTER TABLE employee RESULT_CACHE (MODE DEFAULT, STANDBY ENABLE)\n    ALTER TABLE employee RESULT_CACHE (STANDBY ENABLE, MODE FORCE)"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE imm_tab NO DELETE UNTIL 120 DAYS AFTER\n    INSERT;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-100.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE departments \n    DROP PRIMARY KEY CASCADE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-101.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE departments\n    DROP CONSTRAINT pk_dept CASCADE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-102.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE employees \n    DROP UNIQUE (email);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-103.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE employees ADD (resume CLOB)\n  LOB (resume) STORE AS resume_seg (TABLESPACE example);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-104.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE employees MODIFY LOB (resume) (CACHE);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-105.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE employees ADD (resume CLOB)\nLOB (resume) STORE AS SECUREFILE resume_seg (TABLESPACE auto_seg_ts);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-106.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE employees MODIFY LOB (resume) (NOCACHE);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-107.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE employees ADD (skills skill_table_type)\n    NESTED TABLE skills STORE AS nested_skill_table;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-108.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nCREATE TYPE pet_t AS OBJECT\n   (pet_id NUMBER, pet_name VARCHAR2(10), pet_dob DATE);\n/\nCREATE TYPE pet AS TABLE OF pet_t;\n/\nCREATE TABLE vet_service (vet_name VARCHAR2(30),\n                          client   pet)\n  NESTED TABLE client STORE AS client_tab;\nALTER TABLE client_tab ADD UNIQUE (pet_id);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-109.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nCREATE TYPE emp_t AS OBJECT (eno number, ename char(31)); \nCREATE TYPE emps_t AS TABLE OF REF emp_t; \nCREATE TABLE emptab OF emp_t; \nCREATE TABLE dept (dno NUMBER, employees emps_t) \n   NESTED TABLE employees STORE AS deptemps; \nALTER TABLE deptemps ADD (SCOPE FOR (COLUMN_VALUE) IS emptab);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nCREATE TABLE JOBS_Temp AS SELECT * FROM HR.JOBS;\nSELECT * FROM JOBS_Temp WHERE MIN_SALARY < 3000;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-110.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE deptemps ADD (REF(column_value) WITH ROWID);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-111.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nCREATE TYPE dept_t AS OBJECT \n   (deptno NUMBER, dname VARCHAR2(20));\n/\nCREATE TABLE staff \n   (name   VARCHAR2(100), \n    salary NUMBER,\n    dept   REF dept_t);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-112.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nCREATE TABLE offices OF dept_t;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-113.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE staff \n    ADD (SCOPE FOR (dept) IS offices);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-114.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE staff \n   ADD (REF(dept) WITH ROWID);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-115.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nCREATE TABLE t1 (n NUMBER, x ANYDATA);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-116.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nCREATE OR REPLACE TYPE clob_typ AS OBJECT (c clob);\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-117.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE t1 MODIFY OPAQUE TYPE x STORE (XMLType, clob_typ) UNPACKED;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-118.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nINSERT INTO t1\n  VALUES(1, anydata.convertobject(XMLType('<Test>This is test XML</Test>')));\nINSERT INTO t1\n  VALUES(2, anydata.convertobject(clob_typ(TO_CLOB('This is a test CLOB'))));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-119.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nSELECT t1.*, anydata.getTypeName(t1.x) typename FROM t1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nUPDATE JOBS_Temp SET MIN_SALARY = 2300 WHERE MIN_SALARY < 2010;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-120.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nCREATE FUNCTION get_xmltype (ad IN ANYDATA) RETURN VARCHAR2 AS\n      rtn_val PLS_INTEGER;\n      my_xmltype XMLType;\n      string_val VARCHAR2(30);\n   BEGIN\n      rtn_val := ad.getObject(my_xmltype);\n      string_val := my_xmltype.getstringval();\n      return (string_val);\n   END;\n/\nCREATE FUNCTION get_clob_typ (ad IN ANYDATA) RETURN VARCHAR2 AS\n      rtn_val PLS_INTEGER;\n      my_clob_typ clob_typ;\n      string_val VARCHAR2(30);\n   BEGIN\n      rtn_val := ad.getObject(my_clob_typ);\n      string_val := (my_clob_typ.c);\n      return (string_val);\n   END;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-121.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nSELECT t1.*, anydata.getTypeName(t1.x) typename,\n  CASE\n    WHEN anydata.gettypename(t1.x) = 'SYS.XMLTYPE' THEN get_xmltype(t1.x)\n    WHEN anydata.gettypename(t1.x) = 'HR.CLOB_TYP' THEN get_clob_typ(t1.x)\n  END string_value\nFROM t1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-122.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nCREATE TABLE table1 (T NUMBER) ANNOTATIONS(Operations 'Sort', Hidden);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-123.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE table1 ANNOTATIONS(DROP Operations, DROP Hidden);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-124.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE table1 ANNOTATIONS(ADD Operations '[\"Sort\", \"Group\"]');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-125.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE table1 MODIFY T ANNOTATIONS(Identity 'ID');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-126.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE table1 MODIFY T ANNOTATIONS(ADD Hidden, DROP Identity);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-127.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nCREATE SHARDED TABLE departments\n  ( department_id  NUMBER(6)\n   , department_name VARCHAR2(30) CONSTRAINT dept_name_nn NOT NULL\n   , manager_id    NUMBER(6)\n   , location_id   NUMBER(4)\n   , CONSTRAINT dept_id_pk PRIMARY KEY(department_id)\n   )\n   PARTITION BY DIRECTORY (department_id)\n   (\n    PARTITION p_1 TABLESPACE tbs1,\n    PARTITION p_2 TABLESPACE tbs2\n   );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-128.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE departments ADD\n    PARTITION p_3 TABLESPACE tbs3,\n    PARTITION p_4 TABLESPACE tbs4;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-129.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE departments\n  SPLIT PARTITION p_1 INTO\n   (PARTITION p_1 TABLESPACE tbs1,\n    PARTITION p_3 TABLESPACE tbs3)\n    UPDATE INDEXES;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE JOBS_Temp ADD CONSTRAINT chk_sal_min CHECK (MIN_SALARY >=2010);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nSELECT * FROM JOBS_Temp WHERE MIN_SALARY < 3000;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nSELECT CONSTRAINT_NAME FROM USER_CONSTRAINTS WHERE TABLE_NAME='JOBS_TEMP';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-16.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nCREATE TABLE product(\n  id NUMBER NOT NULL PRIMARY KEY,\n  name VARCHAR2(50),\n  price NUMBER CHECK (mod(price,4) = 0 and 10 <> price) PRECHECK,\n  color NUMBER CHECK (color >= 10 and color <=50 and mod(color,2) = 0)\n    PRECHECK,\n  description VARCHAR2(50) CHECK (length(description) <= 40) PRECHECK,\n  constant NUMBER CHECK (constant=10) PRECHECK,\n  CONSTRAINT TC1 CHECK (color > 0 AND price > 10) PRECHECK,\n  CONSTRAINT TC2 CHECK (CATEGORY IN ('home', 'apparel') AND price > 10)\n);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-17.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE product MODIFY (name VARCHAR2(50) CHECK \n  (regexp_like(name, '^Product')) PRECHECK);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-18.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE product MODIFY CONSTRAINT TC2 PRECHECK;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-19.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE product MODIFY CONSTRAINT TC1 NOPRECHECK;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-20.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE print_media MODIFY NESTED TABLE ad_textdocs_ntab\n   RETURN AS VALUE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-21.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE customers\n   PARALLEL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-22.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE employees\n   ENABLE VALIDATE CONSTRAINT emp_manager_fk\n   EXCEPTIONS INTO exceptions;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-23.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nSELECT e.*\n   FROM employees e, exceptions ex\n   WHERE e.rowid = ex.row_id\n      AND ex.table_name = 'EMPLOYEES'\n      AND ex.constraint = 'EMP_MANAGER_FK';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-24.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE employees\n   ENABLE NOVALIDATE PRIMARY KEY\n   ENABLE NOVALIDATE CONSTRAINT emp_last_name_nn;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-25.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE locations\n   MODIFY PRIMARY KEY DISABLE CASCADE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-26.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nEXECUTE DBMS_IOT.BUILD_EXCEPTIONS_TABLE ('hr', 'countries', 'except_table');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-27.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE countries\n   ENABLE PRIMARY KEY\n   EXCEPTIONS INTO except_table;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-28.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE employees ADD CONSTRAINT check_comp \n   CHECK (salary + (commission_pct*salary) <= 5000)\n   DISABLE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-29.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE employees\n   ENABLE ALL TRIGGERS;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-30.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE employees\n    DEALLOCATE UNUSED;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-31.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nCREATE TABLE students (last_name VARCHAR2(20), id NUMBER);\nINSERT INTO students VALUES('Dodd', 364);\nINSERT INTO students VALUES('de Niro', 132);\nINSERT INTO students VALUES('Vogel', 837);\nINSERT INTO students VALUES('van der Kamp', 549);\nINSERT INTO students VALUES('van Der Meer', 624);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-32.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nSELECT last_name, id\n  FROM students\n  ORDER BY last_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-33.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE students \n  MODIFY (last_name COLLATE BINARY_CI);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-34.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nSELECT last_name, id\n  FROM students\n  ORDER BY last_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-35.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE customers\n   RENAME COLUMN credit_limit TO credit_amount;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-36.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nCREATE TABLE t1 (\n   pk NUMBER PRIMARY KEY,\n   fk NUMBER,\n   c1 NUMBER,\n   c2 NUMBER,\n   CONSTRAINT ri FOREIGN KEY (fk) REFERENCES t1,\n   CONSTRAINT ck1 CHECK (pk > 0 and c1 > 0),\n   CONSTRAINT ck2 CHECK (c2 > 0)\n);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-37.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE t1 DROP (pk);\nALTER TABLE t1 DROP (c1);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-38.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE t1 DROP (pk) CASCADE CONSTRAINTS;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-39.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE t1 DROP (pk, fk, c1);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE t ADD (jcol JSON)"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-40.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nCREATE TABLE JOBS_Temp AS SELECT * FROM HR.JOBS;\nSELECT * FROM JOBS_Temp WHERE MAX_SALARY > 20000;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-41.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE JOBS_Temp ADD (DUMMY1 NUMBER(2), DUMMY2 NUMBER(2));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-42.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nINSERT INTO JOBS_Temp(JOB_ID, JOB_TITLE, DUMMY1, DUMMY2) VALUES ('D','DUMMY',10,20);\nINSERT INTO JOBS_Temp(JOB_ID, JOB_TITLE, DUMMY1, DUMMY2) VALUES ('D','DUMMY',10,20)"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-43.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE JOBS_TEMP SET UNUSED (DUMMY1, DUMMY2);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-44.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nSELECT * FROM USER_UNUSED_COL_TABS WHERE TABLE_NAME='JOBS_TEMP';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-45.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE JOBS_TEMP DROP UNUSED COLUMNS;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-46.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nSELECT * FROM JOBS_TEMP;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-47.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE countries_demo INITRANS 4;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-48.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE countries_demo ADD OVERFLOW;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-49.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE countries_demo OVERFLOW INITRANS 4;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nCREATE DOMAIN phone_number as VARCHAR2(12)  \n  CONSTRAINT CHECK (phone_number not like '%[0-9]%')\n  NOT NULL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-50.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE sales SPLIT PARTITION SALES_Q4_2000 \n   AT (TO_DATE('15-NOV-2000','DD-MON-YYYY'))\n   INTO (PARTITION SALES_Q4_2000, PARTITION SALES_Q4_2000b);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-51.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE sales SPLIT PARTITION SALES_Q1_2002 INTO (\n PARTITION SALES_JAN_2002 VALUES LESS THAN (TO_DATE('01-FEB-2002','DD-MON-YYYY')),\n PARTITION SALES_FEB_2002 VALUES LESS THAN (TO_DATE('01-MAR-2002','DD-MON-YYYY')),\n PARTITION SALES_MAR_2002);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-52.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nCREATE TABLE print_media_part (\n    product_id NUMBER(6),\n    ad_id              NUMBER(6),\n    ad_composite       BLOB,\n    ad_sourcetext      CLOB,\n    ad_finaltext       CLOB,\n    ad_fltextn         NCLOB,\n    ad_textdocs_ntab   TEXTDOC_TAB,\n    ad_photo           BLOB,\n    ad_graphic         BFILE,\n    ad_header          ADHEADER_TYP)\n  NESTED TABLE ad_textdocs_ntab STORE AS textdoc_nt\n  PARTITION BY RANGE (product_id)\n    (PARTITION p1 VALUES LESS THAN (100),\n     PARTITION p2 VALUES LESS THAN (200));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-53.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE print_media_part\n   SPLIT PARTITION p2 AT (150) INTO\n   (PARTITION p2a TABLESPACE omf_ts1\n      LOB (ad_photo, ad_composite) STORE AS (TABLESPACE omf_ts2),\n   PARTITION p2b \n      LOB (ad_photo, ad_composite) STORE AS (TABLESPACE omf_ts2))\n   NESTED TABLE ad_textdocs_ntab INTO (PARTITION nt_p2a, PARTITION nt_p2b);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-54.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE sales \n   MERGE PARTITIONS sales_q4_2000, sales_q4_2000b\n   INTO PARTITION sales_q4_2000;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-55.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE print_media_part \n   MERGE PARTITIONS p2a, p2b INTO PARTITION p2ab TABLESPACE example\n   NESTED TABLE ad_textdocs_ntab STORE AS nt_p2ab;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-56.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE sales\n  MERGE PARTITIONS sales_q1_2000 TO sales_q4_2000\n  INTO PARTITION sales_all_2000;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-57.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE print_media_part ADD PARTITION p3 VALUES LESS THAN (400)\n  LOB(ad_photo, ad_composite) STORE AS (TABLESPACE omf_ts1)\n  LOB(ad_sourcetext, ad_finaltext) STORE AS (TABLESPACE omf_ts2)\n  NESTED TABLE ad_textdocs_ntab STORE AS nt_p3;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-58.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE print_media_part ADD\n  PARTITION p3 values less than (300),\n  PARTITION p4 values less than (400),\n  PARTITION p5 values less than (500);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-59.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE list_customers SPLIT PARTITION rest \n   VALUES ('MEXICO', 'COLOMBIA')\n   INTO (PARTITION south, PARTITION rest);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE customers ADD (cust_cell_phone_number Varchar2(12) DOMAIN phone_number);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-60.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE list_customers \n   MERGE PARTITIONS asia, rest INTO PARTITION rest;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-61.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE list_customers SPLIT PARTITION rest \n   VALUES ('CHINA', 'THAILAND')\n   INTO (PARTITION asia, PARTITION rest);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-62.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE print_media_part DROP PARTITION p3;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-63.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nCREATE TABLE exchange_table (\n   customer_id     NUMBER(6),\n   cust_first_name VARCHAR2(20),\n   cust_last_name  VARCHAR2(20),\n   cust_address    CUST_ADDRESS_TYP,\n   nls_territory   VARCHAR2(30),\n   cust_email      VARCHAR2(40));\nALTER TABLE list_customers \n   EXCHANGE PARTITION rest WITH TABLE exchange_table \n   WITHOUT VALIDATION;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-64.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE list_customers MODIFY PARTITION asia \n   UNUSABLE LOCAL INDEXES;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-65.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE list_customers MODIFY PARTITION asia\n   REBUILD UNUSABLE LOCAL INDEXES;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-66.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE print_media_part \n   MOVE PARTITION p2b TABLESPACE omf_ts1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-67.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE sales RENAME PARTITION sales_q4_2003 TO sales_currentq;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-68.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE print_media_demo\n   TRUNCATE PARTITION p1 DROP STORAGE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-69.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE sales SPLIT PARTITION sales_q1_2000\n   AT (TO_DATE('16-FEB-2000','DD-MON-YYYY'))\n   INTO (PARTITION q1a_2000, PARTITION q1b_2000)\n   UPDATE GLOBAL INDEXES;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE customers ADD (cust_cell_phone_number Varchar2(12) DOMAIN phone_number DEFAULT ON NULL '650-000-0000');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-70.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nCREATE INDEX cost_ix ON costs(channel_id) LOCAL;\nALTER TABLE costs\n  SPLIT PARTITION costs_q4_2003 at\n    (TO_DATE('01-Nov-2003','dd-mon-yyyy')) \n    INTO (PARTITION c_p1, PARTITION c_p2) \n  UPDATE INDEXES (cost_ix (PARTITION c_p1 tablespace tbs_02, \n                           PARTITION c_p2 tablespace tbs_03));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-71.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nCREATE TYPE emp_t AS OBJECT (empno NUMBER, address CHAR(30));\n\nCREATE TABLE emp OF emp_t (\n   empno PRIMARY KEY)\n   OBJECT IDENTIFIER IS PRIMARY KEY;\n\nCREATE TABLE dept (dno NUMBER, mgr_ref REF emp_t SCOPE is emp);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-72.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE dept ADD CONSTRAINT mgr_cons FOREIGN KEY (mgr_ref)\n   REFERENCES emp;\nALTER TABLE dept ADD sr_mgr REF emp_t REFERENCES emp;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-73.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE countries \n   ADD (duty_pct     NUMBER(2,2)  CHECK (duty_pct < 10.5),\n        visa_needed  VARCHAR2(3));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-74.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nCREATE TABLE emp2 AS SELECT * FROM employees;\nALTER TABLE emp2 ADD (income AS (salary + (salary*commission_pct)));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-75.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE countries\n   MODIFY (duty_pct NUMBER(3,2));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-76.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE employees \n   PCTFREE 30\n   PCTUSED 60;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-77.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nCREATE TABLE JOBS_TEMP AS SELECT * FROM HR.JOBS;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-78.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nSELECT initial_extent, \n       next_extent, \n       min_extents, \n       max_extents, \n       pct_increase, \n       blocks, \n       sample_size \nFROM   user_tables \nWHERE  table_name = 'JOBS_TEMP';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-79.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE JOBS_TEMP MOVE    \n      STORAGE ( INITIAL 20K    \n                NEXT 40K    \n                MINEXTENTS 2    \n                MAXEXTENTS 20    \n                PCTINCREASE 0 )    \n      TABLESPACE USERS;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE t1 DROP COLUMN f1 DROP (f2);\nALTER TABLE t1 DROP COLUMN f1 SET UNUSED (f2);\nALTER TABLE t1 DROP (f1) ADD (f2 NUMBER);\nALTER TABLE t1 SET UNUSED (f3) \n   ADD (CONSTRAINT ck1 CHECK (f2 > 0));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-80.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nSELECT initial_extent, \n       next_extent, \n       min_extents, \n       max_extents, \n       pct_increase, \n       blocks, \n       sample_size \nFROM   user_tables \nWHERE  table_name = 'JOBS_TEMP';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-81.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nCREATE TABLE JOBS_Temp AS SELECT * FROM HR.JOBS;\nSELECT * FROM JOBS_Temp WHERE MAX_SALARY > 30000;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-82.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE JOBS_Temp MODIFY(JOB_TITLE VARCHAR2(100));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-83.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE JOBS_Temp ADD (BONUS NUMBER (7,2), COMM NUMBER (5,2), DUMMY NUMBER(2));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-84.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nSELECT JOB_ID, BONUS, COMM, DUMMY FROM JOBS_Temp WHERE MAX_SALARY > 20000;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-85.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE JOBS_Temp RENAME COLUMN COMM TO COMMISSION;\nSELECT JOB_ID, COMMISSION FROM JOBS_Temp WHERE MAX_SALARY > 20000;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-86.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE JOBS_Temp DROP COLUMN DUMMY;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-87.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE JOBS_Temp DROP (BONUS, COMMISSION);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-88.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE employees\n   MODIFY (salary ENCRYPT USING 'AES256' 'NOMAC');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-89.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE customers\n   ADD (online_acct_pw VARCHAR2(8) ENCRYPT 'NOMAC' NO SALT);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE imm_tab NO DROP UNTIL 50 DAYS IDLE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-90.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE customers\n   MODIFY (online_acct_pw DECRYPT);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-91.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE employees\n  ALLOCATE EXTENT (SIZE 5K INSTANCE 4);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-92.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE product_information\n  MODIFY (min_price DEFAULT 10);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-93.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nINSERT INTO product_information (product_id, product_name, \n   list_price)\n   VALUES (300, 'left-handed mouse', 40.50);\nSELECT product_id, product_name, list_price, min_price \n    FROM product_information\n    WHERE product_id = 300;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-94.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE product_information\n   MODIFY (min_price DEFAULT NULL);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-95.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nCREATE SEQUENCE s1 START WITH 1;\nCREATE TABLE t1 (name VARCHAR2(10));\nINSERT INTO t1 VALUES('Kevin');\nINSERT INTO t1 VALUES('Julia');\nINSERT INTO t1 VALUES('Ryan');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-96.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE t1 ADD (id NUMBER DEFAULT ON NULL s1.NEXTVAL NOT NULL);\nSELECT id, name FROM t1 ORDER BY id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-97.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nINSERT INTO t1(id, name) VALUES(NULL, 'Sean');\nSELECT id, name FROM t1 ORDER BY id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-98.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE xwarehouses \n   ADD (PRIMARY KEY(XMLDATA.\"WarehouseID\"));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLE-99.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLE.html\nALTER TABLE customers RENAME CONSTRAINT cust_fname_nn\n   TO cust_firstname_nn;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLESPACE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLESPACE.html\nALTER SYSTEM SET UNDO_TABLESPACE = new_tablespace_name SCOPE = MEMORY;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLESPACE-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLESPACE.html\nALTER TABLESPACE tbsu1 ENABLE LOST WRITE PROTECTION"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLESPACE-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLESPACE.html\nALTER TABLESPACE tbs_03\n    DROP DATAFILE 'tbs_f04.dbf';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLESPACE-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLESPACE.html\nALTER TABLESPACE temp_demo ADD TEMPFILE 'temp05.dbf' SIZE 5 AUTOEXTEND ON;\nALTER TABLESPACE temp_demo DROP TEMPFILE 'temp05.dbf';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLESPACE-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLESPACE.html\nALTER TABLESPACE temp_demo SHRINK SPACE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLESPACE-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLESPACE.html\nALTER TABLESPACE omf_ts1 ADD DATAFILE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLESPACE-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLESPACE.html\nALTER TABLESPACE tbs_03 NOLOGGING;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLESPACE-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLESPACE.html\nALTER TABLESPACE undots1\n  RETENTION NOGUARANTEE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLESPACE-16.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLESPACE.html\nALTER TABLESPACE undots1\n  RETENTION GUARANTEE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLESPACE-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLESPACE.html\nALTER TABLESPACE tbsu1 REMOVE LOST WRITE PROTECTION"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLESPACE-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLESPACE.html\nALTER TABLESPACE tbsu1 SUSPEND LOST WRITE PROTECTION"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLESPACE-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLESPACE.html\nALTER TABLESPACE tbs_01 \n    BEGIN BACKUP;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLESPACE-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLESPACE.html\nALTER TABLESPACE tbs_01 \n   END BACKUP;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLESPACE-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLESPACE.html\nALTER TABLESPACE tbs_02 OFFLINE NORMAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLESPACE-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLESPACE.html\nALTER TABLESPACE tbs_02\n  RENAME DATAFILE 'diskb:tbs_f5.dbf'\n  TO              'diska:tbs_f5.dbf';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLESPACE-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLESPACE.html\nALTER TABLESPACE tbs_02 ONLINE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLESPACE-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLESPACE.html\nALTER TABLESPACE tbs_03 \n    ADD DATAFILE 'tbs_f04.dbf'\n    SIZE 100K\n    AUTOEXTEND ON\n    NEXT 10K\n    MAXSIZE 100K;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-TABLESPACE-SET-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-TABLESPACE-SET.html\nALTER TABLESPACE SET ts1\n  FORCE LOGGING;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-USER-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-USER.html\nALTER USER u1 IDENTIFIED BY p3;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-USER-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-USER.html\nALTER USER u1 IDENTIFIED BY p3 REPLACE p1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-USER-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-USER.html\nALTER USER sidney PASSWORD EXPIRE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-USER-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-USER.html\nALTER USER sh\n  TEMPORARY TABLESPACE tbs_grp_01;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-USER-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-USER.html\nALTER USER app_user1 \n   GRANT CONNECT THROUGH sh\n   WITH ROLE warehouse_user;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-USER-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-USER.html\nALTER USER app_user1 REVOKE CONNECT THROUGH sh;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-USER-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-USER.html\nALTER USER sully GRANT CONNECT THROUGH OAS1\n   AUTHENTICATED USING PASSWORD;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-USER-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-USER.html\nALTER USER app_user1\n   GRANT CONNECT THROUGH ENTERPRISE USERS;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-USER-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-USER.html\nALTER USER u1 IDENTIFIED BY p3 REPLACE p2;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-USER-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-USER.html\nALTER USER user PASSWORD EXPIRE HTTP DIGEST ENABLE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-USER-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-USER.html\nALTER USER user PASSWORD EXPIRE HTTP DIGEST DISABLE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-USER-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-USER.html\nALTER USER sidney \n    IDENTIFIED BY second_2nd_pwd\n    DEFAULT TABLESPACE example;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-USER-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-USER.html\nALTER USER sh \n    PROFILE new_profile;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-USER-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-USER.html\nALTER USER sh \n    DEFAULT ROLE ALL EXCEPT dw_manager;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-USER-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-USER.html\nALTER USER app_user1 IDENTIFIED GLOBALLY AS 'CN=tom,O=oracle,C=US';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-VIEW-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-VIEW.html\nALTER VIEW customer_ro\n    COMPILE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ALTER-VIEW-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ALTER-VIEW.html\nALTER VIEW HighWageEmp ANNOTATIONS(DROP Title, ADD Identity);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ANALYZE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ANALYZE.html\nANALYZE TABLE orders DELETE STATISTICS;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ANALYZE-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ANALYZE.html\nANALYZE INDEX inv_product_ix VALIDATE STRUCTURE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ANALYZE-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ANALYZE.html\nANALYZE TABLE employees VALIDATE STRUCTURE CASCADE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ANALYZE-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ANALYZE.html\nANALYZE TABLE customers VALIDATE REF UPDATE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ANALYZE-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ANALYZE.html\nANALYZE TABLE customers VALIDATE STRUCTURE ONLINE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ANALYZE-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ANALYZE.html\nANALYZE CLUSTER personnel\n    VALIDATE STRUCTURE CASCADE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ANALYZE-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ANALYZE.html\nANALYZE TABLE orders\n   LIST CHAINED ROWS INTO chained_rows;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ANALYZE-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ANALYZE.html\nSELECT owner_name, table_name, head_rowid, analyze_timestamp \n    FROM chained_rows\n    ORDER BY owner_name, table_name, head_rowid, analyze_timestamp;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ANY_VALUE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ANY_VALUE.html\nSELECT c.cust_id, ANY_VALUE(cust_last_name), SUM(amount_sold)\n  FROM customers c, sales s\n  WHERE s.cust_id = c.cust_id\n  GROUP BY c.cust_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/APPROX_COUNT-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/APPROX_COUNT.html\nSELECT department_id, job_id, \n       APPROX_COUNT(*) \nFROM   employees\nGROUP BY department_id, job_id\nHAVING \n  APPROX_RANK ( \n  PARTITION BY department_id \n  ORDER BY APPROX_COUNT(*) \n  DESC ) <= 10;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/APPROX_COUNT_DISTINCT-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/APPROX_COUNT_DISTINCT.html\nSELECT APPROX_COUNT_DISTINCT(manager_id) AS \"Active Managers\"\n  FROM employees;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/APPROX_COUNT_DISTINCT-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/APPROX_COUNT_DISTINCT.html\nSELECT prod_id, APPROX_COUNT_DISTINCT(cust_id) AS \"Number of Customers\"\n  FROM sales\n  GROUP BY prod_id\n  ORDER BY prod_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/APPROX_COUNT_DISTINCT_DETAIL-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/APPROX_COUNT_DISTINCT_DETAIL.html\nCREATE MATERIALIZED VIEW daily_prod_count_mv AS\n  SELECT t.calendar_year year,\n         t.calendar_month_number month,\n         t.day_number_in_month day,\n         APPROX_COUNT_DISTINCT_DETAIL(s.prod_id) daily_detail\n  FROM times t, sales s\n  WHERE t.time_id = s.time_id\n  GROUP BY t.calendar_year, t.calendar_month_number, t.day_number_in_month;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/APPROX_COUNT_DISTINCT_DETAIL-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/APPROX_COUNT_DISTINCT_DETAIL.html\nCREATE MATERIALIZED VIEW monthly_prod_count_mv AS\n  SELECT year,\n         month,\n         APPROX_COUNT_DISTINCT_AGG(daily_detail) monthly_detail\n  FROM daily_prod_count_mv\n  GROUP BY year, month;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/APPROX_COUNT_DISTINCT_DETAIL-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/APPROX_COUNT_DISTINCT_DETAIL.html\nCREATE MATERIALIZED VIEW annual_prod_count_mv AS\n  SELECT year,\n         APPROX_COUNT_DISTINCT_AGG(daily_detail) annual_detail\n  FROM daily_prod_count_mv\n  GROUP BY year;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/APPROX_COUNT_DISTINCT_DETAIL-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/APPROX_COUNT_DISTINCT_DETAIL.html\nSELECT year,\n       month,\n       day,\n       TO_APPROX_COUNT_DISTINCT(daily_detail) \"NUM PRODUCTS\"\n  FROM daily_prod_count_mv\n  ORDER BY year, month, day;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/APPROX_COUNT_DISTINCT_DETAIL-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/APPROX_COUNT_DISTINCT_DETAIL.html\nSELECT year,\n       month,\n       TO_APPROX_COUNT_DISTINCT(monthly_detail) \"NUM PRODUCTS\"\n  FROM monthly_prod_count_mv\n  ORDER BY year, month;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/APPROX_COUNT_DISTINCT_DETAIL-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/APPROX_COUNT_DISTINCT_DETAIL.html\nSELECT year,\n       TO_APPROX_COUNT_DISTINCT(annual_detail) \"NUM PRODUCTS\"\n  FROM annual_prod_count_mv\n  ORDER BY year;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/APPROX_MEDIAN-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/APPROX_MEDIAN.html\nSELECT department_id \"Department\",\n       APPROX_MEDIAN(salary DETERMINISTIC) \"Median Salary\"\n  FROM employees\n  GROUP BY department_id\n  ORDER BY department_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/APPROX_MEDIAN-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/APPROX_MEDIAN.html\nSELECT department_id \"Department\",\n       APPROX_MEDIAN(salary DETERMINISTIC, 'ERROR_RATE') \"Error Rate\"\n  FROM employees\n  GROUP BY department_id\n  ORDER BY department_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/APPROX_MEDIAN-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/APPROX_MEDIAN.html\nSELECT department_id \"Department\",\n       APPROX_MEDIAN(salary DETERMINISTIC, 'CONFIDENCE') \"Confidence Level\"\n  FROM employees\n  GROUP BY department_id\n  ORDER BY department_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/APPROX_MEDIAN-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/APPROX_MEDIAN.html\nSELECT department_id \"Department\",\n       APPROX_MEDIAN(hire_date) \"Median Hire Date\"\n  FROM employees\n  GROUP BY department_id\n  ORDER BY department_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/APPROX_PERCENTILE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/APPROX_PERCENTILE.html\nSELECT department_id \"Department\",\n       APPROX_PERCENTILE(0.25 DETERMINISTIC)\n         WITHIN GROUP (ORDER BY salary ASC) \"25th Percentile Salary\",\n       APPROX_PERCENTILE(0.50 DETERMINISTIC)\n         WITHIN GROUP (ORDER BY salary ASC) \"50th Percentile Salary\",\n       APPROX_PERCENTILE(0.75 DETERMINISTIC)\n         WITHIN GROUP (ORDER BY salary ASC) \"75th Percentile Salary\"\n  FROM employees\n  GROUP BY department_id\n  ORDER BY department_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/APPROX_PERCENTILE-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/APPROX_PERCENTILE.html\nSELECT department_id \"Department\",\n       APPROX_PERCENTILE(0.25 DETERMINISTIC, 'ERROR_RATE')\n         WITHIN GROUP (ORDER BY salary ASC) \"Error Rate\"\n  FROM employees\n  GROUP BY department_id\n  ORDER BY department_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/APPROX_PERCENTILE-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/APPROX_PERCENTILE.html\nSELECT department_id \"Department\",\n       APPROX_PERCENTILE(0.25 DETERMINISTIC, 'CONFIDENCE')\n         WITHIN GROUP (ORDER BY salary ASC) \"Confidence\"\nFROM employees\nGROUP BY department_id\nORDER BY department_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/APPROX_PERCENTILE-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/APPROX_PERCENTILE.html\nSELECT department_id \"Department\",\n       APPROX_PERCENTILE(0.25)\n         WITHIN GROUP (ORDER BY salary ASC) \"25th Percentile Salary\",\n       APPROX_PERCENTILE(0.50)\n         WITHIN GROUP (ORDER BY salary ASC) \"50th Percentile Salary\",\n       APPROX_PERCENTILE(0.75)\n         WITHIN GROUP (ORDER BY salary ASC) \"75th Percentile Salary\"\n  FROM employees\n  GROUP BY department_id\n  ORDER BY department_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/APPROX_PERCENTILE_DETAIL-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/APPROX_PERCENTILE_DETAIL.html\nCREATE MATERIALIZED VIEW amt_sold_by_city_mv\nENABLE QUERY REWRITE AS\nSELECT c.country_id country,\n       c.cust_state_province state,\n       c.cust_city city,\n       APPROX_PERCENTILE_DETAIL(s.amount_sold) city_detail\nFROM customers c, sales s\nWHERE c.cust_id = s.cust_id\nGROUP BY c.country_id, c.cust_state_province, c.cust_city;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/APPROX_PERCENTILE_DETAIL-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/APPROX_PERCENTILE_DETAIL.html\nCREATE MATERIALIZED VIEW amt_sold_by_state_mv AS\nSELECT country,\n       state,\n       APPROX_PERCENTILE_AGG(city_detail) state_detail\nFROM amt_sold_by_city_mv\nGROUP BY country, state;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/APPROX_PERCENTILE_DETAIL-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/APPROX_PERCENTILE_DETAIL.html\nCREATE MATERIALIZED VIEW amt_sold_by_country_mv AS\n  SELECT country,\n         APPROX_PERCENTILE_AGG(city_detail) country_detail\n  FROM amt_sold_by_city_mv\n  GROUP BY country;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/APPROX_PERCENTILE_DETAIL-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/APPROX_PERCENTILE_DETAIL.html\nSELECT country,\n       state,\n       city,\n       TO_APPROX_PERCENTILE(city_detail, .25, 'NUMBER') \"25th Percentile\",\n       TO_APPROX_PERCENTILE(city_detail, .50, 'NUMBER') \"50th Percentile\",\n       TO_APPROX_PERCENTILE(city_detail, .75, 'NUMBER') \"75th Percentile\"\nFROM amt_sold_by_city_mv\nORDER BY country, state, city;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/APPROX_PERCENTILE_DETAIL-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/APPROX_PERCENTILE_DETAIL.html\nSELECT country,\n       state,\n       TO_APPROX_PERCENTILE(state_detail, .25, 'NUMBER') \"25th Percentile\",\n       TO_APPROX_PERCENTILE(state_detail, .50, 'NUMBER') \"50th Percentile\",\n       TO_APPROX_PERCENTILE(state_detail, .75, 'NUMBER') \"75th Percentile\"\nFROM amt_sold_by_state_mv\nORDER BY country, state;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/APPROX_PERCENTILE_DETAIL-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/APPROX_PERCENTILE_DETAIL.html\nSELECT country,\n       TO_APPROX_PERCENTILE(country_detail, .25, 'NUMBER') \"25th Percentile\",\n       TO_APPROX_PERCENTILE(country_detail, .50, 'NUMBER') \"50th Percentile\",\n       TO_APPROX_PERCENTILE(country_detail, .75, 'NUMBER') \"75th Percentile\"\nFROM amt_sold_by_country_mv\nORDER BY country;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/APPROX_PERCENTILE_DETAIL-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/APPROX_PERCENTILE_DETAIL.html\nSELECT country,\n       TO_APPROX_PERCENTILE(APPROX_PERCENTILE_AGG(city_detail), .25, 'NUMBER') \"25th Percentile\"\nFROM amt_sold_by_city_mv\nGROUP BY country\nORDER BY country;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/APPROX_PERCENTILE_DETAIL-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/APPROX_PERCENTILE_DETAIL.html\nSELECT c.country_id country,\n       APPROX_MEDIAN(s.amount_sold) amount_median\nFROM customers c, sales s\nWHERE c.cust_id = s.cust_id\nGROUP BY c.country_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/APPROX_PERCENTILE_DETAIL-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/APPROX_PERCENTILE_DETAIL.html\nSET LINESIZE 300\nSET PAGESIZE 0\nCOLUMN plan_table_output FORMAT A150\n\nSELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(format=>'BASIC'));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/APPROX_RANK-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/APPROX_RANK.html\nSELECT job_id, \n\t\t\tAPPROX_SUM(sal), \n      APPROX_RANK(PARTITION BY department_id ORDER BY APPROX_SUM(salary) DESC) \nFROM employees\nGROUP BY department_id, job_id\nHAVING \n   APPROX_RANK(\n   PARTITION BY department_id \n   ORDER BY APPROX_SUM (salary) \n   DESC) <= 10;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/APPROX_SUM-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/APPROX_SUM.html\nSELECT department_id, job_id, \n       APPROX_SUM(salary) \nFROM   employees\nGROUP BY department_id, job_id\nHAVING \n  APPROX_RANK ( \n  PARTITION BY department_id \n  ORDER BY APPROX_SUM(salary) \n  DESC ) <= 10;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ASCII-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ASCII.html\nSELECT last_name\n  FROM employees\n  WHERE ASCII(SUBSTR(last_name, 1, 1)) = 76\n  ORDER BY last_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ASCIISTR-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ASCIISTR.html\nSELECT ASCIISTR('ABÄCDE')\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ASIN-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ASIN.html\nSELECT ASIN(.3) \"Arc_Sine\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ASSOCIATE-STATISTICS-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ASSOCIATE-STATISTICS.html\nASSOCIATE STATISTICS WITH PACKAGES emp_mgmt DEFAULT SELECTIVITY 10;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ASSOCIATE-STATISTICS-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ASSOCIATE-STATISTICS.html\nASSOCIATE STATISTICS WITH INDEXES salary_index DEFAULT COST (100,5,0);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ATAN-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ATAN.html\nSELECT ATAN(.3) \"Arc_Tangent\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ATAN2-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ATAN2.html\nSELECT ATAN2(.3, .2) \"Arc_Tangent2\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/AUDIT-Unified-Auditing-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/AUDIT-Unified-Auditing.html\nAUDIT POLICY table_pol;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/AUDIT-Unified-Auditing-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/AUDIT-Unified-Auditing.html\nSELECT policy_name, enabled_option, entity_name\n  FROM audit_unified_enabled_policies\n  WHERE policy_name = 'TABLE_POL';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/AUDIT-Unified-Auditing-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/AUDIT-Unified-Auditing.html\nAUDIT POLICY dml_pol BY hr, sh;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/AUDIT-Unified-Auditing-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/AUDIT-Unified-Auditing.html\nSELECT policy_name, enabled_option, entity_name\n  FROM audit_unified_enabled_policies\n  WHERE policy_name = 'DML_POL'\n  ORDER BY entity_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/AUDIT-Unified-Auditing-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/AUDIT-Unified-Auditing.html\nAUDIT POLICY read_dir_pol EXCEPT hr;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/AUDIT-Unified-Auditing-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/AUDIT-Unified-Auditing.html\nSELECT policy_name, enabled_option, entity_name\n  FROM audit_unified_enabled_policies\n  WHERE policy_name = 'READ_DIR_POL';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/AUDIT-Unified-Auditing-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/AUDIT-Unified-Auditing.html\nAUDIT POLICY security_pol BY hr WHENEVER NOT SUCCESSFUL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/AUDIT-Unified-Auditing-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/AUDIT-Unified-Auditing.html\nSELECT policy_name, enabled_option, entity_name, success, failure\n  FROM audit_unified_enabled_policies\n  WHERE policy_name = 'SECURITY_POL';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/AUDIT-Unified-Auditing-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/AUDIT-Unified-Auditing.html\nAUDIT CONTEXT NAMESPACE userenv\n  ATTRIBUTES current_user, db_name\n  BY hr;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/AVG-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/AVG.html\nSELECT AVG(salary) \"Average\"\n  FROM employees;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/AVG-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/AVG.html\nSELECT manager_id, last_name, hire_date, salary,\n       AVG(salary) OVER (PARTITION BY manager_id ORDER BY hire_date \n  ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS c_mavg\n  FROM employees\n  ORDER BY manager_id, hire_date, salary;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/About-SQL-Expressions-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/About-SQL-Expressions.html\nSET last_name = 'Smith';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/About-SQL-Expressions-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/About-SQL-Expressions.html\nSET last_name = INITCAP(last_name);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/About-User-Defined-Functions-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/About-User-Defined-Functions.html\nSELECT new_sal FROM new_emps;\nSELECT new_emps.new_sal FROM new_emps;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/About-User-Defined-Functions-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/About-User-Defined-Functions.html\nSELECT hr.new_sal FROM new_emps;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/About-User-Defined-Functions-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/About-User-Defined-Functions.html\nSELECT hr.tax_rate (ss_no, sal)\n    INTO income_tax\n    FROM tax_table WHERE ss_no = tax_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Aggregate-Functions-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Aggregate-Functions.html\nSELECT AVG(MAX(salary))\n  FROM employees\n  GROUP BY department_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Arithmetic-Operators-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Arithmetic-Operators.html\nSELECT *\n  FROM order_items\n  WHERE quantity = -1\n  ORDER BY order_id, \n    line_item_id, product_id;\nSELECT *\n  FROM employees\n  WHERE -salary < 0\n  ORDER BY employee_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Arithmetic-Operators-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Arithmetic-Operators.html\nSELECT hire_date \n  FROM employees\n  WHERE SYSDATE - hire_date > 365\n  ORDER BY hire_date;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Arithmetic-Operators-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Arithmetic-Operators.html\nUPDATE employees\n  SET salary = salary * 1.1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Automatic-Locks-in-DML-Operations-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Automatic-Locks-in-DML-Operations.html\nUPDATE t SET x = ( SELECT y FROM t2 WHERE t2.z = t.z ) WHERE a > 5;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/BETWEEN-Condition-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/BETWEEN-Condition.html\nSELECT * FROM employees\n  WHERE salary\n  BETWEEN 2000 AND 3000\n  ORDER BY employee_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/BFILENAME-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/BFILENAME.html\nCREATE DIRECTORY media_dir AS '/demo/schema/product_media';\nINSERT INTO print_media (product_id, ad_id, ad_graphic)\n  VALUES (3000, 31001, BFILENAME('MEDIA_DIR', 'modem_comp_ad.gif'));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/BIN_TO_NUM-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/BIN_TO_NUM.html\nSELECT BIN_TO_NUM(1,0,1,0)\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/BIN_TO_NUM-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/BIN_TO_NUM.html\nSELECT order_status\n  FROM orders\n  WHERE order_id = 2441;\nDECLARE\n  warehouse NUMBER := 1;\n  ground    NUMBER := 1;\n  insured   NUMBER := 1;\n  result    NUMBER;\nBEGIN\n  SELECT BIN_TO_NUM(warehouse, ground, insured) INTO result FROM DUAL;\n  UPDATE orders SET order_status = result WHERE order_id = 2441;\nEND;\n/\nSELECT order_status\n  FROM orders\n  WHERE order_id = 2441;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/BITAND-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/BITAND.html\nSELECT BITAND(6,3)\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/BITAND-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/BITAND.html\nSELECT BITAND(\n    BIN_TO_NUM(1,1,0),\n    BIN_TO_NUM(0,1,1)) \"Binary\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/BITAND-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/BITAND.html\nSELECT order_id, customer_id, order_status,\n    DECODE(BITAND(order_status, 1), 1, 'Warehouse', 'PostOffice') \"Location\",\n    DECODE(BITAND(order_status, 2), 2, 'Ground', 'Air') \"Method\",\n    DECODE(BITAND(order_status, 4), 4, 'Insured', 'Certified') \"Receipt\"\n  FROM orders\n  WHERE sales_rep_id = 160\n  ORDER BY order_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/BIT_AND_AGG-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/BIT_AND_AGG.html\nSELECT '011' num, bin_to_num(0,1,1) bits FROM dual\n  UNION ALL SELECT '101' num, bin_to_num(1,0,1) bits FROM dual;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/BIT_AND_AGG-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/BIT_AND_AGG.html\nSELECT bit_and_agg(bits) \n  FROM (SELECT '011' num, bin_to_num(0,1,1) bits FROM dual\n        UNION ALL SELECT '101' num, bin_to_num(1,0,1) bits FROM dual);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CALL-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CALL.html\nCALL my_procedure(arg1 => 3, arg2 => 4)"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CALL-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CALL.html\nCALL my_procedure(3, 4) \n\nCALL my_procedure(3, arg2 => 4)"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CALL-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CALL.html\nCALL emp_mgmt.remove_dept(162);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CALL-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CALL.html\nALTER TYPE warehouse_typ\n      ADD MEMBER FUNCTION ret_name\n      RETURN VARCHAR2\n      CASCADE;\nCREATE OR REPLACE TYPE BODY warehouse_typ\n      AS MEMBER FUNCTION ret_name\n      RETURN VARCHAR2\n      IS\n         BEGIN\n            RETURN self.warehouse_name;\n         END;\n      END;\n/\nVARIABLE x VARCHAR2(25);\nCALL warehouse_typ(456, 'Warehouse 456', 2236).ret_name()\n   INTO :x;\nPRINT x;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CALL-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CALL.html\nCREATE OR REPLACE FUNCTION ret_warehouse_typ(x warehouse_typ) \n  RETURN warehouse_typ\n  IS\n    BEGIN\n      RETURN x;\n    END;\n/\nCALL ret_warehouse_typ(warehouse_typ(234, 'Warehouse 234',\n   2235)).ret_name()\n   INTO :x;\nPRINT x;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CARDINALITY-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CARDINALITY.html\nSELECT product_id, CARDINALITY(ad_textdocs_ntab) cardinality\n  FROM print_media\n  ORDER BY product_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CASE-Expressions-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CASE-Expressions.html\nSELECT cust_last_name,\n   CASE credit_limit WHEN 100 THEN 'Low'\n   WHEN 5000 THEN 'High'\n   ELSE 'Medium' END AS credit\n   FROM customers\n   ORDER BY cust_last_name, credit;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CASE-Expressions-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CASE-Expressions.html\nSELECT AVG(CASE WHEN e.salary > 2000 THEN e.salary\n   ELSE 2000 END) \"Average Salary\" FROM employees e;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CAST-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CAST.html\nSELECT CAST('22-OCT-1997'\n       AS TIMESTAMP WITH LOCAL TIME ZONE) \n  FROM DUAL;\nSELECT CAST(TO_DATE('22-Oct-1997', 'DD-Mon-YYYY')\n       AS TIMESTAMP WITH LOCAL TIME ZONE)\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CAST-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CAST.html\nSELECT product_id, CAST(ad_sourcetext AS VARCHAR2(30)) text\n  FROM print_media\n  ORDER BY product_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CAST-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CAST.html\nCREATE TABLE projects \n  (employee_id NUMBER, project_name VARCHAR2(10));\nCREATE TABLE emps_short \n  (employee_id NUMBER, last_name VARCHAR2(10));\nCREATE TYPE project_table_typ AS TABLE OF VARCHAR2(10);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CAST-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CAST.html\nSELECT e.last_name,\n       CAST(MULTISET(SELECT p.project_name\n                       FROM projects p \n                       WHERE p.employee_id = e.employee_id\n                       ORDER BY p.project_name)\n       AS project_table_typ)\n  FROM emps_short e\n  ORDER BY e.last_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CAST-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CAST.html\nSELECT \n    CAST ( 'yes' AS BOOLEAN ),\n    CAST ( true AS NUMBER ),\n    CAST ( false AS VARCHAR2(10) );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CAST-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CAST.html\nCREATE DOMAIN day_of_week AS VARCHAR2(3 CHAR)\n  CONSTRAINT CHECK (day_of_week IN('MON','TUE','WED','THU','FRI','SAT','SUN'))\n  DISABLE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CAST-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CAST.html\nSELECT CAST ( 'N/A' AS day_of_week ) use_constraint_state;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CAST-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CAST.html\nSELECT CAST ( 'N/A' AS day_of_week VALIDATE ) apply_constraints;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CAST-16.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CAST.html\nCREATE DOMAIN day_of_week AS VARCHAR2(3 CHAR)\n  CONSTRAINT CHECK (day_of_week IN('MON','TUE','WED','THU','FRI','SAT','SUN'))\n  ENABLE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CAST-17.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CAST.html\nSELECT CAST ( 'N/A' AS day_of_week ) use_constraint_state;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CAST-18.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CAST.html\nSELECT CAST ( 'N/A' AS DOMAIN day_of_week NOVALIDATE ) ignore_constraints;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CAST-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CAST.html\nSELECT CAST(200\n       AS NUMBER\n       DEFAULT 0 ON CONVERSION ERROR)\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CAST-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CAST.html\nSELECT CAST('January 15, 1989, 11:00 A.M.'\n       AS DATE\n       DEFAULT NULL ON CONVERSION ERROR,\n       'Month dd, YYYY, HH:MI A.M.')\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CAST-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CAST.html\nSELECT CAST('1999-12-01 11:00:00 -8:00'\n       AS TIMESTAMP WITH TIME ZONE\n       DEFAULT '2000-01-01 01:00:00 -8:00' ON CONVERSION ERROR,\n       'YYYY-MM-DD HH:MI:SS TZH:TZM',\n       'NLS_DATE_LANGUAGE = American')\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CAST-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CAST.html\nSELECT CAST('N/A'\n       AS NUMBER\n       DEFAULT '0' ON CONVERSION ERROR)\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CAST-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CAST.html\nSELECT\n  CAST ( 'yes' AS BOOLEAN ),\n  CAST ( true AS NUMBER ),\n  CAST ( false AS VARCHAR2(10) ) ;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CAST-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CAST.html\nCREATE TYPE address_book_t AS TABLE OF cust_address_typ;\n\nCREATE TYPE address_array_t AS VARRAY(3) OF cust_address_typ;\n\nCREATE TABLE cust_address (\n  custno            NUMBER, \n  street_address    VARCHAR2(40), \n  postal_code       VARCHAR2(10), \n  city              VARCHAR2(30),\n  state_province    VARCHAR2(10), \n  country_id        CHAR(2));\n\nCREATE TABLE cust_short (custno NUMBER, name VARCHAR2(31));\n\nCREATE TABLE states (state_id NUMBER, addresses address_array_t);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CAST-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CAST.html\nSELECT s.custno, s.name,\n       CAST(MULTISET(SELECT ca.street_address,   \n                            ca.postal_code, \n                            ca.city, \n                            ca.state_province, \n                            ca.country_id\n                       FROM cust_address ca\n                       WHERE s.custno = ca.custno)\n       AS address_book_t)\n  FROM cust_short s\n  ORDER BY s.custno;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CAST-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CAST.html\nSELECT CAST(s.addresses AS address_book_t)\n  FROM states s \n  WHERE s.state_id = 111;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CEIL-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CEIL.html\nSELECT order_total, CEIL(order_total)\n  FROM orders\n  WHERE order_id = 2434;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CHARTOROWID-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CHARTOROWID.html\nSELECT last_name\n  FROM employees\n  WHERE ROWID = CHARTOROWID('AAAFd1AAFAAAABSAA/');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CHR-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CHR.html\nSELECT CHR(67)||CHR(65)||CHR(84) \"Dog\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CHR-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CHR.html\nSELECT CHR(195)||CHR(193)||CHR(227) \"Dog\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CHR-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CHR.html\nSELECT CHR(41378)\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CHR-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CHR.html\nSELECT CHR(161)||CHR(162)\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CHR-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CHR.html\nSELECT CHR(41378)||CHR(41379)\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CHR-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CHR.html\nSELECT CHR (196 USING NCHAR_CS)\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CLUSTER_DETAILS-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CLUSTER_DETAILS.html\nSELECT S.cluster_id, probability prob,\n       CLUSTER_DETAILS(em_sh_clus_sample, S.cluster_id, 5 USING T.*) det\nFROM\n  (SELECT v.*, CLUSTER_SET(em_sh_clus_sample, NULL, 0.2 USING *) pset\n    FROM mining_data_apply_v v\n   WHERE cust_id = 100955) T,\n  TABLE(T.pset) S\nORDER BY 2 DESC;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CLUSTER_DETAILS-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CLUSTER_DETAILS.html\nSELECT * FROM (\n     SELECT cust_id,\n          CLUSTER_ID(INTO 4 USING *) OVER () cls,\n          CLUSTER_DETAILS(INTO 4 USING *) OVER () cls_details\n     FROM mining_data_apply_v)\nWHERE cust_id <= 100003\nORDER BY 1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CLUSTER_DISTANCE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CLUSTER_DISTANCE.html\nSELECT cust_id\n  FROM (\n    SELECT cust_id,\n           rank() over\n             (order by CLUSTER_DISTANCE(km_sh_clus_sample USING *) desc) rnk\n      FROM mining_data_apply_v)\n  WHERE rnk <= 11\n  ORDER BY rnk;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CLUSTER_ID-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CLUSTER_ID.html\nSELECT CLUSTER_ID(km_sh_clus_sample USING *) AS clus, COUNT(*) AS cnt \n  FROM mining_data_apply_v\n  GROUP BY CLUSTER_ID(km_sh_clus_sample USING *)\n  ORDER BY cnt DESC;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CLUSTER_ID-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CLUSTER_ID.html\nSELECT * FROM (\n     SELECT cust_id,\n          CLUSTER_ID(INTO 4 USING *) OVER () cls,\n          CLUSTER_DETAILS(INTO 4 USING *) OVER () cls_details\n     FROM mining_data_apply_v)\nWHERE cust_id <= 100003\nORDER BY 1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CLUSTER_PROBABILITY-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CLUSTER_PROBABILITY.html\nSELECT cust_id\n  FROM (SELECT cust_id, rank() OVER (ORDER BY prob DESC, cust_id) rnk_clus2\n    FROM (SELECT cust_id, CLUSTER_PROBABILITY(km_sh_clus_sample, 2 USING *) prob\n          FROM mining_data_apply_v))\nWHERE rnk_clus2 <= 10\nORDER BY rnk_clus2;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CLUSTER_SET-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CLUSTER_SET.html\nSELECT S.cluster_id, probability prob,\n       CLUSTER_DETAILS(em_sh_clus_sample, S.cluster_id, 5 USING T.*) det\nFROM\n  (SELECT v.*, CLUSTER_SET(em_sh_clus_sample, NULL, 0.2 USING *) pset\n    FROM mining_data_apply_v v\n   WHERE cust_id = 100955) T,\n  TABLE(T.pset) S\nORDER BY 2 DESC;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/COALESCE-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/COALESCE.html\nSELECT product_id, list_price, min_price,\n       COALESCE(0.9*list_price, min_price, 5) \"Sale\"\n  FROM product_information\n  WHERE supplier_id = 102050\n  ORDER BY product_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/COLLATE-Operator-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/COLLATE-Operator.html\nSELECT last_name\n  FROM employees\n  ORDER BY last_name COLLATE GENERIC_M;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/COLLATION-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/COLLATION.html\nCREATE TABLE id_table\n  (name VARCHAR2(64) COLLATE BINARY_AI,\n   id VARCHAR2(8) COLLATE BINARY_CI);\nINSERT INTO id_table VALUES('Christopher', 'ABCD1234');\nSELECT COLLATION(name), COLLATION(id)\n  FROM id_table;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/COLLECT-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/COLLECT.html\nCREATE TYPE phone_book_t AS TABLE OF phone_list_typ;\n/\nSELECT CAST(COLLECT(phone_numbers) AS phone_book_t) \"Income Level L Phone Book\"\n  FROM customers\n  WHERE income_level = 'L: 300,000 and above';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/COLLECT-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/COLLECT.html\nCREATE TYPE warehouse_name_t AS TABLE OF VARCHAR2(35);\n/\nSELECT CAST(COLLECT(warehouse_name ORDER BY warehouse_name)\n       AS warehouse_name_t) \"Warehouses\"\n   FROM warehouses;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/COLUMN_VALUE-Pseudocolumn-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/COLUMN_VALUE-Pseudocolumn.html\nSELECT *\n  FROM XMLTABLE('<a>123</a>');\nSELECT COLUMN_VALUE\n  FROM (XMLTable('<a>123</a>'));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/COLUMN_VALUE-Pseudocolumn-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/COLUMN_VALUE-Pseudocolumn.html\nCREATE TYPE phone AS TABLE OF NUMBER;   \n/\nCREATE TYPE phone_list AS TABLE OF phone;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/COLUMN_VALUE-Pseudocolumn-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/COLUMN_VALUE-Pseudocolumn.html\nSELECT t.COLUMN_VALUE\n  FROM TABLE(phone(1,2,3)) t;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/COLUMN_VALUE-Pseudocolumn-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/COLUMN_VALUE-Pseudocolumn.html\nSELECT t.COLUMN_VALUE\n  FROM TABLE(phone_list(phone(1,2,3))) p, TABLE(p.COLUMN_VALUE) t;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/COLUMN_VALUE-Pseudocolumn-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/COLUMN_VALUE-Pseudocolumn.html\nCREATE TABLE my_customers (\n    cust_id       NUMBER,\n    name          VARCHAR2(25),\n    phone_numbers phone_list,\n    credit_limit  NUMBER)\n  NESTED TABLE phone_numbers STORE AS outer_ntab\n  (NESTED TABLE COLUMN_VALUE STORE AS inner_ntab);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/COMMENT-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/COMMENT.html\nCOMMENT ON COLUMN employees.job_id \n   IS 'abbreviated job title';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/COMMENT-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/COMMENT.html\nCOMMENT ON COLUMN employees.job_id IS '';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/COMMIT-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/COMMIT.html\nINSERT INTO regions VALUES (5, 'Antarctica');\nCOMMIT WORK;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/COMMIT-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/COMMIT.html\nCOMMIT WRITE BATCH;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/COMMIT-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/COMMIT.html\nCOMMIT \n    COMMENT 'In-doubt transaction Code 36, Call (415) 555-2637';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/COMMIT-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/COMMIT.html\nCOMMIT FORCE '22.57.53';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/COMPOSE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/COMPOSE.html\nSELECT COMPOSE( 'o' || UNISTR('\\0308') )\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CONCAT-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CONCAT.html\nSELECT CONCAT( last_name, '''s job category is ', job_id) \"Job\" \n  FROM employees \n  WHERE employee_id = 152;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CONVERT-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CONVERT.html\nSELECT CONVERT('Ä Ê Í Õ Ø A B C D E ', 'US7ASCII', 'WE8ISO8859P1') \n   FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CONVERT-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CONVERT.html\nSELECT * FROM V$NLS_VALID_VALUES WHERE parameter = 'CHARACTERSET';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CON_DBID_TO_ID-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CON_DBID_TO_ID.html\nSELECT CON_ID, DBID\n  FROM V$CONTAINERS;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CON_DBID_TO_ID-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CON_DBID_TO_ID.html\nSELECT CON_DBID_TO_ID(2256797992) \"Container ID\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CON_GUID_TO_ID-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CON_GUID_TO_ID.html\nSELECT CON_ID, GUID\n  FROM V$CONTAINERS;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CON_GUID_TO_ID-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CON_GUID_TO_ID.html\nSELECT CON_GUID_TO_ID(HEXTORAW('D990F4BD938865C1E04305B4F00ACA18')) \"Container ID\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CON_NAME_TO_ID-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CON_NAME_TO_ID.html\nSELECT CON_ID, NAME\n  FROM V$CONTAINERS;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CON_NAME_TO_ID-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CON_NAME_TO_ID.html\nSELECT CON_NAME_TO_ID('SALESPDB') \"Container ID\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CON_UID_TO_ID-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CON_UID_TO_ID.html\nSELECT CON_ID, CON_UID\n  FROM V$CONTAINERS;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CON_UID_TO_ID-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CON_UID_TO_ID.html\nSELECT CON_UID_TO_ID(2256797992) \"Container ID\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CORR-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CORR.html\nSELECT weight_class, CORR(list_price, min_price) \"Correlation\"\n  FROM product_information\n  GROUP BY weight_class\n  ORDER BY weight_class, \"Correlation\";"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CORR-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CORR.html\nSELECT employee_id, job_id, \n       TO_CHAR((SYSDATE - hire_date) YEAR TO MONTH ) \"Yrs-Mns\",     salary, \n       CORR(SYSDATE-hire_date, salary)\n       OVER(PARTITION BY job_id) AS \"Correlation\"\n  FROM employees\n  WHERE department_id in (50, 80)\n  ORDER BY job_id, employee_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CORR_A-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CORR_A.html\nSELECT COUNT(*) count,\n       CORR_S(salary, commission_pct) commission,\n       CORR_S(salary, employee_id) empid\n  FROM employees;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CORR_A-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CORR_A.html\nSELECT CORR_K(salary, commission_pct, 'COEFFICIENT') coefficient,\n       CORR_K(salary, commission_pct, 'TWO_SIDED_SIG') two_sided_p_value\n  FROM employees;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/COS-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/COS.html\nSELECT COS(180 * 3.14159265359/180) \"Cosine of 180 degrees\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/COSH-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/COSH.html\nSELECT COSH(0) \"Hyperbolic cosine of 0\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/COUNT-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/COUNT.html\nSELECT COUNT(*) \"Total\"\n  FROM employees;\nSELECT COUNT(*) \"Allstars\"\n  FROM employees\n  WHERE commission_pct > 0;\nSELECT COUNT(commission_pct) \"Count\"\n  FROM employees;\nSELECT COUNT(DISTINCT manager_id) \"Managers\"\n  FROM employees;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/COUNT-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/COUNT.html\nSELECT last_name, salary,\n       COUNT(*) OVER (ORDER BY salary RANGE BETWEEN 50 PRECEDING AND\n                      150 FOLLOWING) AS mov_count\n  FROM employees\n  ORDER BY salary, last_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/COVAR_POP-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/COVAR_POP.html\nSELECT job_id, \n       COVAR_POP(SYSDATE-hire_date, salary) AS covar_pop,\n       COVAR_SAMP(SYSDATE-hire_date, salary) AS covar_samp\n  FROM employees\n  WHERE department_id in (50, 80)\n  GROUP BY job_id\n  ORDER BY job_id, covar_pop, covar_samp;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/COVAR_POP-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/COVAR_POP.html\nSELECT product_id, supplier_id,\n       COVAR_POP(list_price, min_price) \n         OVER (ORDER BY product_id, supplier_id)\n         AS CUM_COVP,\n       COVAR_SAMP(list_price, min_price)\n         OVER (ORDER BY product_id, supplier_id)\n         AS CUM_COVS \n  FROM product_information p\n  WHERE category_id = 29\n  ORDER BY product_id, supplier_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-ANALYTIC-VIEW-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-ANALYTIC-VIEW.html\ndesc SALES_FACT\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-ANALYTIC-VIEW-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-ANALYTIC-VIEW.html\nCREATE OR REPLACE ANALYTIC VIEW sales_av\nUSING sales_fact\nDIMENSION BY\n  (time_attr_dim                         -- An attribute dimension of time data\n    KEY month_id REFERENCES month_id\n    HIERARCHIES (\n      time_hier DEFAULT),\n   product_attr_dim                      -- An attribute dimension of product data\n    KEY category_id REFERENCES category_id\n    HIERARCHIES (\n      product_hier DEFAULT),\n   geography_attr_dim                    -- An attribute dimension of store data\n    KEY state_province_id \n    REFERENCES state_province_id HIERARCHIES (\n      geography_hier DEFAULT)\n   )\nMEASURES\n (sales FACT sales,                      -- A base measure\n  units FACT units,                      -- A base measure\n  sales_prior_period AS                  -- Calculated measures\n    (LAG(sales) OVER (HIERARCHY time_hier OFFSET 1)),\n  sales_year_ago AS\n    (LAG(sales) OVER (HIERARCHY time_hier OFFSET 1\n     ACROSS ANCESTOR AT LEVEL year)),\n  chg_sales_year_ago AS\n    (LAG_DIFF(sales) OVER (HIERARCHY time_hier OFFSET 1\n     ACROSS ANCESTOR AT LEVEL year)),\n  pct_chg_sales_year_ago AS\n    (LAG_DIFF_PERCENT(sales) OVER (HIERARCHY time_hier OFFSET 1\n     ACROSS ANCESTOR AT LEVEL year)),\n  sales_qtr_ago AS\n    (LAG(sales) OVER (HIERARCHY time_hier OFFSET 1\n     ACROSS ANCESTOR AT LEVEL quarter)),\n  chg_sales_qtr_ago AS\n    (LAG_DIFF(sales) OVER (HIERARCHY time_hier OFFSET 1\n     ACROSS ANCESTOR AT LEVEL quarter)),\n  pct_chg_sales_qtr_ago AS\n    (LAG_DIFF_PERCENT(sales) OVER (HIERARCHY time_hier OFFSET 1\n     ACROSS ANCESTOR AT LEVEL quarter))\n  )\nDEFAULT MEASURE SALES;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-ATTRIBUTE-DIMENSION-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-ATTRIBUTE-DIMENSION.html\ndesc TIME_DIM\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-ATTRIBUTE-DIMENSION-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-ATTRIBUTE-DIMENSION.html\nCREATE OR REPLACE ATTRIBUTE DIMENSION time_attr_dim\nDIMENSION TYPE TIME\nUSING time_dim\nATTRIBUTES\n (year_id\n   CLASSIFICATION caption VALUE 'YEAR_ID'\n   CLASSIFICATION description VALUE 'YEAR ID',\n  year_name\n    CLASSIFICATION caption VALUE 'YEAR_NAME'\n    CLASSIFICATION description VALUE 'Year',\n  year_end_date\n    CLASSIFICATION caption VALUE 'YEAR_END_DATE'\n    CLASSIFICATION description VALUE 'Year End Date',\n  quarter_id\n    CLASSIFICATION caption VALUE 'QUARTER_ID'\n    CLASSIFICATION description VALUE 'QUARTER ID',\n  quarter_name\n    CLASSIFICATION caption VALUE 'QUARTER_NAME'\n    CLASSIFICATION description VALUE 'Quarter',\n  quarter_end_date\n    CLASSIFICATION caption VALUE 'QUARTER_END_DATE'\n    CLASSIFICATION description VALUE 'Quarter End Date',\n  quarter_of_year\n    CLASSIFICATION caption VALUE 'QUARTER_OF_YEAR'\n    CLASSIFICATION description VALUE 'Quarter of Year',    \n  month_id\n    CLASSIFICATION caption VALUE 'MONTH_ID'\n    CLASSIFICATION description VALUE 'MONTH ID',\n  month_name\n    CLASSIFICATION caption VALUE 'MONTH_NAME'\n    CLASSIFICATION description VALUE 'Month',\n  month_long_name\n    CLASSIFICATION caption VALUE 'MONTH_LONG_NAME'\n    CLASSIFICATION description VALUE 'Month Long Name',\n  month_end_date\n    CLASSIFICATION caption VALUE 'MONTH_END_DATE'\n    CLASSIFICATION description VALUE 'Month End Date',\n  month_of_quarter\n    CLASSIFICATION caption VALUE 'MONTH_OF_QUARTER'\n    CLASSIFICATION description VALUE 'Month of Quarter',\n  month_of_year\n    CLASSIFICATION caption VALUE 'MONTH_OF_YEAR'\n    CLASSIFICATION description VALUE 'Month of Year',\n  season\n    CLASSIFICATION caption VALUE 'SEASON'\n    CLASSIFICATION description VALUE 'Season',\n  season_order\n    CLASSIFICATION caption VALUE 'SEASON_ORDER'\n    CLASSIFICATION description VALUE 'Season Order')\nLEVEL month\n  LEVEL TYPE MONTHS\n  CLASSIFICATION caption VALUE 'MONTH'\n  CLASSIFICATION description VALUE 'Month'\n  KEY month_id\n  MEMBER NAME month_name\n  MEMBER CAPTION month_name\n  MEMBER DESCRIPTION month_long_name\n  ORDER BY month_end_date\n  DETERMINES (month_end_date,\n    quarter_id,\n    season,\n    season_order,\n    month_of_year,\n    month_of_quarter)\nLEVEL quarter\n  LEVEL TYPE QUARTERS\n  CLASSIFICATION caption VALUE 'QUARTER'\n  CLASSIFICATION description VALUE 'Quarter'\n  KEY quarter_id\n  MEMBER NAME quarter_name\n  MEMBER CAPTION quarter_name\n  MEMBER DESCRIPTION quarter_name\n  ORDER BY quarter_end_date\n  DETERMINES (quarter_end_date,\n    quarter_of_year,\n    year_id)\nLEVEL year\n  LEVEL TYPE YEARS\n  CLASSIFICATION caption VALUE 'YEAR'\n  CLASSIFICATION description VALUE 'Year'\n  KEY year_id\n  MEMBER NAME year_name\n  MEMBER CAPTION year_name\n  MEMBER DESCRIPTION year_name\n  ORDER BY year_end_date\n  DETERMINES (year_end_date)\nLEVEL season\n  LEVEL TYPE QUARTERS\n  CLASSIFICATION caption VALUE 'SEASON'\n  CLASSIFICATION description VALUE 'Season'\n  KEY season\n  MEMBER NAME season\n  MEMBER CAPTION season\n  MEMBER DESCRIPTION season\nLEVEL month_of_quarter\n  LEVEL TYPE MONTHS\n  CLASSIFICATION caption VALUE 'MONTH_OF_QUARTER'\n  CLASSIFICATION description VALUE 'Month of Quarter'\n  KEY month_of_quarter;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-ATTRIBUTE-DIMENSION-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-ATTRIBUTE-DIMENSION.html\ndesc PRODUCT_DIM\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-ATTRIBUTE-DIMENSION-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-ATTRIBUTE-DIMENSION.html\nCREATE OR REPLACE ATTRIBUTE DIMENSION product_attr_dim\nUSING product_dim \nATTRIBUTES\n (department_id,\n  department_name,\n  category_id,\n  category_name)\nLEVEL DEPARTMENT\n  KEY department_id\n  ALTERNATE KEY department_name\n  MEMBER NAME department_name\n  MEMBER CAPTION department_name\n  ORDER BY department_name\nLEVEL CATEGORY\n  KEY category_id\n  ALTERNATE KEY category_name\n  MEMBER NAME category_name\n  MEMBER CAPTION category_name\n  ORDER BY category_name\n  DETERMINES(department_id)\nALL MEMBER NAME 'ALL PRODUCTS';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-ATTRIBUTE-DIMENSION-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-ATTRIBUTE-DIMENSION.html\ndesc GEOGRAPHY_DIM\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-ATTRIBUTE-DIMENSION-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-ATTRIBUTE-DIMENSION.html\nCREATE OR REPLACE ATTRIBUTE DIMENSION geography_attr_dim\nUSING geography_dim\nATTRIBUTES\n (region_id,\n  region_name,\n  country_id,\n  country_name,\n  state_province_id,\n  state_province_name)\nLEVEL REGION\n  KEY region_id\n  ALTERNATE KEY region_name\n  MEMBER NAME region_name\n  MEMBER CAPTION region_name\n  ORDER BY region_name\nLEVEL COUNTRY\n  KEY country_id\n  ALTERNATE KEY country_name\n  MEMBER NAME country_name\n  MEMBER CAPTION country_name\n  ORDER BY country_name\n  DETERMINES(region_id)\nLEVEL STATE_PROVINCE\n  KEY state_province_id\n  ALTERNATE KEY state_province_name\n  MEMBER NAME state_province_name\n  MEMBER CAPTION state_province_name\n  ORDER BY state_province_name\n  DETERMINES(country_id)\nALL MEMBER NAME 'ALL CUSTOMERS';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing.html\nAUDIT POLICY mypolicy;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing.html\n    AUDIT POLICY mypolicy WHENEVER NOT SUCCESSFUL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing.html\n    AUDIT POLICY mypolicy;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing.html\nCREATE AUDIT POLICY table_pol\n  PRIVILEGES CREATE ANY TABLE, DROP ANY TABLE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing.html\nSELECT *\n  FROM audit_unified_policies\n  WHERE policy_name = 'TABLE_POL';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-16.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing.html\nCREATE AUDIT POLICY dml_pol\n  ACTIONS DELETE on hr.employees,\n          INSERT on hr.employees,\n          UPDATE on hr.employees,\n          ALL on hr.departments;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-17.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing.html\nCREATE AUDIT POLICY read_dir_pol\n  ACTIONS READ ON DIRECTORY bfile_dir;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-18.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing.html\nSELECT name FROM auditable_system_actions\n  WHERE component = 'Standard'\n  ORDER BY name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-19.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing.html\nCREATE AUDIT POLICY security_pol\n  ACTIONS ADMINISTER KEY MANAGEMENT;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing.html\nCONNECT hr_usr/hr_pwd@hr_pdb;\nPASSWORD \n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-20.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing.html\nCREATE AUDIT POLICY dir_pol\n  ACTIONS READ DIRECTORY, WRITE DIRECTORY, EXECUTE DIRECTORY;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-21.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing.html\nSELECT name FROM auditable_system_actions\n  WHERE component = 'Datapump';\nEXPORT\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-22.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing.html\nCREATE AUDIT POLICY dp_actions_pol\n  ACTIONS COMPONENT = datapump IMPORT;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-23.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing.html\nCREATE AUDIT POLICY java_pol\n  ROLES java_admin, java_deploy;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-24.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing.html\nCREATE AUDIT POLICY hr_admin_pol\n  PRIVILEGES CREATE ANY TABLE, DROP ANY TABLE\n  ACTIONS DELETE on hr.employees,\n          INSERT on hr.employees,\n          UPDATE on hr.employees,\n          ALL on hr.departments,\n          LOCK TABLE\n  ROLES audit_admin, audit_viewer;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-25.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing.html\nCREATE AUDIT POLICY order_updates_pol\n  ACTIONS UPDATE ON oe.orders\n  WHEN 'SYS_CONTEXT(''USERENV'', ''IDENTIFICATION_TYPE'') = ''EXTERNAL'''\n  EVALUATE PER SESSION;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-26.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing.html\nCREATE AUDIT POLICY emp_updates_pol\n        ACTIONS DELETE on hr.employees,\n          INSERT on hr.employees,\n          UPDATE on hr.employees\n        WHEN 'UID NOT IN (100, 105, 107)'\n        EVALUATE PER STATEMENT;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-27.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing.html\nCREATE AUDIT POLICY local_table_pol\n       PRIVILEGES CREATE ANY TABLE, DROP ANY TABLE\n       CONTAINER = CURRENT;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-28.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing.html\nCREATE AUDIT POLICY c##common_role1_pol\n      ROLES c##role1\n      CONTAINER = ALL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing.html\nSELECT ACTION_NAME, UNIFIED_AUDIT_POLICIES, OBJECT_NAME FROM UNIFIED_AUDIT_TRAIL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-30.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing.html\nCREATE AUDIT POLICY pol ACTIONS INSERT(deptno) on scott.dept;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing.html\nSELECT name FROM auditable_system_actions WHERE component = 'Datapump';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing.html\nSELECT name FROM auditable_system_actions WHERE component = 'Direct path API';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing.html\nSELECT name FROM auditable_system_actions WHERE component = 'Label Security';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing.html\nSELECT name FROM auditable_system_actions WHERE component = 'XS';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing.html\nSELECT name FROM auditable_system_actions WHERE component = 'Database Vault';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-AUDIT-POLICY-Unified-Auditing.html\n    AUDIT POLICY mypolicy;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-CLUSTER-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-CLUSTER.html\nCREATE CLUSTER personnel\n   (department NUMBER(4))\nSIZE 512 \nSTORAGE (initial 100K next 50K);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-CLUSTER-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-CLUSTER.html\nCREATE INDEX idx_personnel ON CLUSTER personnel;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-CLUSTER-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-CLUSTER.html\nCREATE INDEX emp_dept_index \n   ON CLUSTER emp_dept \n   TABLESPACE USERS \n   STORAGE (INITIAL 50K \n      NEXT 50K \n      MINEXTENTS 2 \n      MAXEXTENTS 10 \n      PCTINCREASE 33);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-CLUSTER-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-CLUSTER.html\nSELECT CLUSTER_NAME, TABLESPACE_NAME, CLUSTER_TYPE, PCT_INCREASE, MIN_EXTENTS, MAX_EXTENTS FROM USER_CLUSTERS;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-CLUSTER-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-CLUSTER.html\nSELECT * FROM USER_CLU_COLUMNS;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-CLUSTER-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-CLUSTER.html\nSELECT INDEX_NAME, INDEX_TYPE, PCT_INCREASE, MIN_EXTENTS, MAX_EXTENTS FROM USER_INDEXES WHERE TABLE_NAME='EMP_DEPT';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-CLUSTER-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-CLUSTER.html\nCREATE TABLE dept_10\n   CLUSTER personnel (department_id)\n   AS SELECT * FROM employees WHERE department_id = 10;\nCREATE TABLE dept_20\n   CLUSTER personnel (department_id)\n   AS SELECT * FROM employees WHERE department_id = 20;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-CLUSTER-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-CLUSTER.html\nCREATE CLUSTER language (cust_language VARCHAR2(3))\n   SIZE 512 HASHKEYS 10\n   STORAGE (INITIAL 100k next 50k);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-CLUSTER-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-CLUSTER.html\nCREATE CLUSTER address\n   (postal_code NUMBER, country_id CHAR(2))\n   HASHKEYS 20\n   HASH IS MOD(postal_code + country_id, 101);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-CLUSTER-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-CLUSTER.html\nCREATE CLUSTER cust_orders (customer_id NUMBER(6))\n   SIZE 512 SINGLE TABLE HASHKEYS 100;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-CLUSTER-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-CLUSTER.html\nCREATE CLUSTER sales (amount_sold NUMBER, prod_id NUMBER)\n  HASHKEYS 100000\n  HASH IS (amount_sold * 10 + prod_id)\n  SIZE 300\n  TABLESPACE example\n  PARTITION BY RANGE (amount_sold)\n    (PARTITION p1 VALUES LESS THAN (2001),\n     PARTITION p2 VALUES LESS THAN (4001),\n     PARTITION p3 VALUES LESS THAN (6001),\n     PARTITION p4 VALUES LESS THAN (8001),\n     PARTITION p5 VALUES LESS THAN (MAXVALUE));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-CLUSTER-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-CLUSTER.html\nCREATE CLUSTER emp_dept (deptno NUMBER(3))  \n   SIZE 600  \n   TABLESPACE USERS \n   STORAGE (INITIAL 200K  \n      NEXT 300K  \n      MINEXTENTS 2  \n      PCTINCREASE 33);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-CLUSTER-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-CLUSTER.html\nCREATE TABLE dept (  \n   deptno NUMBER(3) PRIMARY KEY)  \n   CLUSTER emp_dept (deptno);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-CLUSTER-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-CLUSTER.html\nCREATE TABLE empl (  \n   emplno NUMBER(5) PRIMARY KEY,  \n   emplname VARCHAR2(15) NOT NULL,  \n   deptno NUMBER(3) REFERENCES dept)  \n   CLUSTER emp_dept (deptno);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-CONTEXT-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-CONTEXT.html\nCREATE CONTEXT hr_context USING emp_mgmt;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-CONTEXT-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-CONTEXT.html\nCREATE VIEW hr_org_secure_view AS\n   SELECT * FROM employees\n   WHERE department_id = SYS_CONTEXT('hr_context', 'department_id');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-CONTROLFILE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-CONTROLFILE.html\nSTARTUP NOMOUNT\n\nCREATE CONTROLFILE REUSE DATABASE \"demo\" NORESETLOGS NOARCHIVELOG\n    MAXLOGFILES 32\n    MAXLOGMEMBERS 2\n    MAXDATAFILES 32\n    MAXINSTANCES 1\n    MAXLOGHISTORY 449\nLOGFILE\n  GROUP 1 '/path/oracle/dbs/t_log1.f'  SIZE 500K,\n  GROUP 2 '/path/oracle/dbs/t_log2.f'  SIZE 500K\n# STANDBY LOGFILE\nDATAFILE\n  '/path/oracle/dbs/t_db1.f',\n  '/path/oracle/dbs/dbu19i.dbf',\n  '/path/oracle/dbs/tbs_11.f',\n  '/path/oracle/dbs/smundo.dbf',\n  '/path/oracle/dbs/demo.dbf'\nCHARACTER SET WE8DEC\n;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-DATABASE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-DATABASE.html\nCREATE DATABASE sample\n   CONTROLFILE REUSE \n   LOGFILE\n      GROUP 1 ('diskx:log1.log', 'disky:log1.log') SIZE 50K, \n      GROUP 2 ('diskx:log2.log', 'disky:log2.log') SIZE 50K \n   MAXLOGFILES 5 \n   MAXLOGHISTORY 100 \n   MAXDATAFILES 10 \n   MAXINSTANCES 2 \n   ARCHIVELOG \n   CHARACTER SET AL32UTF8\n   NATIONAL CHARACTER SET AL16UTF16\n   DATAFILE  \n      'disk1:df1.dbf' AUTOEXTEND ON,\n      'disk2:df2.dbf' AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED\n   DEFAULT TEMPORARY TABLESPACE temp_ts\n   UNDO TABLESPACE undo_ts \n   SET TIME_ZONE = '+02:00';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-DATABASE-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-DATABASE.html\nCREATE DATABASE newcdb\n  USER SYS IDENTIFIED BY sys_password\n  USER SYSTEM IDENTIFIED BY system_password\n  LOGFILE GROUP 1 ('/u01/logs/my/redo01a.log','/u02/logs/my/redo01b.log')\n             SIZE 100M BLOCKSIZE 512,\n          GROUP 2 ('/u01/logs/my/redo02a.log','/u02/logs/my/redo02b.log')\n             SIZE 100M BLOCKSIZE 512,\n          GROUP 3 ('/u01/logs/my/redo03a.log','/u02/logs/my/redo03b.log')\n             SIZE 100M BLOCKSIZE 512\n  MAXLOGHISTORY 1\n  MAXLOGFILES 16\n  MAXLOGMEMBERS 3\n  MAXDATAFILES 1024\n  CHARACTER SET AL32UTF8\n  NATIONAL CHARACTER SET AL16UTF16\n  EXTENT MANAGEMENT LOCAL\n  DATAFILE '/u01/app/oracle/oradata/newcdb/system01.dbf'\n    SIZE 700M REUSE AUTOEXTEND ON NEXT 10240K MAXSIZE UNLIMITED\n  SYSAUX DATAFILE '/u01/app/oracle/oradata/newcdb/sysaux01.dbf'\n    SIZE 550M REUSE AUTOEXTEND ON NEXT 10240K MAXSIZE UNLIMITED\n  DEFAULT TABLESPACE deftbs\n    DATAFILE '/u01/app/oracle/oradata/newcdb/deftbs01.dbf'\n    SIZE 500M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED\n  DEFAULT TEMPORARY TABLESPACE tempts1\n    TEMPFILE '/u01/app/oracle/oradata/newcdb/temp01.dbf'\n    SIZE 20M REUSE AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED\n  UNDO TABLESPACE undotbs1\n    DATAFILE '/u01/app/oracle/oradata/newcdb/undotbs01.dbf'\n    SIZE 200M REUSE AUTOEXTEND ON NEXT 5120K MAXSIZE UNLIMITED\n  ENABLE PLUGGABLE DATABASE\n    SEED\n    FILE_NAME_CONVERT = ('/u01/app/oracle/oradata/newcdb/',\n                         '/u01/app/oracle/oradata/pdbseed/')\n    SYSTEM DATAFILES SIZE 125M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED\n    SYSAUX DATAFILES SIZE 100M\n  USER_DATA TABLESPACE usertbs\n    DATAFILE '/u01/app/oracle/oradata/pdbseed/usertbs01.dbf'\n    SIZE 200M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-DATABASE-LINK-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-DATABASE-LINK.html\nCREATE PUBLIC DATABASE LINK remote \n   USING 'remote';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-DATABASE-LINK-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-DATABASE-LINK.html\nUPDATE employees@remote\n   SET salary=salary*1.1\n   WHERE last_name = 'Baer';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-DATABASE-LINK-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-DATABASE-LINK.html\nCREATE DATABASE LINK local \n   CONNECT TO hr IDENTIFIED BY password\n   USING 'local';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-DATABASE-LINK-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-DATABASE-LINK.html\nSELECT * FROM employees@local;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-DATABASE-LINK-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-DATABASE-LINK.html\nINSERT INTO employees@local\n   (employee_id, last_name, email, hire_date, job_id)\n   VALUES (999, 'Claus', 'sclaus@example.com', SYSDATE, 'SH_CLERK');\nUPDATE jobs@local SET min_salary = 3000\n   WHERE job_id = 'SH_CLERK';\nDELETE FROM employees@local \n   WHERE employee_id = 999;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-DATABASE-LINK-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-DATABASE-LINK.html\nSELECT * FROM oe.customers@local;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-DATABASE-LINK-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-DATABASE-LINK.html\nCREATE DATABASE LINK remote.us.example.com\n   CONNECT TO CURRENT_USER\n   USING 'remote';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-DATABASE-LINK-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-DATABASE-LINK.html\nCREATE SYNONYM emp_table \n   FOR oe.employees@remote.us.example.com;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-DIMENSION-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-DIMENSION.html\nCREATE DIMENSION customers_dim \n   LEVEL customer   IS (customers.cust_id)\n   LEVEL city       IS (customers.cust_city) \n   LEVEL state      IS (customers.cust_state_province) \n   LEVEL country    IS (countries.country_id) \n   LEVEL subregion  IS (countries.country_subregion) \n   LEVEL region     IS (countries.country_region) \n   HIERARCHY geog_rollup (\n      customer      CHILD OF\n      city          CHILD OF \n      state         CHILD OF \n      country       CHILD OF \n      subregion     CHILD OF \n      region \n   JOIN KEY (customers.country_id) REFERENCES country\n   )\n   ATTRIBUTE customer DETERMINES\n   (cust_first_name, cust_last_name, cust_gender, \n    cust_marital_status, cust_year_of_birth, \n    cust_income_level, cust_credit_limit) \n   ATTRIBUTE country DETERMINES (countries.country_name)\n;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-DIMENSION-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-DIMENSION.html\nCREATE DIMENSION customers_dim \n   LEVEL customer   IS (customers.cust_id)\n   LEVEL city       IS (customers.cust_city) \n   LEVEL state      IS (customers.cust_state_province) \n   LEVEL country    IS (countries.country_id) \n   LEVEL subregion  IS (countries.country_subregion) \n   LEVEL region     IS (countries.country_region) \n   HIERARCHY geog_rollup (\n      customer      CHILD OF\n      city          CHILD OF \n      state         CHILD OF \n      country       CHILD OF \n      subregion     CHILD OF \n      region \n   JOIN KEY (customers.country_id) REFERENCES country\n   )\n   ATTRIBUTE customer_info LEVEL customer DETERMINES\n   (cust_first_name, cust_last_name, cust_gender, \n    cust_marital_status, cust_year_of_birth, \n    cust_income_level, cust_credit_limit) \n   ATTRIBUTE country DETERMINES (countries.country_name);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-DIMENSION-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-DIMENSION.html\nCREATE DIMENSION customers_dim\n   LEVEL customer IS (customers.cust_id)\n   LEVEL status IS (customers.cust_marital_status) SKIP WHEN NULL\n   LEVEL city IS (customers.cust_city)\n   LEVEL state IS (customers.cust_state_province)\n   LEVEL country IS (countries.country_id)\n   LEVEL subregion IS (countries.country_subregion) SKIP WHEN NULL\n   LEVEL region IS (countries.country_region)\n   HIERARCHY geog_rollup (\n      customer CHILD OF\n      city CHILD OF\n      state CHILD OF\n      country CHILD OF\n      subregion CHILD OF\n      region\n   JOIN KEY (customers.country_id) REFERENCES country\n   )\n   ATTRIBUTE customer DETERMINES\n   (cust_first_name, cust_last_name, cust_gender,\n    cust_marital_status, cust_year_of_birth,\n    cust_income_level, cust_credit_limit)\n   ATTRIBUTE country DETERMINES (countries.country_name)\n;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-DIRECTORY-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-DIRECTORY.html\nCREATE DIRECTORY mydir AS '/scratch/data/file_data';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-DIRECTORY-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-DIRECTORY.html\nCREATE DIRECTORY mydir AS '/scratch/../file_data';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-DIRECTORY-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-DIRECTORY.html\nCREATE DIRECTORY admin AS '/disk1/oracle/admin';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-DIRECTORY-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-DIRECTORY.html\nCREATE OR REPLACE DIRECTORY bfile_dir AS '/usr/bin/bfile_dir';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-DISKGROUP-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-DISKGROUP.html\nCREATE DISKGROUP dgroup_01\n  EXTERNAL REDUNDANCY\n  DISK '/devices/disks/c*';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-EDITION-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-EDITION.html\nGRANT CREATE ANY EDITION, DROP ANY EDITION to HR;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-EDITION-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-EDITION.html\nCREATE EDITION test_ed;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-EDITION-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-EDITION.html\nSELECT SYS_CONTEXT('userenv', 'current_edition_name') FROM DUAL;\nCREATE EDITIONING VIEW e_view AS\n  SELECT last_name, first_name, email FROM employees;\nDESCRIBE e_view\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-EDITION-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-EDITION.html\nALTER SESSION SET EDITION = TEST_ED;\nCREATE OR REPLACE EDITIONING VIEW e_view AS\n  SELECT last_name, first_name, email, salary FROM employees;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-EDITION-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-EDITION.html\nDESCRIBE e_view\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-EDITION-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-EDITION.html\nALTER SESSION SET EDITION = ora$base;\nDESCRIBE e_view;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-EDITION-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-EDITION.html\nALTER SESSION SET EDITION = TEST_ED;\nDROP VIEW e_view;\nALTER SESSION SET EDITION = ORA$BASE;\nDESCRIBE e_view;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-EDITION-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-EDITION.html\nDROP EDITION TEST_ED;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-FLASHBACK-ARCHIVE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-FLASHBACK-ARCHIVE.html\nCREATE FLASHBACK ARCHIVE DEFAULT test_archive1\n   TABLESPACE example\n   QUOTA 1 M\n   RETENTION 1 DAY;\nCREATE FLASHBACK ARCHIVE test_archive2\n   TABLESPACE example\n   QUOTA 1 M\n   RETENTION 1 DAY;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-FLASHBACK-ARCHIVE-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-FLASHBACK-ARCHIVE.html\nALTER TABLE oe.customers\n   FLASHBACK ARCHIVE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-FLASHBACK-ARCHIVE-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-FLASHBACK-ARCHIVE.html\nALTER TABLE oe.orders\n   FLASHBACK ARCHIVE test_archive2;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-FLASHBACK-ARCHIVE-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-FLASHBACK-ARCHIVE.html\nDROP FLASHBACK ARCHIVE test_archive2;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-HIERARCHY-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-HIERARCHY.html\nCREATE OR REPLACE HIERARCHY time_hier  -- Hierarchy name\nUSING time_attr_dim               -- Refers to TIME_ATTR_DIM attribute dimension\n (month CHILD OF                  -- Months in the attribute dimension\n quarter CHILD OF\n year);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-HIERARCHY-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-HIERARCHY.html\nCREATE OR REPLACE HIERARCHY product_hier\nUSING product_attr_dim\n (category\n  CHILD OF department);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-HIERARCHY-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-HIERARCHY.html\nCREATE OR REPLACE HIERARCHY geography_hier\nUSING geography_attr_dim\n (state_province\n  CHILD OF country\n  CHILD OF region);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-INDEX-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-INDEX.html\nCREATE MULTIVALUE INDEX mvi_1 ON mytable t\n      (t.jcol.credit_score.numberOnly());"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-INDEX-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-INDEX.html\nCREATE INDEX area_index ON xwarehouses e \n   (EXTRACTVALUE(VALUE(e),'/Warehouse/Area'));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-INDEX-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-INDEX.html\nSELECT e.getClobVal() AS warehouse\n   FROM xwarehouses e\n   WHERE EXISTSNODE(VALUE(e),'/Warehouse[Area>50000]') = 1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-INDEX-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-INDEX.html\nCREATE INDEX upper_ix ON employees (UPPER(last_name));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-INDEX-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-INDEX.html\nSELECT first_name, last_name \n   FROM employees WHERE UPPER(last_name) IS NOT NULL\n   ORDER BY UPPER(last_name);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-INDEX-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-INDEX.html\nCREATE INDEX income_ix \n   ON employees(salary + (salary*commission_pct));\nSELECT first_name||' '||last_name \"Name\"\n   FROM employees \n   WHERE (salary*commission_pct) + salary > 15000\n   ORDER BY employee_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-INDEX-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-INDEX.html\nCREATE INDEX src_idx ON print_media(text_length(ad_sourcetext));\nSELECT product_id FROM print_media \n   WHERE text_length(ad_sourcetext) < 1000\n   ORDER BY product_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-INDEX-16.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-INDEX.html\nCREATE TYPE rectangle AS OBJECT  \n( length   NUMBER, \n  width    NUMBER, \n  MEMBER FUNCTION area RETURN NUMBER DETERMINISTIC \n); \n\nCREATE OR REPLACE TYPE BODY rectangle AS \n  MEMBER FUNCTION area RETURN NUMBER IS \n  BEGIN \n   RETURN (length*width); \n  END; \nEND;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-INDEX-17.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-INDEX.html\nCREATE TABLE rect_tab OF rectangle;\nCREATE INDEX area_idx ON rect_tab x (x.area());"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-INDEX-18.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-INDEX.html\nSELECT * FROM rect_tab x WHERE x.area() > 100;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-INDEX-19.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-INDEX.html\nCREATE UNIQUE INDEX promo_ix ON orders\n   (CASE WHEN promotion_id =2 THEN customer_id ELSE NULL END,\n    CASE WHEN promotion_id = 2 THEN promotion_id ELSE NULL END);\nINSERT INTO orders (order_id, order_date, customer_id, order_total, promotion_id)\n   VALUES (2459, systimestamp, 106, 251, 2);\nINSERT INTO orders (order_id, order_date, customer_id, order_total, promotion_id)\n   VALUES (2460, systimestamp+1, 106, 110, 2);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-INDEX-20.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-INDEX.html\nCREATE INDEX cost_ix ON sales (amount_sold)\n   GLOBAL PARTITION BY RANGE (amount_sold)\n      (PARTITION p1 VALUES LESS THAN (1000),\n       PARTITION p2 VALUES LESS THAN (2500),\n       PARTITION p3 VALUES LESS THAN (MAXVALUE));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-INDEX-21.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-INDEX.html\nCREATE INDEX cust_last_name_ix ON customers (cust_last_name)\n  GLOBAL PARTITION BY HASH (cust_last_name)\n  PARTITIONS 4;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-INDEX-22.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-INDEX.html\nCREATE INDEX prod_idx ON hash_products(category_id) LOCAL\n   STORE IN (tbs_01, tbs_02);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-INDEX-23.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-INDEX.html\nCREATE INDEX sales_ix ON composite_sales(time_id, prod_id)\n   STORAGE (INITIAL 1M)\n   LOCAL\n   (PARTITION q1_1998,\n    PARTITION q2_1998,\n    PARTITION q3_1998,\n    PARTITION q4_1998,\n    PARTITION q1_1999,\n    PARTITION q2_1999,\n    PARTITION q3_1999,\n    PARTITION q4_1999,\n    PARTITION q1_2000,\n    PARTITION q2_2000\n      (SUBPARTITION pq2001, SUBPARTITION pq2002, \n       SUBPARTITION pq2003, SUBPARTITION pq2004,\n       SUBPARTITION pq2005, SUBPARTITION pq2006, \n       SUBPARTITION pq2007, SUBPARTITION pq2008),\n    PARTITION q3_2000\n      (SUBPARTITION c1 TABLESPACE tbs_02, \n       SUBPARTITION c2 TABLESPACE tbs_02, \n       SUBPARTITION c3 TABLESPACE tbs_02,\n       SUBPARTITION c4 TABLESPACE tbs_02,\n       SUBPARTITION c5 TABLESPACE tbs_02),\n    PARTITION q4_2000\n      (SUBPARTITION pq4001 TABLESPACE tbs_03, \n       SUBPARTITION pq4002 TABLESPACE tbs_03,\n       SUBPARTITION pq4003 TABLESPACE tbs_03,\n       SUBPARTITION pq4004 TABLESPACE tbs_03)\n);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-INDEX-24.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-INDEX.html\nCREATE BITMAP INDEX product_bm_ix \n   ON hash_products(list_price)\n   LOCAL(PARTITION ix_p1 TABLESPACE tbs_01,\n         PARTITION ix_p2,\n         PARTITION ix_p3 TABLESPACE tbs_02,\n         PARTITION ix_p4 TABLESPACE tbs_03)\n   TABLESPACE tbs_04;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-INDEX-25.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-INDEX.html\nCREATE TABLE hash_products\n    ( product_id          NUMBER(6)\n    , product_name        VARCHAR2(50)\n    , product_description VARCHAR2(2000)\n    , category_id         NUMBER(2)\n    , weight_class        NUMBER(1)\n    , warranty_period     INTERVAL YEAR TO MONTH\n    , supplier_id         NUMBER(6)\n    , product_status      VARCHAR2(20)\n    , list_price          NUMBER(8,2)\n    , min_price           NUMBER(8,2)\n    , catalog_url         VARCHAR2(50)\n    , CONSTRAINT          pk_product_id PRIMARY KEY (product_id)\n    , CONSTRAINT          product_status_lov_demo\n                          CHECK (product_status in ('orderable'\n                                                  ,'planned'\n                                                  ,'under development'\n                                                  ,'obsolete')\n ) )\n PARTITION BY HASH (product_id)\n PARTITIONS 5\n STORE IN (example);\nCREATE TABLE sales_quota\n    ( product_id          NUMBER(6)\n    , customer_name       VARCHAR2(50)  \n    , order_qty           NUMBER(6)\n  ,CONSTRAINT u_product_id UNIQUE(product_id)\n );\nCREATE BITMAP INDEX product_bm_ix\n   ON hash_products(list_price)\n   FROM hash_products h, sales_quota s\n   WHERE h.product_id = s.product_id\n   LOCAL(PARTITION ix_p1 TABLESPACE example,\n         PARTITION ix_p2,\n         PARTITION ix_p3 TABLESPACE example,\n         PARTITION ix_p4,\n         PARTITION ix_p5 TABLESPACE example)\n   TABLESPACE example;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-INDEX-26.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-INDEX.html\nCREATE UNIQUE INDEX nested_tab_ix\n      ON textdocs_nestedtab(NESTED_TABLE_ID, document_typ);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-INDEX-27.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-INDEX.html\nCREATE INDEX salary_i \n   ON books (TREAT(author AS employee_t).salary);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-INDEX-28.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-INDEX.html\nCREATE INDEX salary_func_i ON persons p\n   (TREAT(VALUE(p) AS part_time_emp_t).salary);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-INDEX-29.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-INDEX.html\nCREATE BITMAP INDEX typeid_i ON books (SYS_TYPEID(author));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-INDEX-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-INDEX.html\nCREATE INDEX cust_eff_ix ON customers\n  (NVL(cust_eff_to, TO_DATE('9000-01-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss')));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-INDEX-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-INDEX.html\nSELECT column_expression\n  FROM all_ind_expressions\n  WHERE index_name='CUST_EFF_IX';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-INDEX-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-INDEX.html\nCREATE INDEX ord_customer_ix\n   ON orders (customer_id);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-INDEX-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-INDEX.html\nCREATE INDEX ord_customer_ix_demo \n   ON orders (customer_id, sales_rep_id)\n   COMPRESS 1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-INDEX-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-INDEX.html\nCREATE INDEX ord_customer_ix_demo\n   ON orders (order_mode)\n   NOSORT\n   NOLOGGING;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-INDEX-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-INDEX.html\nCREATE INDEX idx_personnel ON CLUSTER personnel;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-INDEXTYPE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-INDEXTYPE.html\nCREATE INDEXTYPE position_indextype\n   FOR position_between(NUMBER, NUMBER, NUMBER)\n   USING position_im;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-INMEMORY-JOIN-GROUP-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-INMEMORY-JOIN-GROUP.html\nCREATE INMEMORY JOIN GROUP prod_id1\n  (inventories(product_id), order_items(product_id));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-INMEMORY-JOIN-GROUP-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-INMEMORY-JOIN-GROUP.html\nCREATE INMEMORY JOIN GROUP prod_id2\n  (inventories(product_id), pm.online_media(product_id));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-JAVA-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-JAVA.html\nSELECT LOB FROM CREATE$JAVA$LOB$TABLE \n   WHERE NAME = 'key_for_BLOB';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-JAVA-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-JAVA.html\nCREATE JAVA CLASS USING BFILE (java_dir, 'Agent.class')\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-JAVA-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-JAVA.html\nCREATE JAVA SOURCE NAMED \"Welcome\" AS\n   public class Welcome {\n      public static String welcome() {\n         return \"Welcome World\";   } }/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-JAVA-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-JAVA.html\nCREATE JAVA RESOURCE NAMED \"appText\" \n   USING BFILE (java_dir, 'textBundle.dat')\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-LOCKDOWN-PROFILE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-LOCKDOWN-PROFILE.html\nCREATE LOCKDOWN PROFILE hr_prof INCLUDING PRIVATE_DBAAS;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-MATERIALIZED-VIEW-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-MATERIALIZED-VIEW.html\nCREATE MATERIALIZED VIEW mv1 AS SELECT * FROM hr.employees;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-MATERIALIZED-VIEW-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-MATERIALIZED-VIEW.html\nCREATE MATERIALIZED VIEW foreign_customers\n   AS SELECT * FROM sh.customers@remote cu\n   WHERE EXISTS\n     (SELECT * FROM sh.countries@remote co\n      WHERE co.country_id = cu.country_id);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-MATERIALIZED-VIEW-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-MATERIALIZED-VIEW.html\nCREATE MATERIALIZED VIEW my_warranty_orders\n   AS SELECT w.order_id, w.line_item_id, o.order_date\n   FROM warranty_orders w, orders o\n   WHERE o.order_id = o.order_id\n   AND o.sales_rep_id = 165;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-MATERIALIZED-VIEW-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-MATERIALIZED-VIEW.html\nCREATE MATERIALIZED VIEW MView1 ANNOTATIONS (Title 'Tab1 MV1', ADD Snapshot) AS SELECT * from Table1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-MATERIALIZED-VIEW-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-MATERIALIZED-VIEW.html\nCREATE MATERIALIZED VIEW MView1(T ANNOTATIONS (Hidden)) ANNOTATIONS (Title 'Tab1 MV1', ADD Snapshot) \n   AS SELECT * from Table1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-MATERIALIZED-VIEW-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-MATERIALIZED-VIEW.html\nCREATE MATERIALIZED VIEW LOG ON times\n   WITH ROWID, SEQUENCE (time_id, calendar_year)\n   INCLUDING NEW VALUES;\nCREATE MATERIALIZED VIEW LOG ON products\n   WITH ROWID, SEQUENCE (prod_id)\n   INCLUDING NEW VALUES;\nCREATE MATERIALIZED VIEW sales_mv\n   BUILD IMMEDIATE\n   REFRESH FAST ON COMMIT\n   AS SELECT t.calendar_year, p.prod_id, \n      SUM(s.amount_sold) AS sum_sales\n      FROM times t, products p, sales s\n      WHERE t.time_id = s.time_id AND p.prod_id = s.prod_id\n      GROUP BY t.calendar_year, p.prod_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-MATERIALIZED-VIEW-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-MATERIALIZED-VIEW.html\nCREATE MATERIALIZED VIEW sales_by_month_by_state\n     TABLESPACE example\n     PARALLEL 4\n     BUILD IMMEDIATE\n     REFRESH COMPLETE\n     ENABLE QUERY REWRITE\n     AS SELECT t.calendar_month_desc, c.cust_state_province,\n        SUM(s.amount_sold) AS sum_sales\n        FROM times t, sales s, customers c\n        WHERE s.time_id = t.time_id AND s.cust_id = c.cust_id\n        GROUP BY t.calendar_month_desc, c.cust_state_province;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-MATERIALIZED-VIEW-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-MATERIALIZED-VIEW.html\nCREATE TABLE sales_sum_table\n   (month VARCHAR2(8), state VARCHAR2(40), sales NUMBER(10,2));\nCREATE MATERIALIZED VIEW sales_sum_table\n   ON PREBUILT TABLE WITH REDUCED PRECISION\n   ENABLE QUERY REWRITE\n   AS SELECT t.calendar_month_desc AS month, \n             c.cust_state_province AS state,\n             SUM(s.amount_sold) AS sales\n      FROM times t, customers c, sales s\n      WHERE s.time_id = t.time_id AND s.cust_id = c.cust_id\n      GROUP BY t.calendar_month_desc, c.cust_state_province;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-MATERIALIZED-VIEW-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-MATERIALIZED-VIEW.html\nCREATE MATERIALIZED VIEW catalog   \n   REFRESH FAST START WITH SYSDATE NEXT SYSDATE + 1/4096 \n   WITH PRIMARY KEY \n   AS SELECT * FROM product_information;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-MATERIALIZED-VIEW-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-MATERIALIZED-VIEW.html\nCREATE MATERIALIZED VIEW order_data REFRESH WITH ROWID \n   AS SELECT * FROM orders;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-MATERIALIZED-VIEW-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-MATERIALIZED-VIEW.html\nCREATE MATERIALIZED VIEW LOG ON employees\n   WITH PRIMARY KEY\n   INCLUDING NEW VALUES;\nCREATE MATERIALIZED VIEW emp_data \n   PCTFREE 5 PCTUSED 60 \n   TABLESPACE example \n   STORAGE (INITIAL 50K)\n   REFRESH FAST NEXT sysdate + 7 \n   AS SELECT * FROM employees;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-MATERIALIZED-VIEW-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-MATERIALIZED-VIEW.html\nCREATE MATERIALIZED VIEW all_customers\n   PCTFREE 5 PCTUSED 60 \n   TABLESPACE example \n   STORAGE (INITIAL 50K) \n   USING INDEX STORAGE (INITIAL 25K)\n   REFRESH START WITH ROUND(SYSDATE + 1) + 11/24 \n   NEXT NEXT_DAY(TRUNC(SYSDATE), 'MONDAY') + 15/24 \n   AS SELECT * FROM sh.customers@remote \n         UNION\n      SELECT * FROM sh.customers@local;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-MATERIALIZED-VIEW-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-MATERIALIZED-VIEW.html\nCREATE MATERIALIZED VIEW LOG ON inventories\n   WITH (quantity_on_hand);\nCREATE MATERIALIZED VIEW warranty_orders REFRESH FAST AS\n  SELECT order_id, line_item_id, product_id FROM order_items o\n    WHERE EXISTS\n    (SELECT * FROM inventories i WHERE o.product_id = i.product_id\n      AND i.quantity_on_hand IS NOT NULL)\n  UNION\n    SELECT order_id, line_item_id, product_id FROM order_items\n    WHERE quantity > 5;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-MATERIALIZED-VIEW-LOG-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-MATERIALIZED-VIEW-LOG.html\nCREATE MATERIALIZED VIEW LOG ON customers\n   PCTFREE 5 \n   TABLESPACE example \n   STORAGE (INITIAL 10K);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-MATERIALIZED-VIEW-LOG-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-MATERIALIZED-VIEW-LOG.html\nCREATE MATERIALIZED VIEW LOG ON customers WITH PRIMARY KEY, ROWID;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-MATERIALIZED-VIEW-LOG-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-MATERIALIZED-VIEW-LOG.html\nCREATE MATERIALIZED VIEW LOG ON orders\n  PCTFREE 5\n  TABLESPACE example\n  STORAGE (INITIAL 10K)\n  PURGE REPEAT INTERVAL '5' DAY;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-MATERIALIZED-VIEW-LOG-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-MATERIALIZED-VIEW-LOG.html\nCREATE MATERIALIZED VIEW LOG ON sales \n   WITH ROWID, SEQUENCE(amount_sold, time_id, prod_id)\n   INCLUDING NEW VALUES;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-MATERIALIZED-VIEW-LOG-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-MATERIALIZED-VIEW-LOG.html\nCREATE MATERIALIZED VIEW LOG ON order_items WITH (product_id);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-MATERIALIZED-VIEW-LOG-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-MATERIALIZED-VIEW-LOG.html\nCREATE MATERIALIZED VIEW LOG ON product_information \n   WITH ROWID, SEQUENCE (list_price, min_price, category_id), PRIMARY KEY\n   INCLUDING NEW VALUES;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-MATERIALIZED-VIEW-LOG-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-MATERIALIZED-VIEW-LOG.html\nCREATE MATERIALIZED VIEW products_mv \n   REFRESH FAST ON COMMIT\n   AS SELECT SUM(list_price - min_price), category_id\n         FROM product_information \n         GROUP BY category_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-MATERIALIZED-VIEW-LOG-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-MATERIALIZED-VIEW-LOG.html\nCREATE MATERIALIZED VIEW LOG ON sales\n   PCTFREE 5 \n   TABLESPACE example \n   STORAGE (INITIAL 10K)\n   FOR SYNCHRONOUS REFRESH USING mystage_log;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-MATERIALIZED-ZONEMAP-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-MATERIALIZED-ZONEMAP.html\nCREATE MATERIALIZED ZONEMAP sales_zmap\n  ON sales(cust_id, prod_id);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-MATERIALIZED-ZONEMAP-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-MATERIALIZED-ZONEMAP.html\nCREATE MATERIALIZED ZONEMAP sales_zmap\n  AS SELECT SYS_OP_ZONE_ID(rowid),\n            MIN(cust_id), MAX(cust_id),\n            MIN(prod_id), MAX(prod_id)\n     FROM sales\n     GROUP BY SYS_OP_ZONE_ID(rowid);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-MATERIALIZED-ZONEMAP-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-MATERIALIZED-ZONEMAP.html\nCREATE MATERIALIZED ZONEMAP sales_zmap\n  AS SELECT SYS_OP_ZONE_ID(s.rowid),\n            MIN(cust_state_province), MAX(cust_state_province),\n            MIN(cust_city), MAX(cust_city)\n     FROM sales s\n          LEFT OUTER JOIN customers c ON s.cust_id = c.cust_id\n     GROUP BY SYS_OP_ZONE_ID(s.rowid);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-MATERIALIZED-ZONEMAP-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-MATERIALIZED-ZONEMAP.html\nCREATE MATERIALIZED ZONEMAP sales_zmap\n  AS SELECT SYS_OP_ZONE_ID(s.rowid),\n            MIN(prod_category), MAX(prod_category),\n            MIN(prod_subcategory), MAX(prod_subcategory),\n            MIN(country_id), MAX(country_id),\n            MIN(cust_state_province), MAX(cust_state_province),\n            MIN(cust_city), MAX(cust_city)\n    FROM sales s\n       LEFT OUTER JOIN products p ON s.prod_id = p.prod_id\n       LEFT OUTER JOIN customers c ON s.cust_id = c.cust_id\n    GROUP BY sys_op_zone_id(s.rowid);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-MATERIALIZED-ZONEMAP-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-MATERIALIZED-ZONEMAP.html\nCREATE MATERIALIZED ZONEMAP sales_zmap\n  AS SELECT SYS_OP_ZONE_ID(s.rowid),\n            MIN(prod_category), MAX(prod_category),\n            MIN(prod_subcategory), MAX(prod_subcategory),\n            MIN(country_id), MAX(country_id),\n            MIN(cust_state_province), MAX(cust_state_province),\n            MIN(cust_city), MAX(cust_city)\n     FROM sales s, products p, customers c\n     WHERE s.prod_id = p.prod_id(+) AND\n           s.cust_id = c.cust_id(+)\n     GROUP BY sys_op_zone_id(s.rowid);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-OPERATOR-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-OPERATOR.html\nCREATE FUNCTION eq_f(a VARCHAR2, b VARCHAR2) RETURN NUMBER AS\nBEGIN\n   IF a = b THEN RETURN 1;\n   ELSE RETURN 0;\n   END IF;\nEND;\n/\nCREATE OPERATOR eq_op\n   BINDING (VARCHAR2, VARCHAR2) \n   RETURN NUMBER \n   USING eq_f;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-OUTLINE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-OUTLINE.html\nCREATE OUTLINE salaries FOR CATEGORY special\n   ON SELECT last_name, salary FROM employees;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-OUTLINE-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-OUTLINE.html\nCREATE OR REPLACE PRIVATE OUTLINE my_salaries\n   FROM salaries;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-OUTLINE-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-OUTLINE.html\nCREATE OR REPLACE OUTLINE public_salaries \n   FROM PRIVATE my_salaries;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-PFILE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-PFILE.html\nCREATE PFILE = 'my_init.ora' FROM SPFILE = 's_params.ora';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-PLUGGABLE-DATABASE-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-PLUGGABLE-DATABASE.html\nCREATE PLUGGABLE DATABASE newpdb FROM salespdb\n  FILE_NAME_CONVERT = ('/disk1/oracle/dbs/salespdb/', '/disk1/oracle/dbs/newpdb/')\n  PATH_PREFIX = '/disk1/oracle/dbs/newpdb';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-PLUGGABLE-DATABASE-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-PLUGGABLE-DATABASE.html\nCREATE PLUGGABLE DATABASE salespdb\n  USING '/disk1/usr/salespdb.xml'\n  SOURCE_FILE_NAME_CONVERT =\n    ('/disk1/oracle/dbs/salespdb/', '/disk2/oracle/dbs/salespdb/')\n  NOCOPY\n  STORAGE (MAXSIZE 2G)\n  TEMPFILE REUSE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-PLUGGABLE-DATABASE-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-PLUGGABLE-DATABASE.html\nCREATE PLUGGABLE DATABASE CDB1_PDB2_C AS CLONE USING '/tmp/cdb1_pdb2.pdb'"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-PLUGGABLE-DATABASE-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-PLUGGABLE-DATABASE.html\n    ALTER PLUGGABLE DATABASE cdb1_pdb3 OPEN"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-PLUGGABLE-DATABASE-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-PLUGGABLE-DATABASE.html\nSELECT partition_name, high_value\n    FROM dba_tab_partitions\n    WHERE table_name='MAP' AND table_owner='SYS'"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-PLUGGABLE-DATABASE-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-PLUGGABLE-DATABASE.html\nCREATE PLUGGABLE DATABASE salespdb\n  ADMIN USER salesadm IDENTIFIED BY password\n  ROLES = (dba)\n  DEFAULT TABLESPACE sales\n    DATAFILE '/disk1/oracle/dbs/salespdb/sales01.dbf' SIZE 250M AUTOEXTEND ON\n  FILE_NAME_CONVERT = ('/disk1/oracle/dbs/pdbseed/',\n                       '/disk1/oracle/dbs/salespdb/')\n  STORAGE (MAXSIZE 2G)\n  PATH_PREFIX = '/disk1/oracle/dbs/salespdb/';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-PROFILE-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-PROFILE.html\nCREATE MANDATORY PROFILE c##cdb_profile LIMIT PASSWORD_VERIFY_FUNCTION my_mandatory_function\n     CONTAINER = ALL ;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-PROFILE-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-PROFILE.html\nALTER SYSTEM SET MANDATORY_USER_PROFILE=c##cdb_profile;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-PROFILE-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-PROFILE.html\nCREATE PROFILE usr_prof LIMIT PASSWORD_ROLLOVER_TIME 1"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-PROFILE-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-PROFILE.html\nCREATE PROFILE new_profile\n  LIMIT PASSWORD_REUSE_MAX 10\n        PASSWORD_REUSE_TIME 30;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-PROFILE-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-PROFILE.html\nCREATE PROFILE app_user LIMIT \n   SESSIONS_PER_USER          UNLIMITED \n   CPU_PER_SESSION            UNLIMITED \n   CPU_PER_CALL               3000 \n   CONNECT_TIME               45 \n   LOGICAL_READS_PER_SESSION  DEFAULT \n   LOGICAL_READS_PER_CALL     1000 \n   PRIVATE_SGA                15K\n   COMPOSITE_LIMIT            5000000;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-PROFILE-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-PROFILE.html\nCREATE PROFILE app_user2 LIMIT\n   FAILED_LOGIN_ATTEMPTS 5\n   PASSWORD_LIFE_TIME 60\n   PASSWORD_REUSE_TIME 60\n   PASSWORD_REUSE_MAX 5\n   PASSWORD_VERIFY_FUNCTION ora12c_verify_function\n   PASSWORD_LOCK_TIME 1/24\n   PASSWORD_GRACE_TIME 10\n   INACTIVE_ACCOUNT_TIME 30;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-RESTORE-POINT-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-RESTORE-POINT.html\nCREATE RESTORE POINT good_data;\nSELECT salary FROM employees WHERE employee_id = 108;\nUPDATE employees SET salary = salary*10\n   WHERE employee_id = 108;\nSELECT salary FROM employees\n   WHERE employee_id = 108;\nCOMMIT;\nFLASHBACK TABLE employees TO RESTORE POINT good_data;\nSELECT salary FROM employees\n   WHERE employee_id = 108;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-ROLE-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-ROLE.html\nCREATE ROLE widget_sales_role IDENTIFIED GLOBALLY AS 'AZURE_ROLE=WidgetManagerGroup';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-ROLE-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-ROLE.html\nCREATE ROLE dw_manager;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-ROLE-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-ROLE.html\nCREATE ROLE dw_manager\n   IDENTIFIED BY warehouse;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-ROLE-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-ROLE.html\nCREATE ROLE warehouse_user IDENTIFIED GLOBALLY;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-ROLE-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-ROLE.html\nCREATE ROLE warehouse_user IDENTIFIED EXTERNALLY;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-ROLE-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-ROLE.html\nCREATE ROLE role1 CONTAINER = CURRENT;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-ROLE-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-ROLE.html\nCREATE ROLE c##role1 CONTAINER = ALL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-ROLLBACK-SEGMENT-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-ROLLBACK-SEGMENT.html\nCREATE TABLESPACE rbs_ts\n   DATAFILE 'rbs01.dbf' SIZE 10M\n   EXTENT MANAGEMENT LOCAL UNIFORM SIZE 100K;\nCREATE ROLLBACK SEGMENT rbs_one\n   TABLESPACE rbs_ts;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-ROLLBACK-SEGMENT-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-ROLLBACK-SEGMENT.html\nCREATE ROLLBACK SEGMENT rbs_one\n   TABLESPACE rbs_ts\n   STORAGE\n   ( INITIAL 10K );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-SCHEMA-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-SCHEMA.html\nCREATE SCHEMA AUTHORIZATION oe\n   CREATE TABLE new_product \n      (color VARCHAR2(10)  PRIMARY KEY, quantity NUMBER) \n   CREATE VIEW new_product_view \n      AS SELECT color, quantity FROM new_product WHERE color = 'RED' \n   GRANT select ON new_product_view TO hr;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-SEQUENCE-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-SEQUENCE.html\nSELECT mysequence.nextval FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-SEQUENCE-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-SEQUENCE.html\nSELECT mysequence.nextval FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-SEQUENCE-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-SEQUENCE.html\nCREATE SEQUENCE customers_seq\n START WITH     1000\n INCREMENT BY   1\n NOCACHE\n NOCYCLE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-SPFILE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-SPFILE.html\nCREATE SPFILE \n   FROM PFILE = '$ORACLE_HOME/work/t_init1.ora';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-SPFILE-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-SPFILE.html\nSTARTUP\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-SPFILE-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-SPFILE.html\nCREATE SPFILE = 's_params.ora' \n   FROM PFILE = '$ORACLE_HOME/work/t_init1.ora';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-SPFILE-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-SPFILE.html\nSTARTUP PFILE=new_param.ora\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-SYNONYM-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-SYNONYM.html\nCREATE SYNONYM offices \n   FOR hr.locations;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-SYNONYM-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-SYNONYM.html\nCREATE PUBLIC SYNONYM emp_table \n   FOR hr.employees@remote.us.example.com;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-SYNONYM-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-SYNONYM.html\nCREATE PUBLIC SYNONYM customers FOR oe.customers;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-SYNONYM-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-SYNONYM.html\nSELECT COUNT(*) FROM customers;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-SYNONYM-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-SYNONYM.html\nSELECT COUNT(*) FROM oe.customers;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-SYNONYM-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-SYNONYM.html\nSELECT COUNT(*) FROM customers;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\ncreate or replace trigger t1_t \nbefore insert or update on t1 for each row\nbegin\n  :new.c2 := NULL;\nend;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE IMMUTABLE TABLE trade_ledger (tr_id NUMBER, user_name VARCHAR2(40), tr_value NUMBER)\n\n       NO DROP UNTIL 40 DAYS IDLE   \n\n       NO DELETE UNTIL 100 DAYS AFTER INSERT;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE j_purchaseorder\n        (id VARCHAR2 (32) NOT NULL PRIMARY KEY,\n         date_loaded TIMESTAMP (6) WITH TIME ZONE,\n         po_document JSON );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE SHARDED TABLE departments\n    ( department_id  NUMBER(6)\n    , department_name VARCHAR2(30) CONSTRAINT dept_name_nn NOT NULL\n    , manager_id    NUMBER(6)\n    , location_id   NUMBER(4)\n    , CONSTRAINT dept_id_pk PRIMARY KEY(department_id)\n    )\n    PARTITION BY DIRECTORY (department_id)\n    (\n      PARTITION p_1 TABLESPACE tbs1,\n      PARTITION p_2 TABLESPACE tbs2\n    );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE staging_table (col1 number, col2 varchar2(100)) FOR STAGING;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE part_staging_table (col1 number, col2 varchar2(100))\nPARTITION BY RANGE (col1) (PARTITION p1 VALUES LESS THAN (100), PARTITION pmax VALUES LESS THAN (MAXVALUE)) \nFOR STAGING;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE employees_demo\n    ( employee_id    NUMBER(6)\n    , first_name     VARCHAR2(20)\n    , last_name      VARCHAR2(25) \n         CONSTRAINT emp_last_name_nn_demo NOT NULL\n    , email          VARCHAR2(25) \n         CONSTRAINT emp_email_nn_demo     NOT NULL\n    , phone_number   VARCHAR2(20)\n    , hire_date      DATE  DEFAULT SYSDATE \n         CONSTRAINT emp_hire_date_nn_demo  NOT NULL\n    , job_id         VARCHAR2(10)\n       CONSTRAINT     emp_job_nn_demo  NOT NULL\n    , salary         NUMBER(8,2)\n       CONSTRAINT     emp_salary_nn_demo  NOT NULL\n    , commission_pct NUMBER(2,2)\n    , manager_id     NUMBER(6)\n    , department_id  NUMBER(4)\n    , dn             VARCHAR2(300)\n    , CONSTRAINT     emp_salary_min_demo\n                     CHECK (salary > 0) \n    , CONSTRAINT     emp_email_uk_demo\n                     UNIQUE (email)\n    ) ;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE employees_demo\n    ( employee_id    NUMBER(6)\n    , first_name     VARCHAR2(20)\n    , last_name      VARCHAR2(25) \n         CONSTRAINT emp_last_name_nn_demo NOT NULL\n    , email          VARCHAR2(25) \n         CONSTRAINT emp_email_nn_demo     NOT NULL\n    , phone_number   VARCHAR2(20)\n    , hire_date      DATE  DEFAULT SYSDATE \n         CONSTRAINT emp_hire_date_nn_demo  NOT NULL\n    , job_id         VARCHAR2(10)\n       CONSTRAINT     emp_job_nn_demo  NOT NULL\n    , salary         NUMBER(8,2)\n       CONSTRAINT     emp_salary_nn_demo  NOT NULL\n    , commission_pct NUMBER(2,2)\n    , manager_id     NUMBER(6)\n    , department_id  NUMBER(4)\n    , dn             VARCHAR2(300)\n    , CONSTRAINT     emp_salary_min_demo\n                     CHECK (salary > 0) \n    , CONSTRAINT     emp_email_uk_demo\n                     UNIQUE (email)\n    ) \n   TABLESPACE example \n   STORAGE (INITIAL 8M);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-16.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE myemp (employee_id number, last_name varchar2(25),\n                    department_id NUMBER DEFAULT ON NULL 50 NOT NULL);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-17.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nSELECT employee_id, last_name, department_id\n  FROM employees\n  WHERE department_id IS NULL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-18.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nINSERT INTO myemp (employee_id, last_name, department_id)\n  (SELECT employee_id, last_name, department_id from employees);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-19.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nSELECT employee_id, last_name, department_id\n  FROM myemp\n  WHERE employee_id = 178;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-20.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE t1 (id NUMBER GENERATED AS IDENTITY);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-21.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE t2 (id NUMBER GENERATED BY DEFAULT AS IDENTITY (START WITH 100 INCREMENT BY 10));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-22.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE GLOBAL TEMPORARY TABLE today_sales\n   ON COMMIT PRESERVE ROWS \n   AS SELECT * FROM orders WHERE order_date = SYSDATE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-23.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE later (col1 NUMBER, col2 VARCHAR2(20))    SEGMENT CREATION DEFERRED;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-24.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TYPE person_t AS OBJECT (name VARCHAR2(100), ssn NUMBER) \n   NOT FINAL;\n/\nCREATE TYPE employee_t UNDER person_t \n   (department_id NUMBER, salary NUMBER) NOT FINAL;\n/\nCREATE TYPE part_time_emp_t UNDER employee_t (num_hrs NUMBER);\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-25.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE persons OF person_t;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-26.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE books (title VARCHAR2(100), author person_t);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-27.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE dept_80\n   PARALLEL\n   AS SELECT * FROM employees\n   WHERE department_id = 80;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-28.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE dept_80\n   AS SELECT * FROM employees\n   WHERE department_id = 80;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-29.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE departments_demo\n    ( department_id    NUMBER(4)\n    , department_name  VARCHAR2(30)\n      CONSTRAINT  dept_name_nn  NOT NULL\n    , manager_id       NUMBER(6)\n    , location_id      NUMBER(4)\n    , dn               VARCHAR2(300)\n    ) ;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-30.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE departments_demo\n    ( department_id    NUMBER(4)   PRIMARY KEY DISABLE\n    , department_name  VARCHAR2(30)\n           CONSTRAINT  dept_name_nn  NOT NULL\n    , manager_id       NUMBER(6)\n    , location_id      NUMBER(4)\n    , dn               VARCHAR2(300)\n    ) ;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-31.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE print_media\n    ( product_id        NUMBER(6)\n    , ad_id             NUMBER(6)\n    , ad_composite      BLOB\n    , ad_sourcetext     CLOB\n    , ad_finaltext      CLOB\n    , ad_fltextn        NCLOB\n    , ad_textdocs_ntab  textdoc_tab\n    , ad_photo          BLOB\n    , ad_graphic        BFILE\n    , ad_header         adheader_typ\n    ) NESTED TABLE ad_textdocs_ntab STORE AS textdocs_nestedtab;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-32.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TYPE phone AS OBJECT (telephone NUMBER);\n/\nCREATE TYPE phone_list AS TABLE OF phone;\n/\nCREATE TYPE my_customers AS OBJECT (\n   cust_name VARCHAR2(25),\n   phones phone_list);\n/\nCREATE TYPE customer_list AS TABLE OF my_customers;\n/\nCREATE TABLE business_contacts (\n   company_name VARCHAR2(25),\n   company_reps customer_list)\n   NESTED TABLE company_reps STORE AS outer_ntab\n   (NESTED TABLE phones STORE AS inner_ntab);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-33.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TYPE phone AS TABLE OF NUMBER;    \n/\nCREATE TYPE phone_list AS TABLE OF phone;\n/\nCREATE TABLE my_customers (\n   name VARCHAR2(25),\n   phone_numbers phone_list)\n   NESTED TABLE phone_numbers STORE AS outer_ntab\n   (NESTED TABLE COLUMN_VALUE STORE AS inner_ntab);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-34.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE print_media_new\n    ( product_id        NUMBER(6)\n    , ad_id             NUMBER(6)\n    , ad_composite      BLOB\n    , ad_sourcetext     CLOB\n    , ad_finaltext      CLOB\n    , ad_fltextn        NCLOB\n    , ad_textdocs_ntab  textdoc_tab\n    , ad_photo          BLOB\n    , ad_graphic        BFILE\n    , ad_header         adheader_typ\n    ) NESTED TABLE ad_textdocs_ntab STORE AS textdocs_nestedtab_new\n    LOB (ad_sourcetext, ad_finaltext) STORE AS\n      (TABLESPACE example\n       STORAGE (INITIAL 6144)\n       CHUNK 4000\n       NOCACHE LOGGING);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-35.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE countries_demo\n    ( country_id      CHAR(2)\n      CONSTRAINT country_id_nn_demo NOT NULL\n    , country_name    VARCHAR2(40)\n    , currency_name   VARCHAR2(25)\n    , currency_symbol VARCHAR2(3)\n    , region          VARCHAR2(15)\n    , CONSTRAINT    country_c_id_pk_demo\n                    PRIMARY KEY (country_id ) )\n    ORGANIZATION INDEX \n    INCLUDING   country_name \n    PCTTHRESHOLD 2 \n    STORAGE \n     ( INITIAL  4K ) \n   OVERFLOW \n    STORAGE \n      ( INITIAL  4K );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-36.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE dept_external (\n   deptno     NUMBER(6),\n   dname      VARCHAR2(20),\n   loc        VARCHAR2(25) \n)\nORGANIZATION EXTERNAL\n(TYPE oracle_loader\n DEFAULT DIRECTORY admin\n ACCESS PARAMETERS\n (\n  RECORDS DELIMITED BY newline\n  BADFILE 'ulcase1.bad'\n  DISCARDFILE 'ulcase1.dis'\n  LOGFILE 'ulcase1.log'\n  SKIP 20\n  FIELDS TERMINATED BY \",\"  OPTIONALLY ENCLOSED BY '\"'\n  (\n   deptno     INTEGER EXTERNAL(6),\n   dname      CHAR(20),\n   loc        CHAR(25)\n  )\n )\n LOCATION ('ulcase1.ctl')\n)\nREJECT LIMIT UNLIMITED;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-37.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE xwarehouses OF XMLTYPE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-38.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE xwarehouses OF XMLTYPE\n   XMLSCHEMA \"http://www.example.com/xwarehouses.xsd\"\n   ELEMENT \"Warehouse\";"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-39.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE xwarehouses (\n   warehouse_id        NUMBER,\n   warehouse_spec      XMLTYPE)\n   XMLTYPE warehouse_spec STORE AS CLOB\n   (TABLESPACE example\n    STORAGE (INITIAL 6144)\n    CHUNK 4000\n    NOCACHE LOGGING);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-40.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE xwarehouses (\n   warehouse_id    NUMBER,\n   warehouse_spec  XMLTYPE)\n   XMLTYPE warehouse_spec STORE AS OBJECT RELATIONAL\n      XMLSCHEMA \"http://www.example.com/xwarehouses.xsd\"\n      ELEMENT \"Warehouse\";"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-41.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE xwarehouses (\n  warehouse_id   NUMBER,\n  warehouse_spec XMLTYPE)\n  XMLTYPE        warehouse_spec STORE AS SECUREFILE CLOB\n  (TABLESPACE auto_seg_ts\n  STORAGE (INITIAL 6144)\n  CACHE);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-42.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE range_sales\n    ( prod_id        NUMBER(6)\n    , cust_id        NUMBER\n    , time_id        DATE\n    , channel_id     CHAR(1)\n    , promo_id       NUMBER(6)\n    , quantity_sold  NUMBER(3)\n    , amount_sold         NUMBER(10,2)\n    ) \nPARTITION BY RANGE (time_id)\n  (PARTITION SALES_Q1_1998 VALUES LESS THAN (TO_DATE('01-APR-1998','DD-MON-YYYY')),\n   PARTITION SALES_Q2_1998 VALUES LESS THAN (TO_DATE('01-JUL-1998','DD-MON-YYYY')),\n   PARTITION SALES_Q3_1998 VALUES LESS THAN (TO_DATE('01-OCT-1998','DD-MON-YYYY')),\n   PARTITION SALES_Q4_1998 VALUES LESS THAN (TO_DATE('01-JAN-1999','DD-MON-YYYY')),\n   PARTITION SALES_Q1_1999 VALUES LESS THAN (TO_DATE('01-APR-1999','DD-MON-YYYY')),\n   PARTITION SALES_Q2_1999 VALUES LESS THAN (TO_DATE('01-JUL-1999','DD-MON-YYYY')),\n   PARTITION SALES_Q3_1999 VALUES LESS THAN (TO_DATE('01-OCT-1999','DD-MON-YYYY')),\n   PARTITION SALES_Q4_1999 VALUES LESS THAN (TO_DATE('01-JAN-2000','DD-MON-YYYY')),\n   PARTITION SALES_Q1_2000 VALUES LESS THAN (TO_DATE('01-APR-2000','DD-MON-YYYY')),\n   PARTITION SALES_Q2_2000 VALUES LESS THAN (TO_DATE('01-JUL-2000','DD-MON-YYYY')),\n   PARTITION SALES_Q3_2000 VALUES LESS THAN (TO_DATE('01-OCT-2000','DD-MON-YYYY')),\n   PARTITION SALES_Q4_2000 VALUES LESS THAN (MAXVALUE))\n;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-43.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE empl_h  \n  (  \n     employee_id  NUMBER(6) PRIMARY KEY,  \n     first_name   VARCHAR2(20),  \n     last_name    VARCHAR2(25),  \n     email        VARCHAR2(25),  \n     phone_number VARCHAR2(20),  \n     hire_date    DATE DEFAULT SYSDATE,  \n     job_id       VARCHAR2(10),  \n     salary       NUMBER(8, 2),  \n     part_name    VARCHAR2(25)  \n  ) PARTITION BY RANGE (hire_date) (  \nPARTITION hire_q1 VALUES less than(to_date('01-APR-2014', 'DD-MON-YYYY')),   \nPARTITION hire_q2 VALUES less than(to_date('01-JUL-2014', 'DD-MON-YYYY')),   \nPARTITION hire_q3 VALUES less than(to_date('01-OCT-2014', 'DD-MON-YYYY')),   \nPARTITION hire_q4 VALUES less than(to_date('01-JAN-2015', 'DD-MON-YYYY'))  \n);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-44.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nINSERT INTO empl_h (employee_id, first_name, last_name, email, phone_number, hire_date, job_id, salary, Part_name)  \nVALUES (1, 'Jane', 'Doe', 'example.com', '415.555.0100', '10-Feb-2014', '1001', 5001,'HIRE_Q1');\nINSERT INTO empl_h (employee_id, first_name, last_name, email, phone_number, hire_date, job_id, salary, Part_name)  \nVALUES (2, 'John', 'Doe', 'example.net', '415.555.0101', '10-Apr-2014', '1002', 7001,'HIRE_Q2');\nINSERT INTO empl_h (employee_id, first_name, last_name, email, phone_number, hire_date, job_id, salary, Part_name)  \nVALUES (3, 'Isabelle', 'Owl', 'example.org', '415.555.0102', '10-Sep-2014', '1003', 10001,'HIRE_Q3');\nINSERT INTO empl_h (employee_id, first_name, last_name, email, phone_number, hire_date, job_id, salary, Part_name)  \nVALUES (4, 'Smith', 'Jones', 'example.in', '415.555.0103', '10-Dec-2014', '1004', 12001,'HIRE_Q4');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-45.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nSELECT PARTITION_NAME FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = 'EMPL_H';\nSELECT TABLE_NAME, PARTITIONING_TYPE, STATUS FROM USER_PART_TABLES WHERE TABLE_NAME = 'EMPL_H';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-46.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE parts (p_name) AS SELECT PARTITION_NAME FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = 'EMPL_H';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-47.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nselect * from parts;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-48.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nselect E.HIRE_DATE,E.JOB_ID,P.p_name from empl_h E, parts P where E.Part_name = P.p_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-49.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE customers_demo (\n  customer_id number(6),\n  cust_first_name varchar2(20),\n  cust_last_name varchar2(20),\n  credit_limit number(9,2))\nPARTITION BY RANGE (credit_limit)\nINTERVAL (1000)\n(PARTITION p1 VALUES LESS THAN (5001));\nINSERT INTO customers_demo\n  (customer_id, cust_first_name, cust_last_name, credit_limit)\n  (select customer_id, cust_first_name, cust_last_name, credit_limit\n  from customers);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE BLOCKCHAIN TABLE bank_ledger (bank VARCHAR2(128), account_no NUMBER, deposit_date DATE, deposit_amount NUMBER)\n  NO DROP UNTIL 31 DAYS IDLE\n  NO DELETE LOCKED\n  HASHING USING SHA2_512 WITH ROW VERSION ACCOUNT_NO (bank, account_no) VERSION V2;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-50.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nSELECT partition_name, high_value FROM user_tab_partitions  WHERE table_name = 'CUSTOMERS_DEMO';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-51.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nINSERT INTO customers_demo\n  VALUES (699, 'Fred', 'Flintstone', 5500);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-52.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nSELECT partition_name, high_value FROM user_tab_partitions\n  WHERE table_name = 'CUSTOMERS_DEMO'\n  ORDER BY partition_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-53.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE list_customers \n   ( customer_id             NUMBER(6)\n   , cust_first_name         VARCHAR2(20) \n   , cust_last_name          VARCHAR2(20)\n   , cust_address            CUST_ADDRESS_TYP\n   , nls_territory           VARCHAR2(30)\n   , cust_email              VARCHAR2(40))\n   PARTITION BY LIST (nls_territory) (\n   PARTITION asia VALUES ('CHINA', 'THAILAND'),\n   PARTITION europe VALUES ('GERMANY', 'ITALY', 'SWITZERLAND'),\n   PARTITION west VALUES ('AMERICA'),\n   PARTITION east VALUES ('INDIA'),\n   PARTITION rest VALUES (DEFAULT));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-54.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE print_media_demo\n   ( product_id NUMBER(6)\n   , ad_id NUMBER(6)\n   , ad_composite BLOB\n   , ad_sourcetext CLOB\n   , ad_finaltext CLOB\n   , ad_fltextn NCLOB\n   , ad_textdocs_ntab textdoc_tab\n   , ad_photo BLOB\n   , ad_graphic BFILE\n   , ad_header adheader_typ\n   ) NESTED TABLE ad_textdocs_ntab STORE AS textdocs_nestedtab_demo\n      LOB (ad_composite, ad_photo, ad_finaltext)\n      STORE AS(STORAGE (INITIAL 20M))\n   PARTITION BY RANGE (product_id)\n      (PARTITION p1 VALUES LESS THAN (3000) TABLESPACE tbs_01\n         LOB (ad_composite, ad_photo)\n         STORE AS (TABLESPACE tbs_02 STORAGE (INITIAL 10M))\n         NESTED TABLE ad_textdocs_ntab STORE AS nt_p1 (TABLESPACE example),\n       PARTITION P2 VALUES LESS THAN (MAXVALUE)\n         LOB (ad_composite, ad_finaltext)\n         STORE AS SECUREFILE (TABLESPACE auto_seg_ts)\n         NESTED TABLE ad_textdocs_ntab STORE AS nt_p2\n       )\n   TABLESPACE tbs_03;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-55.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE hash_products \n    ( product_id          NUMBER(6)   PRIMARY KEY\n    , product_name        VARCHAR2(50) \n    , product_description VARCHAR2(2000) \n    , category_id         NUMBER(2) \n    , weight_class        NUMBER(1) \n    , warranty_period     INTERVAL YEAR TO MONTH \n    , supplier_id         NUMBER(6) \n    , product_status      VARCHAR2(20) \n    , list_price          NUMBER(8,2) \n    , min_price           NUMBER(8,2) \n    , catalog_url         VARCHAR2(50) \n    , CONSTRAINT          product_status_lov_demo \n                          CHECK (product_status in ('orderable' \n                                                  ,'planned' \n                                                  ,'under development' \n                                                  ,'obsolete') \n ) ) \n PARTITION BY HASH (product_id) \n PARTITIONS 4 \n STORE IN (tbs_01, tbs_02, tbs_03, tbs_04);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-56.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE part_order_items (\n    order_id        NUMBER(12) PRIMARY KEY,\n    line_item_id    NUMBER(3),\n    product_id      NUMBER(6) NOT NULL,\n    unit_price      NUMBER(8,2),\n    quantity        NUMBER(8),\n    CONSTRAINT product_id_fk\n    FOREIGN KEY (product_id) REFERENCES hash_products(product_id))\n PARTITION BY REFERENCE (product_id_fk);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-57.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE composite_sales\n    ( prod_id        NUMBER(6)\n    , cust_id        NUMBER\n    , time_id        DATE\n    , channel_id     CHAR(1)\n    , promo_id       NUMBER(6)\n    , quantity_sold  NUMBER(3)\n    , amount_sold         NUMBER(10,2)\n    ) \nPARTITION BY RANGE (time_id)\nSUBPARTITION BY HASH (channel_id)\n  (PARTITION SALES_Q1_1998 VALUES LESS THAN (TO_DATE('01-APR-1998','DD-MON-YYYY')),\n   PARTITION SALES_Q2_1998 VALUES LESS THAN (TO_DATE('01-JUL-1998','DD-MON-YYYY')),\n   PARTITION SALES_Q3_1998 VALUES LESS THAN (TO_DATE('01-OCT-1998','DD-MON-YYYY')),\n   PARTITION SALES_Q4_1998 VALUES LESS THAN (TO_DATE('01-JAN-1999','DD-MON-YYYY')),\n   PARTITION SALES_Q1_1999 VALUES LESS THAN (TO_DATE('01-APR-1999','DD-MON-YYYY')),\n   PARTITION SALES_Q2_1999 VALUES LESS THAN (TO_DATE('01-JUL-1999','DD-MON-YYYY')),\n   PARTITION SALES_Q3_1999 VALUES LESS THAN (TO_DATE('01-OCT-1999','DD-MON-YYYY')),\n   PARTITION SALES_Q4_1999 VALUES LESS THAN (TO_DATE('01-JAN-2000','DD-MON-YYYY')),\n   PARTITION SALES_Q1_2000 VALUES LESS THAN (TO_DATE('01-APR-2000','DD-MON-YYYY')),\n   PARTITION SALES_Q2_2000 VALUES LESS THAN (TO_DATE('01-JUL-2000','DD-MON-YYYY'))\n      SUBPARTITIONS 8,\n   PARTITION SALES_Q3_2000 VALUES LESS THAN (TO_DATE('01-OCT-2000','DD-MON-YYYY'))\n     (SUBPARTITION ch_c,\n      SUBPARTITION ch_i,\n      SUBPARTITION ch_p,\n      SUBPARTITION ch_s,\n      SUBPARTITION ch_t),\n   PARTITION SALES_Q4_2000 VALUES LESS THAN (MAXVALUE)\n      SUBPARTITIONS 4)\n;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-58.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE customers_part (\n   customer_id        NUMBER(6),\n   cust_first_name    VARCHAR2(20),\n   cust_last_name     VARCHAR2(20),\n   nls_territory      VARCHAR2(30),\n   credit_limit       NUMBER(9,2)) \n   PARTITION BY RANGE (credit_limit)\n   SUBPARTITION BY LIST (nls_territory)\n      SUBPARTITION TEMPLATE \n         (SUBPARTITION east  VALUES \n            ('CHINA', 'JAPAN', 'INDIA', 'THAILAND'),\n          SUBPARTITION west VALUES \n             ('AMERICA', 'GERMANY', 'ITALY', 'SWITZERLAND'),\n          SUBPARTITION other VALUES (DEFAULT))\n      (PARTITION p1 VALUES LESS THAN (1000),\n       PARTITION p2 VALUES LESS THAN (2500),\n       PARTITION p3 VALUES LESS THAN (MAXVALUE));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-59.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TYPE department_typ AS OBJECT\n   ( d_name   VARCHAR2(100), \n     d_address VARCHAR2(200) );\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE BLOCKCHAIN TABLE bank_ledger (bank VARCHAR2(128), account_no NUMBER, deposit_date DATE, deposit_amount NUMBER)\n         NO DROP UNTIL 31 DAYS IDLE\n         NO DELETE LOCKED\n         HASHING USING SHA2_512 WITH ROW VERSION AND USER CHAIN bank_accounts (bank, account_no) VERSION V2;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-60.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE departments_obj_t OF department_typ;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-61.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE OR REPLACE TYPE salesrep_typ AS OBJECT\n  ( repId NUMBER,\n    repName VARCHAR2(64));\n\nCREATE TABLE salesreps OF salesrep_typ;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-62.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TYPE employees_typ AS OBJECT \n   (e_no NUMBER, e_address CHAR(30));\n/\nCREATE TABLE employees_obj_t OF employees_typ (e_no PRIMARY KEY)\n   OBJECT IDENTIFIER IS PRIMARY KEY;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-63.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE departments_t \n   (d_no    NUMBER,\n    mgr_ref REF employees_typ SCOPE IS employees_obj_t);\nCREATE TABLE departments_t (\n    d_no NUMBER,\n    mgr_ref REF employees_typ \n       CONSTRAINT mgr_in_emp REFERENCES employees_obj_t);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-64.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TYPE address_t AS OBJECT\n  ( hno    NUMBER,\n    street VARCHAR2(40),\n    city   VARCHAR2(20),\n    zip    VARCHAR2(5),\n    phone  VARCHAR2(10) );\n/\nCREATE TYPE person AS OBJECT\n  ( name        VARCHAR2(40),\n    dateofbirth DATE,\n    homeaddress address_t,\n    manager     REF person );\n/\nCREATE TABLE persons OF person\n  ( homeaddress NOT NULL,\n      UNIQUE (homeaddress.phone),\n      CHECK (homeaddress.zip IS NOT NULL),\n      CHECK (homeaddress.city <> 'San Francisco') );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-65.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE t1 (T NUMBER) ANNOTATIONS(Operations 'Sort', Operations 'Group', Hidden);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-66.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE t1 (T NUMBER) ANNOTATIONS (ADD Hidden);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-67.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE t1 (T NUMBER ANNOTATIONS(Operations 'Sort' , Hidden) );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-69.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE DOMAIN dn1 AS NUMBER;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE BLOCKCHAIN TABLE bank_ledger (bank VARCHAR2(128), deposit_date DATE, deposit_amount NUMBER)\n  NO DROP UNTIL 31 DAYS IDLE\n  NO DELETE LOCKED\n  HASHING USING SHA2_512 VERSION V2;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-70.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE DOMAIN dn2 AS (c1 AS NUMBER NOT NULL, c2 as NUMBER DEFAULT 1);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-71.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE DOMAIN dm1 AS\n (ann AS NUMBER NOT NULL ,\n  bnnpos AS NUMBER NOT NULL CONSTRAINT CHECK (bnnpos > 0),\n  c AS VARCHAR2(10) DEFAULT 'abc',\n  ddon AS NUMBER DEFAULT ON NULL 10)  \n  CONSTRAINT CHECK (ann+ddon < = 100)     \n  CONSTRAINT CHECK (length(c) > bnnpos);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-72.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE tm1 (c1 NUMBER, c2 NUMBER, c3 VARCHAR2(15),c4 NUMBER, c5 NUMBER, \n                  c6 NUMBER, c7 NUMBER, DOMAIN dm1 (c1, c2, c3, c4),\n                  DOMAIN dn2(c5, c6), DOMAIN dn1(c7));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-73.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE t1 OF XMLTYPE  \n  XMLTYPE STORE AS TRANSPORTABLE BINARY XML;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-74.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE t2 (id NUMBER, doc XMLTYPE)\n  XMLTYPE doc STORE AS TRANSPORTABLE BINARY XML;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-75.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nALTER TABLE t3 ADD (doc XMLTYPE)\n  XMLTYPE doc STORE AS TRANSPORTABLE BINARY XML;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE mydoc(id NUMBER, docCreationTime DATE, doc CLOB, json_doc JSON) INMEMORY TEXT(DOC, JSON_DOC)"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLE-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html\nCREATE TABLE mydoc(id NUMBER, docCreationTime DATE, doc CLOB, json_doc JSON) INMEMORY PRIORITY CRITICAL \n    INMEMORY TEXT(DOC, JSON_DOC)"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLESPACE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLESPACE.html\nCREATE BIGFILE TABLESPACE sh_lwp1 DATAFILE sh_lwp1.df SIZE 10M BLOCKSIZE 8K \n  LOST WRITE PROTECTION;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLESPACE-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLESPACE.html\nCREATE BIGFILE TABLESPACE bigtbs_01\n  DATAFILE 'bigtbs_f1.dbf'\n  SIZE 20M AUTOEXTEND ON;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLESPACE-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLESPACE.html\nCREATE TABLESPACE lmt1 DATAFILE 'lmt_file2.dbf' SIZE 100m REUSE\n  EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;\nCREATE TABLE lmt_table1 (col1 NUMBER, col2 VARCHAR2(20))\n  TABLESPACE lmt1 STORAGE (INITIAL 2m);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLESPACE-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLESPACE.html\nCREATE TABLESPACE lmt2 DATAFILE 'lmt_file3.dbf' SIZE 100m REUSE \n  EXTENT MANAGEMENT LOCAL;\nCREATE TABLE lmt_table2 (col1 NUMBER, col2 VARCHAR2(20)) \n  TABLESPACE lmt2 STORAGE (INITIAL 2m MAXSIZE 100m);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLESPACE-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLESPACE.html\nALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY \"wallet_password\";\nCREATE TABLESPACE encrypt_ts\n  DATAFILE '$ORACLE_HOME/dbs/encrypt_df.dbf' SIZE 1M\n  ENCRYPTION USING 'AES256' ENCRYPT;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLESPACE-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLESPACE.html\nCREATE TABLESPACE auto_seg_ts DATAFILE 'file_2.dbf' SIZE 1M\n   EXTENT MANAGEMENT LOCAL\n   SEGMENT SPACE MANAGEMENT AUTO;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLESPACE-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLESPACE.html\nALTER SYSTEM SET DB_CREATE_FILE_DEST = '$ORACLE_HOME/rdbms/dbs';\nCREATE TABLESPACE omf_ts1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLESPACE-16.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLESPACE.html\nCREATE TABLESPACE omf_ts2 DATAFILE AUTOEXTEND OFF;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLESPACE-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLESPACE.html\nCREATE UNDO TABLESPACE undots1\n   DATAFILE 'undotbs_1a.dbf'\n   SIZE 10M AUTOEXTEND ON\n   RETENTION GUARANTEE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLESPACE-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLESPACE.html\nCREATE TEMPORARY TABLESPACE temp_demo\n   TEMPFILE 'temp01.dbf' SIZE 5M AUTOEXTEND ON;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLESPACE-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLESPACE.html\nALTER SYSTEM SET DB_CREATE_FILE_DEST = '$ORACLE_HOME/rdbms/dbs';\nCREATE TEMPORARY TABLESPACE tbs_05;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLESPACE-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLESPACE.html\nCREATE TEMPORARY TABLESPACE tbs_temp_02\n  TEMPFILE 'temp02.dbf' SIZE 5M AUTOEXTEND ON\n  TABLESPACE GROUP tbs_grp_01;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLESPACE-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLESPACE.html\nCREATE TABLESPACE tbs_01 \n   DATAFILE 'tbs_f2.dbf' SIZE 40M \n   ONLINE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLESPACE-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLESPACE.html\nCREATE TABLESPACE tbs_03 \n   DATAFILE 'tbs_f03.dbf' SIZE 20M\n   LOGGING;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLESPACE-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLESPACE.html\nCREATE TABLESPACE tbs_02 \n   DATAFILE 'diskb:tbs_f5.dbf' SIZE 500K REUSE\n   AUTOEXTEND ON NEXT 500K MAXSIZE 100M;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLESPACE-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLESPACE.html\nCREATE TABLESPACE tbs_04 DATAFILE 'file_1.dbf' SIZE 10M\n   EXTENT MANAGEMENT LOCAL UNIFORM SIZE 128K;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-TABLESPACE-SET-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLESPACE-SET.html\nCREATE TABLESPACE SET ts1\n  IN SHARDSPACE sgr1 \n  USING TEMPLATE\n  ( DATAFILE SIZE 100m\n    EXTENT MANAGEMENT LOCAL\n    SEGMENT SPACE MANAGEMENT AUTO\n  );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-USER-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-USER.html\nCREATE USER jsmith IDENTIFIED EXTERNALLY AS \"CN=foo,DNQ=123,SERIAL=234\";"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-USER-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-USER.html\nCREATE USER tjones IDENTIFIED EXTERNALLY AS \"CN=foo,dnQualifier=123,SERIALNUMER=234\";"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-USER-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-USER.html\nCREATE USER peter_fitch IDENTIFIED GLOBALLY AS 'AZURE_USER=peter.fitch@example.com';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-USER-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-USER.html\nCREATE USER dba_azure IDENTIFIED GLOBALLY AS 'AZURE_ROLE=AZURE_DBA';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-USER-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-USER.html\nCREATE USER u1 IDENTIFIED BY p1 PROFILE prof1 ;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-USER-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-USER.html\nCREATE USER sidney \n    IDENTIFIED BY out_standing1 \n    DEFAULT TABLESPACE example \n    QUOTA 10M ON example \n    TEMPORARY TABLESPACE temp\n    QUOTA 5M ON system \n    PROFILE app_user \n    PASSWORD EXPIRE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-USER-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-USER.html\nCREATE USER app_user1\n   IDENTIFIED EXTERNALLY\n   DEFAULT TABLESPACE example\n   QUOTA 5M ON example\n   PROFILE app_user;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-USER-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-USER.html\nCREATE USER ops$external_user\n   IDENTIFIED EXTERNALLY\n   DEFAULT TABLESPACE example\n   QUOTA 5M ON example\n   PROFILE app_user;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-USER-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-USER.html\nCREATE USER global_user\n   IDENTIFIED GLOBALLY AS 'CN=analyst, OU=division1, O=oracle, C=US'\n   DEFAULT TABLESPACE example\n   QUOTA 5M ON example;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-USER-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-USER.html\nCREATE USER c##comm_user\n   IDENTIFIED BY comm_pwd\n   DEFAULT TABLESPACE example\n   QUOTA 20M ON example\n   TEMPORARY TABLESPACE temp_tbs;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-VIEW-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-VIEW.html\nCREATE VIEW emp_view AS \n   SELECT last_name, salary*12 annual_salary\n   FROM employees \n   WHERE department_id = 20;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-VIEW-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-VIEW.html\nCREATE VIEW customer_ro (name, language, credit)\n      AS SELECT cust_last_name, nls_language, credit_limit\n      FROM customers\n      WITH READ ONLY;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-VIEW-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-VIEW.html\nCREATE TYPE inventory_typ\n OID '82A4AF6A4CD4656DE034080020E0EE3D'\n AS OBJECT\n    ( product_id          NUMBER(6)\n    , warehouse           warehouse_typ\n    , quantity_on_hand    NUMBER(8)\n    ) ;\n/\nCREATE OR REPLACE VIEW oc_inventories OF inventory_typ\n WITH OBJECT OID (product_id)\n AS SELECT i.product_id,\n           warehouse_typ(w.warehouse_id, w.warehouse_name, w.location_id),\n           i.quantity_on_hand\n    FROM inventories i, warehouses w\n    WHERE i.warehouse_id=w.warehouse_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-VIEW-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-VIEW.html\nCREATE VIEW warehouse_view AS\n   SELECT VALUE(p) AS warehouse_xml\n   FROM xwarehouses p;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-VIEW-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-VIEW.html\nSELECT e.warehouse_xml.getclobval()\n   FROM warehouse_view e\n   WHERE EXISTSNODE(warehouse_xml, '//Docks') =1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-VIEW-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-VIEW.html\nCREATE TABLE warehouse_table \n(\n  WarehouseID       NUMBER,\n  Area              NUMBER,\n  Docks             NUMBER,\n  DockType          VARCHAR2(100),\n  WaterAccess       VARCHAR2(10),\n  RailAccess        VARCHAR2(10),\n  Parking           VARCHAR2(20),\n  VClearance        NUMBER\n);\nINSERT INTO warehouse_table \n   VALUES(5, 103000,3,'Side Load','false','true','Lot',15);\nCREATE VIEW warehouse_view OF XMLTYPE\n XMLSCHEMA \"http://www.example.com/xwarehouses.xsd\" \n    ELEMENT \"Warehouse\"\n    WITH OBJECT ID \n    (extract(OBJECT_VALUE, '/Warehouse/Area/text()').getnumberval())\n AS SELECT XMLELEMENT(\"Warehouse\",\n            XMLFOREST(WarehouseID as \"Building\",\n                      area as \"Area\",\n                      docks as \"Docks\",\n                      docktype as \"DockType\",\n                      wateraccess as \"WaterAccess\",\n                      railaccess as \"RailAccess\",\n                      parking as \"Parking\",\n                      VClearance as \"VClearance\"))\n  FROM warehouse_table;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-VIEW-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-VIEW.html\nSELECT VALUE(e) FROM warehouse_view e;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-VIEW-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-VIEW.html\nCREATE EDITIONING VIEW ed_orders_view (o_id, o_date, o_status)\n  AS SELECT order_id, order_date, order_status FROM orders\n  WITH READ ONLY;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-VIEW-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-VIEW.html\nCREATE VIEW emp_sal (emp_id, last_name, \n      email UNIQUE RELY DISABLE NOVALIDATE,\n   CONSTRAINT id_pk PRIMARY KEY (emp_id) RELY DISABLE NOVALIDATE)\n   AS SELECT employee_id, last_name, email FROM employees;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-VIEW-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-VIEW.html\nCREATE VIEW clerk AS\n   SELECT employee_id, last_name, department_id, job_id \n   FROM employees\n   WHERE job_id = 'PU_CLERK' \n      or job_id = 'SH_CLERK' \n      or job_id = 'ST_CLERK';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-VIEW-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-VIEW.html\nUPDATE clerk SET job_id = 'PU_MAN' WHERE employee_id = 118;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-VIEW-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-VIEW.html\nCREATE VIEW clerk AS\n   SELECT employee_id, last_name, department_id, job_id \n   FROM employees\n   WHERE job_id = 'PU_CLERK' \n      or job_id = 'SH_CLERK' \n      or job_id = 'ST_CLERK'\n   WITH CHECK OPTION;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-VIEW-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-VIEW.html\nCREATE VIEW locations_view AS\n   SELECT d.department_id, d.department_name, l.location_id, l.city\n   FROM departments d, locations l\n   WHERE d.location_id = l.location_id;\nSELECT column_name, updatable \n   FROM user_updatable_columns\n   WHERE table_name = 'LOCATIONS_VIEW'\n   ORDER BY column_name, updatable;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-VIEW-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-VIEW.html\nINSERT INTO locations_view VALUES\n   (999, 'Entertainment', 87, 'Roma');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CREATE-VIEW-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-VIEW.html\nINSERT INTO locations_view (department_id, department_name)\n   VALUES (999, 'Entertainment');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CUBE_TABLE-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CUBE_TABLE.html\nSELECT dim_key, level_name, long_description, channel_total_id tot_id,\n       channel_channel_id chan_id, channel_long_description chan_desc,\n       total_long_description tot_desc\n  FROM TABLE(CUBE_TABLE('global.channel'));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CUBE_TABLE-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CUBE_TABLE.html\nSELECT sales, units, cost, time, customer, product, channel\n  FROM TABLE(CUBE_TABLE('global.units_cube HIERARCHY customer market HIERARCHY time calendar'))\n  WHERE rownum < 20;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CUME_DIST-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CUME_DIST.html\nSELECT CUME_DIST(15500, .05) WITHIN GROUP\n  (ORDER BY salary, commission_pct) \"Cume-Dist of 15500\" \n  FROM employees;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CUME_DIST-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CUME_DIST.html\nSELECT job_id, last_name, salary, CUME_DIST() \n  OVER (PARTITION BY job_id ORDER BY salary) AS cume_dist\n  FROM employees\n  WHERE job_id LIKE 'PU%'\n  ORDER BY job_id, last_name, salary, cume_dist;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CURRENT_DATE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CURRENT_DATE.html\nALTER SESSION SET TIME_ZONE = '-5:0';\nALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS';\nSELECT SESSIONTIMEZONE, CURRENT_DATE FROM DUAL;\nALTER SESSION SET TIME_ZONE = '-8:0';\nSELECT SESSIONTIMEZONE, CURRENT_DATE FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CURRENT_TIMESTAMP-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CURRENT_TIMESTAMP.html\nALTER SESSION SET TIME_ZONE = '-5:0';\nALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS';\nSELECT SESSIONTIMEZONE, CURRENT_TIMESTAMP FROM DUAL;\nALTER SESSION SET TIME_ZONE = '-8:0';\nSELECT SESSIONTIMEZONE, CURRENT_TIMESTAMP FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CURRENT_TIMESTAMP-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CURRENT_TIMESTAMP.html\nCREATE TABLE current_test (col1 TIMESTAMP WITH TIME ZONE);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CURRENT_TIMESTAMP-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CURRENT_TIMESTAMP.html\nINSERT INTO current_test VALUES\n  (TO_TIMESTAMP_TZ(CURRENT_TIMESTAMP, 'DD-MON-RR HH.MI.SSXFF PM'));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CURRENT_TIMESTAMP-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CURRENT_TIMESTAMP.html\nINSERT INTO current_test VALUES\n  (TO_TIMESTAMP_TZ(CURRENT_TIMESTAMP, 'DD-MON-RR HH.MI.SSXFF PM TZH:TZM'));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CURSOR-Expressions-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CURSOR-Expressions.html\nSELECT department_name, CURSOR(SELECT salary, commission_pct \n   FROM employees e\n   WHERE e.department_id = d.department_id)\n   FROM departments d\n   ORDER BY department_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CURSOR-Expressions-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CURSOR-Expressions.html\nCREATE FUNCTION f(cur SYS_REFCURSOR, mgr_hiredate DATE) \n   RETURN NUMBER IS\n   emp_hiredate DATE;\n   before number :=0;\n   after number:=0;\nbegin\n  loop\n    fetch cur into emp_hiredate;\n    exit when cur%NOTFOUND;\n    if emp_hiredate > mgr_hiredate then\n      after:=after+1;\n    else\n      before:=before+1;\n    end if;\n  end loop;\n  close cur;\n  if before > after then\n    return 1;\n  else\n    return 0;\n  end if;\nend;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CURSOR-Expressions-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CURSOR-Expressions.html\nSELECT e1.last_name FROM employees e1\n   WHERE f(\n   CURSOR(SELECT e2.hire_date FROM employees e2\n   WHERE e1.employee_id = e2.manager_id),\n   e1.hire_date) = 1\n   ORDER BY last_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/CV-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CV.html\nSELECT country, prod, year, s\n  FROM sales_view_ref\n  MODEL\n    PARTITION BY (country)\n    DIMENSION BY (prod, year)\n    MEASURES (sale s)\n    IGNORE NAV\n    UNIQUE DIMENSION\n    RULES UPSERT SEQUENTIAL ORDER\n    (\n      s[FOR prod IN ('Mouse Pad', 'Standard Mouse'), 2001] =\n        s[CV( ), 1999] + s[CV( ), 2000]\n    )\n  ORDER BY country, prod, year;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT last_name, employee_id, salary + NVL(commission_pct, 0), \n       job_id, e.department_id\n  /* Select all employees whose compensation is\n  greater than that of Pataballa.*/\n  FROM employees e, departments d\n  /*The DEPARTMENTS table is used to get the department name.*/\n  WHERE e.department_id = d.department_id\n    AND salary + NVL(commission_pct,0) >   /* Subquery:       */\n      (SELECT salary + NVL(commission_pct,0)\n        /* total compensation is salary + commission_pct */\n        FROM employees \n        WHERE last_name = 'Pataballa')\n  ORDER BY last_name, employee_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nCREATE VIEW v AS\n  SELECT e.last_name, e.department_id, d.location_id\n  FROM employees e, departments d\n  WHERE e.department_id = d.department_id;\nCREATE TABLE t AS\n  SELECT * from employees\n  WHERE employee_id < 200;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ DYNAMIC_SAMPLING(e 1) */ count(*)\n  FROM employees e;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ FIRST_ROWS(10) */ employee_id, last_name, salary, job_id\n  FROM employees\n  WHERE department_id = 20;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ FULL(e) */ employee_id, last_name\n  FROM hr.employees e \n  WHERE last_name LIKE :b1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ INDEX (employees emp_department_ix)*/ employee_id, department_id\n  FROM employees \n  WHERE department_id > 50;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-16.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ INDEX_COMBINE(e emp_manager_ix emp_department_ix) */ *\n  FROM employees e\n  WHERE manager_id = 108\n     OR department_id = 110;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-17.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ INDEX_DESC(e emp_name_ix) */ *\n  FROM employees e;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-18.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ INDEX_FFS(e emp_name_ix) */ first_name\n  FROM employees e;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-19.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ INDEX_JOIN(e emp_manager_ix emp_department_ix) */ department_id\n  FROM employees e\n  WHERE manager_id < 110\n    AND department_id < 50;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nEXPLAIN PLAN\n  SET STATEMENT_ID = 'Test 1'\n  INTO plan_table FOR\n    (SELECT /*+ LEADING(v.e v.d t) */ *\n     FROM t, v\n     WHERE t.department_id = v.department_id);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-20.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ INDEX_SS(e emp_name_ix) */ last_name\n  FROM employees e\n  WHERE first_name = 'Steven';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-21.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ INDEX_SS_DESC(e emp_name_ix) */ last_name\n  FROM employees e\n  WHERE first_name = 'Steven';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-22.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ LEADING(e j) */ *\n    FROM employees e, departments d, job_history j\n    WHERE e.department_id = d.department_id\n      AND e.hire_date = j.start_date;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-23.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ MERGE(v) */ e1.last_name, e1.salary, v.avg_salary\n   FROM employees e1,\n        (SELECT department_id, avg(salary) avg_salary \n           FROM employees e2\n           GROUP BY department_id) v \n   WHERE e1.department_id = v.department_id\n     AND e1.salary > v.avg_salary\n   ORDER BY e1.last_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-24.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ FULL(hr_emp) NOCACHE(hr_emp) */ last_name\n  FROM employees hr_emp;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-25.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ NO_EXPAND */ *\n  FROM employees e, departments d\n  WHERE e.manager_id = 108\n     OR d.department_id = 110;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-26.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ NO_INDEX(employees emp_empid) */ employee_id \n  FROM employees \n  WHERE employee_id > 200;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-27.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ NO_INDEX_FFS(items item_order_ix) */ order_id\n  FROM order_items items;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-28.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ NO_MERGE(seattle_dept) */ e1.last_name, seattle_dept.department_name\n  FROM employees e1,\n       (SELECT location_id, department_id, department_name\n          FROM departments\n          WHERE location_id = 1700) seattle_dept\n  WHERE e1.department_id = seattle_dept.department_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-29.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nALTER TABLE employees PARALLEL 8;\nSELECT /*+ NO_PARALLEL(hr_emp) */ last_name\n  FROM employees hr_emp;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT id, LPAD(' ',2*(LEVEL-1))||operation operation, options, object_name,  object_alias\n  FROM plan_table\n  START WITH id = 0 AND statement_id = 'Test 1'\n  CONNECT BY PRIOR id = parent_id AND statement_id = 'Test 1'\n  ORDER BY id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-30.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ NO_MERGE(v) NO_PUSH_PRED(v) */ *\n  FROM employees e,\n       (SELECT manager_id\n          FROM employees) v\n  WHERE e.manager_id = v.manager_id(+)\n    AND e.employee_id = 100;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-31.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ NO_QUERY_TRANSFORMATION */ employee_id, last_name\n  FROM (SELECT * FROM employees e) v\n  WHERE v.last_name = 'Smith';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-32.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ NO_REWRITE */ sum(s.amount_sold) AS dollars\n  FROM sales s, times t\n  WHERE s.time_id = t.time_id\n  GROUP BY t.calendar_month_desc;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-33.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ NO_STATEMENT_QUEUING */ emp.last_name, dpt.department_name\n  FROM employees emp, departments dpt\n  WHERE emp.department_id = dpt.department_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-34.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ NO_USE_BAND(e1 e2) */\n  e1.last_name\n  || ' has salary between 100 less and 100 more than '\n  || e2.last_name AS \"SALARY COMPARISON\"\nFROM employees e1, employees e2\nWHERE e1.salary BETWEEN e2.salary - 100 AND e2.salary + 100;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-35.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ NO_USE_HASH(e d) */ *\n  FROM employees e, departments d\n  WHERE e.department_id = d.department_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-36.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ NO_USE_MERGE(e d) */ *\n   FROM employees e, departments d\n   WHERE e.department_id = d.department_id\n   ORDER BY d.department_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-37.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ NO_USE_NL(l h) */ *\n  FROM orders h, order_items l\n  WHERE l.order_id = h.order_id\n    AND l.order_id > 2400;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-38.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+NO_XML_QUERY_REWRITE*/ XMLQUERY('<A/>' RETURNING CONTENT)\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-39.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+NO_XMLINDEX_REWRITE*/ count(*) \n  FROM warehouses\n  WHERE existsNode(warehouse_spec, '/Warehouse/Building') = 1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nEXPLAIN PLAN\n  SET STATEMENT_ID = 'Test 2'\n  INTO plan_table FOR\n    (SELECT /*+ LEADING(E@SEL$2 D@SEL$2 T@SEL$1) */ *\n     FROM t, v\n     WHERE t.department_id = v.department_id);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-41.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT  /*+ ORDERED */ o.order_id, c.customer_id, l.unit_price * l.quantity\n  FROM customers c, order_items l, orders o\n  WHERE c.cust_last_name = 'Taylor'\n    AND o.customer_id = c.customer_id\n    AND o.order_id = l.order_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-42.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ PARALLEL */ last_name\n  FROM employees;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-43.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ PARALLEL (AUTO) */ last_name\n  FROM employees;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-44.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nCREATE TABLE parallel_table (col1 number, col2 VARCHAR2(10)) PARALLEL 5;\nSELECT /*+ PARALLEL (MANUAL) */ col2\n  FROM parallel_table;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-45.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ FULL(hr_emp) PARALLEL(hr_emp, 5) */ last_name\n  FROM employees hr_emp;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-46.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ FULL(hr_emp) PARALLEL(hr_emp, DEFAULT) */ last_name\n  FROM employees hr_emp;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-48.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nINSERT /*+ APPEND PARALLEL(target_table, 16) PQ_DISTRIBUTE(target_table, NONE) */\n  INTO target_table\n  SELECT * FROM source_table;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-49.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nCREATE /*+ PQ_DISTRIBUTE(target_table, PARTITION) */ TABLE target_table\n  NOLOGGING PARALLEL 16\n  PARTITION BY HASH (l_orderkey) PARTITIONS 512\n  AS SELECT * FROM source_table;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT id, LPAD(' ',2*(LEVEL-1))||operation operation, options,\n  object_name, object_alias\n  FROM plan_table\n  START WITH id = 0 AND statement_id = 'Test 2'\n  CONNECT BY PRIOR id = parent_id AND statement_id = 'Test 2'\n  ORDER BY id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-50.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ORDERED PQ_DISTRIBUTE(s HASH, HASH) USE_HASH (s)*/ column_list\n  FROM r,s\n  WHERE r.c=s.c;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-51.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ORDERED PQ_DISTRIBUTE(s BROADCAST, NONE) USE_HASH (s) */ column_list\n  FROM r,s\n  WHERE r.c=s.c;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-52.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ NO_MERGE(v) PUSH_PRED(v) */ *\n  FROM employees e,\n    (SELECT manager_id\n      FROM employees) v\n  WHERE e.manager_id = v.manager_id(+)\n    AND e.employee_id = 100;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-53.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ QB_NAME(qb) FULL(@qb e) */ employee_id, last_name\n  FROM employees e\n  WHERE last_name = 'Smith';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-56.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ STAR_TRANSFORMATION */ s.time_id, s.prod_id, s.channel_id\n  FROM sales s, times t, products p, channels c\n  WHERE s.time_id = t.time_id\n    AND s.prod_id = p.prod_id\n    AND s.channel_id = c.channel_id\n    AND c.channel_desc = 'Tele Sales';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-57.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ STATEMENT_QUEUING */ emp.last_name, dpt.department_name\n  FROM employees emp, departments dpt\n  WHERE emp.department_id = dpt.department_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-58.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ USE_BAND(e1 e2) */\n  e1.last_name\n  || ' has salary between 100 less and 100 more than '\n  || e2.last_name AS \"SALARY COMPARISON\"\nFROM employees e1, employees e2\nWHERE e1.salary BETWEEN e2.salary - 100 AND e2.salary + 100;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-59.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ USE_CONCAT */ *\n  FROM employees e\n  WHERE manager_id = 108\n     OR department_id = 110;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ ALL_ROWS */ employee_id, last_name, salary, job_id\n  FROM employees\n  WHERE employee_id = 107;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-60.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ USE_HASH(l h) */ *\n  FROM orders h, order_items l\n  WHERE l.order_id = h.order_id\n    AND l.order_id > 2400;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-61.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ USE_MERGE(employees departments) */ * \n  FROM employees, departments \n  WHERE employees.department_id = departments.department_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-62.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ USE_NL(l h) */ h.customer_id, l.unit_price * l.quantity\n  FROM orders h, order_items l\n  WHERE l.order_id = h.order_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-63.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nselect /*+ LEADING(t2) USE_NL(t1) */ sum(t1.a),sum(t2.a)\nfrom   t1 , t2\nwhere   t1.b = t2.b;\nselect * from table(dbms_xplan.display_cursor()) ;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-64.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ USE_NL_WITH_INDEX(l item_product_ix) */ *\n  FROM orders h, order_items l\n  WHERE l.order_id = h.order_id\n    AND l.order_id > 2400;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ FULL (hr_emp) CACHE(hr_emp) */ last_name\n  FROM employees hr_emp;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ CONTAINERS(DEFAULT_PDB_HINT='NO_PARALLEL') */\n  (CASE WHEN COUNT(*) < 10000\n        THEN 'Less than 10,000'\n        ELSE '10,000 or more' END) \"Number of Tables\"\n  FROM CONTAINERS(DBA_TABLES);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comments-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comments.html\nSELECT /*+ DRIVING_SITE(departments) */ * \n  FROM employees, departments@rsite \n  WHERE employees.department_id = departments.department_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comparison-Conditions-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comparison-Conditions.html\nSELECT *\n  FROM employees\n  WHERE salary = 2500\n  ORDER BY employee_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comparison-Conditions-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comparison-Conditions.html\nSELECT *\n  FROM employees\n  WHERE salary != 2500\n  ORDER BY employee_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comparison-Conditions-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comparison-Conditions.html\nSELECT * FROM employees\n  WHERE salary > 2500\n  ORDER BY employee_id;\nSELECT * FROM employees\n  WHERE salary < 2500\n  ORDER BY employee_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comparison-Conditions-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comparison-Conditions.html\nSELECT * FROM employees\n  WHERE salary >= 2500\n  ORDER BY employee_id;\nSELECT * FROM employees\n  WHERE salary <= 2500\n  ORDER BY employee_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comparison-Conditions-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comparison-Conditions.html\nSELECT * FROM employees\n  WHERE salary = ANY\n  (SELECT salary \n   FROM employees\n  WHERE department_id = 30)\n  ORDER BY employee_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Comparison-Conditions-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Comparison-Conditions.html\nSELECT * FROM employees\n  WHERE salary >=\n  ALL (1400, 3000)\n  ORDER BY employee_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Concatenation-Operator-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Concatenation-Operator.html\nSELECT 'Name is ' || last_name\n  FROM employees\n  ORDER BY last_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Concatenation-Operator-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Concatenation-Operator.html\nCREATE TABLE tab1 (col1 VARCHAR2(6), col2 CHAR(6),\n                   col3 VARCHAR2(6), col4 CHAR(6));\nINSERT INTO tab1 (col1,  col2,     col3,     col4)\n          VALUES ('abc', 'def   ', 'ghi   ', 'jkl');\nSELECT col1 || col2 || col3 || col4 \"Concatenation\"\n  FROM tab1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DBTIMEZONE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DBTIMEZONE.html\nSELECT DBTIMEZONE\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DECODE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DECODE.html\nSELECT product_id,\n       DECODE (warehouse_id, 1, 'Southlake', \n                             2, 'San Francisco', \n                             3, 'New Jersey', \n                             4, 'Seattle',\n                                'Non domestic') \"Location\" \n  FROM inventories\n  WHERE product_id < 1775\n  ORDER BY product_id, \"Location\";"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DECOMPOSE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DECOMPOSE.html\nSELECT DECOMPOSE ('Châteaux')\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DELETE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DELETE.html\nDELETE FROM t     \nFROM s\nWHERE t.t1 = s.s1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DELETE-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DELETE.html\nDELETE FROM product_descriptions\n   WHERE language_id = 'AR';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DELETE-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DELETE.html\nDELETE (SELECT * FROM product_price_history) WHERE  currency_code = 'EUR';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DELETE-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DELETE.html\nDELETE product_price_history pp \nWHERE  (product_id, currency_code, effective_from_date) \n   IN (SELECT product_id, currency_code, Max(effective_from_date) \n       FROM   product_price_history \n       GROUP BY product_id, currency_code);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DELETE-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DELETE.html\nDELETE product_price_history partition (p1);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DELETE-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DELETE.html\nSELECT * FROM product_price_history;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DELETE-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DELETE.html\nDELETE product_price_history;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DELETE-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DELETE.html\nDELETE FROM employees\n   WHERE job_id = 'SA_REP'\n   AND commission_pct < .2;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DELETE-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DELETE.html\nDELETE FROM (SELECT * FROM employees)\n   WHERE job_id = 'SA_REP'\n   AND commission_pct < .2;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DELETE-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DELETE.html\nDELETE FROM hr.locations@remote\n   WHERE location_id > 3000;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DELETE-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DELETE.html\nDELETE FROM sales PARTITION (sales_q1_1998)\n   WHERE amount_sold > 1000;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DELETE-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DELETE.html\nDELETE FROM employees\n   WHERE job_id = 'SA_REP' \n   AND hire_date + TO_YMINTERVAL('01-00') < SYSDATE \n   RETURNING salary INTO :bnd1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DELETE-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DELETE.html\nCREATE TABLE product_price_history ( \n  product_id          INTEGER NOT NULL, \n  price               INTEGER NOT NULL, \n  currency_code       VARCHAR2(3 CHAR) NOT NULL, \n  effective_from_date DATE NOT NULL, \n  effective_to_date   DATE, \n  CONSTRAINT product_price_history_pk \n    PRIMARY KEY (product_id, currency_code, effective_from_date) \n) PARTITION BY RANGE (effective_from_date) ( \n    PARTITION p0 VALUES less than (DATE'2015-01-02'), \n    PARTITION p1 VALUES less than (DATE'2015-01-03'), \n    PARTITION p2 VALUES less than (DATE'2015-01-04') \n);\nINSERT INTO product_price_history \n  WITH prices AS ( \n    SELECT 1, 100, 'USD', DATE'2015-01-01', DATE'2015-01-02' \n    FROM   dual UNION ALL \n    SELECT 1, 60, 'GBP', DATE'2015-01-01', DATE'2015-01-02' \n    FROM   dual UNION ALL \n    SELECT 1, 110, 'EUR', DATE'2015-01-01', DATE'2015-01-02' \n    FROM   dual UNION ALL \n    SELECT 1, 101, 'USD', DATE'2015-01-02', DATE'2015-01-03' \n    FROM   dual UNION ALL \n    SELECT 1, 62, 'GBP', DATE'2015-01-02', DATE'2015-01-03' \n    FROM   dual UNION ALL \n    SELECT 1, 109, 'EUR', DATE'2015-01-02', DATE'2015-01-03' \n    FROM   dual UNION ALL \n    SELECT 1, 105, 'USD', DATE'2015-01-03', NULL \n    FROM   dual UNION ALL \n    SELECT 1, 61, 'GBP', DATE'2015-01-03', NULL \n    FROM   dual UNION ALL \n    SELECT 1, 107, 'EUR', DATE'2015-01-03', NULL \n    FROM   dual UNION ALL \n    SELECT 2, 30, 'USD', DATE'2015-01-01', DATE'2015-01-03' \n    FROM   dual UNION ALL \n    SELECT 2, 33, 'USD', DATE'2015-01-03', NULL \n    FROM   dual UNION ALL \n    SELECT 3, 100, 'GBP', DATE'2015-01-03', NULL \n    FROM   dual \n  ) \nSELECT * \nFROM   prices;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DELETE-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DELETE.html\nDELETE FROM product_price_history WHERE product_id = 3;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DENSE_RANK-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DENSE_RANK.html\nSELECT DENSE_RANK(15500, .05) WITHIN GROUP \n  (ORDER BY salary DESC, commission_pct) \"Dense Rank\" \n  FROM employees;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DENSE_RANK-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DENSE_RANK.html\nSELECT department_id, last_name, salary,\n       DENSE_RANK() OVER (PARTITION BY department_id ORDER BY salary) DENSE_RANK\n  FROM employees WHERE department_id = 60\n  ORDER BY DENSE_RANK, last_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DEPTH-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DEPTH.html\nSELECT PATH(1), DEPTH(2)\n  FROM RESOURCE_VIEW\n  WHERE UNDER_PATH(res, '/sys/schemas/OE', 1)=1\n    AND UNDER_PATH(res, '/sys/schemas/OE', 2)=1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DEREF-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DEREF.html\nINSERT INTO address_table VALUES\n  ('1 First', 'G45 EU8', 'Paris', 'CA', 'US');\nINSERT INTO customer_addresses\n  SELECT 999, REF(a) FROM address_table a;\nSELECT address\n  FROM customer_addresses\n  ORDER BY address;\nSELECT DEREF(address)\n  FROM customer_addresses;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DISASSOCIATE-STATISTICS-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DISASSOCIATE-STATISTICS.html\nDISASSOCIATE STATISTICS FROM PACKAGES hr.emp_mgmt;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-ANALYTIC-VIEW-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-ANALYTIC-VIEW.html\nDROP ANALYTIC VIEW sales_av;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-ATTRIBUTE-DIMENSION-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-ATTRIBUTE-DIMENSION.html\nDROP ATTRIBUTE DIMENSION product_attr_dim;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-AUDIT-POLICY-Unified-Auditing-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-AUDIT-POLICY-Unified-Auditing.html\nDROP AUDIT POLICY table_pol;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-CLUSTER-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-CLUSTER.html\nDROP CLUSTER language;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-CLUSTER-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-CLUSTER.html\nDROP CLUSTER personnel\n   INCLUDING TABLES\n   CASCADE CONSTRAINTS;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-CONTEXT-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-CONTEXT.html\nDROP CONTEXT hr_context;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-DATABASE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-DATABASE.html\nSTARTUP MOUNT\n\nALTER SYSTEM ENABLE RESTRICTED SESSION;\nDROP DATABASE"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-DATABASE-LINK-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-DATABASE-LINK.html\nDROP PUBLIC DATABASE LINK remote;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-DIMENSION-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-DIMENSION.html\nDROP DIMENSION customers_dim;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-DIRECTORY-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-DIRECTORY.html\nDROP DIRECTORY bfile_dir;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-DISKGROUP-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-DISKGROUP.html\nDROP DISKGROUP dgroup_01 INCLUDING CONTENTS;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-FUNCTION-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-FUNCTION.html\nDROP FUNCTION oe.SecondMax;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-HIERARCHY-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-HIERARCHY.html\nDROP HIERARCHY product_hier;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-INDEX-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-INDEX.html\nDROP INDEX ord_customer_ix_demo;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-INDEXTYPE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-INDEXTYPE.html\nDROP INDEXTYPE position_indextype FORCE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-INMEMORY-JOIN-GROUP-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-INMEMORY-JOIN-GROUP.html\nDROP INMEMORY JOIN GROUP prod_id1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-JAVA-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-JAVA.html\nDROP JAVA CLASS \"Agent\";"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-LIBRARY-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-LIBRARY.html\nDROP LIBRARY ext_lib;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-LOCKDOWN-PROFILE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-LOCKDOWN-PROFILE.html\nDROP LOCKDOWN PROFILE hr_prof;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-MATERIALIZED-VIEW-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-MATERIALIZED-VIEW.html\nDROP MATERIALIZED VIEW emp_data;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-MATERIALIZED-VIEW-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-MATERIALIZED-VIEW.html\nDROP MATERIALIZED VIEW sales_by_month_by_state;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-MATERIALIZED-VIEW-LOG-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-MATERIALIZED-VIEW-LOG.html\nDROP MATERIALIZED VIEW LOG ON customers;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-MATERIALIZED-ZONEMAP-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-MATERIALIZED-ZONEMAP.html\nDROP MATERIALIZED ZONEMAP sales_zmap;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-OPERATOR-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-OPERATOR.html\nDROP OPERATOR eq_op;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-OUTLINE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-OUTLINE.html\nDROP OUTLINE salaries;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-PACKAGE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-PACKAGE.html\nDROP PACKAGE emp_mgmt;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-PLUGGABLE-DATABASE-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-PLUGGABLE-DATABASE.html\nDROP PLUGGABLE DATABASE pdb1\n  INCLUDING DATAFILES;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-PROCEDURE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-PROCEDURE.html\nDROP PROCEDURE hr.remove_emp;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-PROFILE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-PROFILE.html\nDROP PROFILE app_user CASCADE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-RESTORE-POINT-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-RESTORE-POINT.html\nDROP RESTORE POINT good_data;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-ROLE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-ROLE.html\nDROP ROLE dw_manager;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-ROLLBACK-SEGMENT-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-ROLLBACK-SEGMENT.html\nDROP ROLLBACK SEGMENT rbs_one;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-SEQUENCE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-SEQUENCE.html\nDROP SEQUENCE oe.customers_seq;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-SYNONYM-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-SYNONYM.html\nDROP PUBLIC SYNONYM customers;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-TABLE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-TABLE.html\nDROP TABLE list_customers PURGE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-TABLESPACE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-TABLESPACE.html\nDROP TABLESPACE tbs_01 \n    INCLUDING CONTENTS \n        CASCADE CONSTRAINTS;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-TABLESPACE-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-TABLESPACE.html\nDROP TABLESPACE tbs_02\n   INCLUDING CONTENTS AND DATAFILES;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-TABLESPACE-SET-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-TABLESPACE-SET.html\nDROP TABLESPACE SET ts1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-TRIGGER-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-TRIGGER.html\nDROP TRIGGER hr.salary_check;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-TYPE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-TYPE.html\nDROP TYPE person_t FORCE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-TYPE-BODY-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-TYPE-BODY.html\nDROP TYPE BODY data_typ1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-USER-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-USER.html\nDROP USER sidney;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-USER-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-USER.html\nDROP USER sidney CASCADE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DROP-VIEW-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DROP-VIEW.html\nDROP VIEW emp_view;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/DUMP-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DUMP.html\nSELECT DUMP('abc', 1016)\n  FROM DUAL;\nSELECT DUMP(last_name, 8, 3, 2) \"OCTAL\"\n  FROM employees\n  WHERE last_name = 'Hunold'\n  ORDER BY employee_id;\nSELECT DUMP(last_name, 10, 3, 2) \"ASCII\"\n  FROM employees\n  WHERE last_name = 'Hunold'\n  ORDER BY employee_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Data-Type-Comparison-Rules-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Data-Type-Comparison-Rules.html\nSELECT salary + '10'\n  FROM employees;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Data-Type-Comparison-Rules-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Data-Type-Comparison-Rules.html\nSELECT last_name\n  FROM employees\n  WHERE employee_id = '200';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Data-Type-Comparison-Rules-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Data-Type-Comparison-Rules.html\nSELECT last_name\n  FROM employees \n  WHERE hire_date = '24-JUN-06';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Data-Types-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Data-Types.html\nSELECT TO_DATE('31-AUG-2004','DD-MON-YYYY') + TO_YMINTERVAL('0-1')\n  FROM DUAL;\nSELECT TO_DATE('29-FEB-2004','DD-MON-YYYY') + TO_YMINTERVAL('1-0')\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Data-Types-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Data-Types.html\nSELECT TO_DATE('29-FEB-2004', 'DD-MON-YYYY') + TO_YMINTERVAL('4-0')\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Data-Types-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Data-Types.html\nSELECT order_id, order_date + INTERVAL '30' DAY AS \"Due Date\"\n  FROM orders\n  ORDER BY order_id, \"Due Date\";"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Data-Types-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Data-Types.html\nSELECT job_name,\n       SUM( cpu_used )\n  FROM DBA_SCHEDULER_JOB_RUN_DETAILS\n  GROUP BY job_name\n  HAVING SUM ( cpu_used ) > interval '5' minute;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Data-Types-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Data-Types.html\nCREATE TABLE time_table\n  (start_time    TIMESTAMP,\n   duration_1    INTERVAL DAY (6) TO SECOND (5),\n   duration_2    INTERVAL YEAR TO MONTH);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Data-Types-16.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Data-Types.html\nSELECT last_name, EXTRACT(YEAR FROM (SYSDATE - hire_date) YEAR TO MONTH)\n       || ' years '\n       || EXTRACT(MONTH FROM (SYSDATE - hire_date) YEAR TO MONTH)\n       || ' months'  \"Interval\"\n  FROM employees;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Data-Types-17.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Data-Types.html\nCREATE TABLE j_purchaseorder\n  (id VARCHAR2 (32) NOT NULL PRIMARY KEY,\n   date_loaded TIMESTAMP (6) WITH TIME ZONE,\n   po_document JSON (OBJECT));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Data-Types-18.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Data-Types.html\nCREATE TABLE example (id NUMBER, c1 BOOLEAN, c2 BOOL);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Data-Types-19.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Data-Types.html\nINSERT INTO example VALUES (1, TRUE, NULL);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Data-Types-20.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Data-Types.html\nINSERT INTO example VALUES (2, FALSE, true);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Data-Types-21.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Data-Types.html\nCREATE TABLE example (id NUMBER, c1 BOOLEAN, c2 BOOL);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Data-Types-22.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Data-Types.html\nINSERT INTO example VALUES (1, TRUE, NULL);\nINSERT INTO example VALUES (2, FALSE, true);\nINSERT INTO example VALUES (3, 0, 'off');\nINSERT INTO example VALUES (4, 'no', 'yes');\nINSERT INTO example VALUES (5, 'f', 't' );\nINSERT INTO example VALUES (6, false, true);\nINSERT INTO example VALUES (7, 'on', 'off');\nINSERT INTO example VALUES (8, -3.14, 1);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Data-Types-23.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Data-Types.html\nSELECT * FROM example;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Data-Types-24.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Data-Types.html\nSELECT * FROM example WHERE c1 = c2;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Data-Types-25.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Data-Types.html\nSELECT * FROM example e1\nWHERE c1 >= ALL (SELECT c2 FROM example e2 WHERE e2.id > e1.id);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Data-Types-26.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Data-Types.html\nSELECT * FROM example WHERE NOT c2;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Data-Types-27.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Data-Types.html\nSELECT * FROM example WHERE c1 AND c2;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Data-Types-28.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Data-Types.html\nSELECT * FROM example WHERE c1 AND TRUE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Data-Types-29.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Data-Types.html\nSELECT * FROM example WHERE c1 OR c2;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Data-Types-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Data-Types.html\nCREATE TABLE test (col1 NUMBER(5,2), col2 FLOAT(5));\nINSERT INTO test VALUES (1.23, 1.23);\nINSERT INTO test VALUES (7.89, 7.89);\nINSERT INTO test VALUES (12.79, 12.79);\nINSERT INTO test VALUES (123.45, 123.45);\nSELECT * FROM test;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Data-Types-30.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Data-Types.html\nSELECT * FROM example WHERE NOT c2;\nSELECT * FROM example WHERE c1 AND c2;\nSELECT * FROM example WHERE c1 AND TRUE;\nSELECT * FROM example WHERE c1 OR c2;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Data-Types-31.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Data-Types.html\nSELECT * FROM example WHERE c2 IS NULL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Data-Types-32.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Data-Types.html\nCREATE TABLE t (v VECTOR);\nCREATE TABLE t (v VECTOR(*, *));\nCREATE TABLE t (v VECTOR(100));\nCREATE TABLE t (v VECTOR(100, *));\nCREATE TABLE t (v VECTOR(*, FLOAT32));\nCREATE TABLE t (v VECTOR(100, FLOAT32));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Data-Types-33.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Data-Types.html\nCREATE TABLE my_vect_tab (\n     v1 VECTOR(3, FLOAT32),\n     v2 VECTOR(2, FLOAT64),\n     v3 VECTOR(1, INT8),\n     v4 VECTOR(1, *),\n     v5 VECTOR(*, FLOAT32),\n     v6 VECTOR(*, *),\n     v7 VECTOR\n   );\nDESC my_vect_tab;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Data-Types-34.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Data-Types.html\nCREATE TABLE my_vectors (id NUMBER, embedding VECTOR);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Data-Types-35.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Data-Types.html\nCREATE TABLE my_vectors (id NUMBER, embedding VECTOR(768, INT8)) ;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Data-Types-36.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Data-Types.html\nSELECT o.customer_ref.cust_email\n  FROM oc_orders o \n  WHERE o.customer_ref IS NOT DANGLING;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Data-Types-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Data-Types.html\nSELECT TO_DATE('2009', 'YYYY')\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Data-Types-40.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Data-Types.html\nCREATE TYPE SDO_GEOMETRY AS OBJECT\n  (sgo_gtype        NUMBER, \n   sdo_srid         NUMBER,\n   sdo_point        SDO_POINT_TYPE,\n   sdo_elem_info    SDO_ELEM_INFO_ARRAY,\n   sdo_ordinates    SDO_ORDINATE_ARRAY);\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Data-Types-41.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Data-Types.html\nCREATE TYPE SDO_TOPO_GEOMETRY AS OBJECT\n  (tg_type        NUMBER, \n   tg_id          NUMBER,\n   tg_layer_id    NUMBER,\n   topology_id    NUMBER);\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Data-Types-42.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Data-Types.html\nCREATE TYPE SDO_GEORASTER AS OBJECT\n  (rasterType         NUMBER,\n   spatialExtent      SDO_GEOMETRY,\n   rasterDataTable    VARCHAR2(32),\n   rasterID           NUMBER,\n   metadata           XMLType);\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Data-Types-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Data-Types.html\nSELECT TO_CHAR(TO_DATE('01-01-2009', 'MM-DD-YYYY'),'J')\n    FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Datetime-Expressions-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Datetime-Expressions.html\nSELECT FROM_TZ(CAST(TO_DATE('1999-12-01 11:00:00', \n      'YYYY-MM-DD HH:MI:SS') AS TIMESTAMP), 'America/New_York') \n   AT TIME ZONE 'America/Los_Angeles' \"West Coast Time\" \n   FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/EMPTY_BLOB-EMPTY_CLOB-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/EMPTY_BLOB-EMPTY_CLOB.html\nUPDATE print_media\n  SET ad_photo = EMPTY_BLOB();"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/EXISTS-Condition-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/EXISTS-Condition.html\nSELECT department_id\n  FROM departments d\n  WHERE EXISTS\n  (SELECT * FROM employees e\n    WHERE d.department_id \n    = e.department_id)\n   ORDER BY department_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/EXISTSNODE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/EXISTSNODE.html\nSELECT warehouse_id, warehouse_name\n  FROM warehouses\n  WHERE EXISTSNODE(warehouse_spec, '/Warehouse/Docks') = 1\n  ORDER BY warehouse_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/EXP-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/EXP.html\nSELECT EXP(4) \"e to the 4th power\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/EXPLAIN-PLAN-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/EXPLAIN-PLAN.html\nEXPLAIN PLAN \n    SET STATEMENT_ID = 'Raise in Tokyo' \n    INTO plan_table \n    FOR UPDATE employees \n        SET salary = salary * 1.10 \n        WHERE department_id =  \n           (SELECT department_id FROM departments\n               WHERE location_id = 1700);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/EXPLAIN-PLAN-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/EXPLAIN-PLAN.html\nSELECT id, LPAD(' ',2*(LEVEL-1))||operation operation, options,\n       object_name, object_alias, position \n    FROM plan_table \n    START WITH id = 0 AND statement_id = 'Raise in Tokyo'\n    CONNECT BY PRIOR id = parent_id AND statement_id = 'Raise in Tokyo'\n    ORDER BY id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/EXPLAIN-PLAN-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/EXPLAIN-PLAN.html\nEXPLAIN PLAN FOR\n  SELECT * FROM sales \n     WHERE time_id BETWEEN :h AND '01-OCT-2000';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/EXPLAIN-PLAN-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/EXPLAIN-PLAN.html\nSELECT operation, options, partition_start, partition_stop,\n       partition_id\n  FROM plan_table;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/EXTRACT-XML-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/EXTRACT-XML.html\nSELECT warehouse_name,\n       EXTRACT(warehouse_spec, '/Warehouse/Docks') \"Number of Docks\"\n  FROM warehouses\n  WHERE warehouse_spec IS NOT NULL\n  ORDER BY warehouse_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/EXTRACT-datetime-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/EXTRACT-datetime.html\nSELECT EXTRACT(month FROM order_date) \"Month\", COUNT(order_date) \"No. of Orders\"\n  FROM orders\n  GROUP BY EXTRACT(month FROM order_date)\n  ORDER BY \"No. of Orders\" DESC, \"Month\";"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/EXTRACT-datetime-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/EXTRACT-datetime.html\nSELECT EXTRACT(YEAR FROM DATE '1998-03-07')\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/EXTRACT-datetime-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/EXTRACT-datetime.html\nSELECT last_name, employee_id, hire_date\n  FROM employees\n  WHERE EXTRACT(YEAR FROM hire_date) > 2007\n  ORDER BY hire_date;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/EXTRACT-datetime-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/EXTRACT-datetime.html\nSELECT EXTRACT(TIMEZONE_REGION FROM TIMESTAMP '1999-01-01 10:00:00 -08:00')\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/EXTRACTVALUE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/EXTRACTVALUE.html\nSELECT warehouse_name, EXTRACTVALUE(e.warehouse_spec, '/Warehouse/Docks') \"Docks\"\n  FROM warehouses e \n  WHERE warehouse_spec IS NOT NULL\n  ORDER BY warehouse_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Expression-Lists-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Expression-Lists.html\nSELECT * FROM employees \n  WHERE (first_name, last_name, email) IN \n  (('Guy', 'Himuro', 'GHIMURO'),('Karen', 'Colmenares', 'KCOLMENA'))"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Expression-Lists-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Expression-Lists.html\nSELECT department_id, MIN(salary) min, MAX(salary) max FROM employees\n   GROUP BY department_id, salary\n   ORDER BY department_id, min, max;\nSELECT department_id, MIN(salary) min, MAX(salary) max FROM employees\n   GROUP BY (department_id, salary)\n   ORDER BY department_id, min, max;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Expression-Lists-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Expression-Lists.html\nSELECT \nprod_category, prod_subcategory, country_id, cust_city, count(*)\n   FROM  products, sales, customers\n   WHERE sales.prod_id = products.prod_id \n   AND sales.cust_id=customers.cust_id \n   AND sales.time_id = '01-oct-00'\n   AND customers.cust_year_of_birth BETWEEN 1960 and 1970\nGROUP BY GROUPING SETS \n  (\n   (prod_category, prod_subcategory, country_id, cust_city),\n   (prod_category, prod_subcategory, country_id),\n   (prod_category, prod_subcategory),\n    country_id\n  )\nORDER BY prod_category, prod_subcategory, country_id, cust_city;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/FEATURE_COMPARE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/FEATURE_COMPARE.html\nSELECT 1-FEATURE_COMPARE(esa_wiki_mod USING 'There are several PGA tour golfers from South Africa' text AND USING 'Nick Price won the 2002 Mastercard Colonial Open' text) similarity FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/FEATURE_COMPARE-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/FEATURE_COMPARE.html\nSELECT 1-FEATURE_COMPARE(esa_wiki_mod USING 'There are several PGA tour golfers from South Africa' text AND USING 'John Elway played quarterback for the Denver Broncos' text) similarity FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/FEATURE_DETAILS-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/FEATURE_DETAILS.html\nSELECT S.feature_id fid, value val,\n       FEATURE_DETAILS(nmf_sh_sample, S.feature_id, 5 using T.*) det\n   FROM\n     (SELECT v.*, FEATURE_SET(nmf_sh_sample, 3 USING *) fset\n         FROM mining_data_apply_v v\n         WHERE cust_id = 100002) T,\n   TABLE(T.fset) S\nORDER BY 2 DESC;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/FEATURE_DETAILS-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/FEATURE_DETAILS.html\nSELECT feature_id, value\n  FROM (\n     SELECT cust_id, feature_set(INTO 6 USING *) OVER () fset\n        FROM mining_data_apply_v),\n  TABLE (fset)\n  WHERE cust_id = 100001\n  ORDER BY feature_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/FEATURE_ID-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/FEATURE_ID.html\nSELECT FEATURE_ID(nmf_sh_sample USING *) AS feat, COUNT(*) AS cnt\n  FROM nmf_sh_sample_apply_prepared\n  GROUP BY FEATURE_ID(nmf_sh_sample USING *)\n  ORDER BY cnt DESC, feat DESC;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/FEATURE_SET-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/FEATURE_SET.html\nWITH\nfeat_tab AS (\nSELECT F.feature_id fid,\n       A.attribute_name attr,\n       TO_CHAR(A.attribute_value) val,\n       A.coefficient coeff\n  FROM TABLE(DBMS_DATA_MINING.GET_MODEL_DETAILS_NMF('nmf_sh_sample')) F,\n       TABLE(F.attribute_set) A\n WHERE A.coefficient > 0.25\n),\nfeat AS (\nSELECT fid,\n       CAST(COLLECT(Featattr(attr, val, coeff))\n         AS Featattrs) f_attrs\n  FROM feat_tab\nGROUP BY fid\n),\ncust_10_features AS (\nSELECT T.cust_id, S.feature_id, S.value\n  FROM (SELECT cust_id, FEATURE_SET(nmf_sh_sample, 10 USING *) pset\n          FROM nmf_sh_sample_apply_prepared\n         WHERE cust_id = 100002) T,\n       TABLE(T.pset) S\n)\nSELECT A.value, A.feature_id fid,\n       B.attr, B.val, B.coeff\n  FROM cust_10_features A,\n       (SELECT T.fid, F.*\n          FROM feat T,\n               TABLE(T.f_attrs) F) B\n WHERE A.feature_id = B.fid\nORDER BY A.value DESC, A.feature_id ASC, coeff DESC, attr ASC, val ASC;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/FEATURE_VALUE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/FEATURE_VALUE.html\nSELECT *\n  FROM (SELECT cust_id, FEATURE_VALUE(nmf_sh_sample, 3 USING *) match_quality\n          FROM nmf_sh_sample_apply_prepared\n          ORDER BY match_quality DESC)\n  WHERE ROWNUM < 11;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/FIRST-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/FIRST.html\nSELECT department_id,\n       MIN(salary) KEEP (DENSE_RANK FIRST ORDER BY commission_pct) \"Worst\",\n       MAX(salary) KEEP (DENSE_RANK LAST ORDER BY commission_pct) \"Best\"\n  FROM employees\n  GROUP BY department_id\n  ORDER BY department_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/FIRST-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/FIRST.html\nSELECT last_name, department_id, salary,\n       MIN(salary) KEEP (DENSE_RANK FIRST ORDER BY commission_pct)\n         OVER (PARTITION BY department_id) \"Worst\",\n       MAX(salary) KEEP (DENSE_RANK LAST ORDER BY commission_pct)\n         OVER (PARTITION BY department_id) \"Best\"\n   FROM employees\n   ORDER BY department_id, salary, last_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/FIRST_VALUE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/FIRST_VALUE.html\nSELECT employee_id, last_name, salary, hire_date,\n       FIRST_VALUE(last_name)\n         OVER (ORDER BY salary ASC ROWS UNBOUNDED PRECEDING) AS fv\n  FROM (SELECT * FROM employees\n          WHERE department_id = 90\n          ORDER BY hire_date);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/FIRST_VALUE-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/FIRST_VALUE.html\nSELECT employee_id, last_name, salary, hire_date,\n       FIRST_VALUE(last_name)\n         OVER (ORDER BY salary ASC ROWS UNBOUNDED PRECEDING) AS fv\n  FROM (SELECT * FROM employees\n          WHERE department_id = 90\n          ORDER by hire_date DESC);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/FIRST_VALUE-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/FIRST_VALUE.html\nSELECT employee_id, last_name, salary, hire_date,\n       FIRST_VALUE(last_name)\n         OVER (ORDER BY salary ASC, employee_id ROWS UNBOUNDED PRECEDING) AS fv\n  FROM (SELECT * FROM employees\n          WHERE department_id = 90\n          ORDER BY hire_date);\nSELECT employee_id, last_name, salary, hire_date,\n       FIRST_VALUE(last_name)\n         OVER (ORDER BY salary ASC, employee_id ROWS UNBOUNDED PRECEDING) AS fv\n   FROM (SELECT * FROM employees\n           WHERE department_id = 90\n           ORDER BY hire_date DESC);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/FIRST_VALUE-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/FIRST_VALUE.html\nSELECT employee_id, last_name, salary, hire_date,\n       FIRST_VALUE(last_name)\n         OVER (ORDER BY salary ASC RANGE UNBOUNDED PRECEDING) AS fv\n  FROM (SELECT * FROM employees\n          WHERE department_id = 90\n          ORDER BY hire_date);\nSELECT employee_id, last_name, salary, hire_date,\n       FIRST_VALUE(last_name)\n         OVER (ORDER BY salary ASC RANGE UNBOUNDED PRECEDING) AS fv\n  FROM (SELECT * FROM employees\n          WHERE department_id = 90\n          ORDER BY hire_date DESC);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/FLASHBACK-DATABASE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/FLASHBACK-DATABASE.html\nSTARTUP MOUNT \n\nALTER DATABASE FLASHBACK ON;\nALTER DATABASE OPEN;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/FLASHBACK-DATABASE-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/FLASHBACK-DATABASE.html\nSHUTDOWN DATABASE\n\nSTARTUP MOUNT \n\nFLASHBACK DATABASE TO TIMESTAMP SYSDATE-1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/FLASHBACK-TABLE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/FLASHBACK-TABLE.html\nSELECT * FROM RECYCLEBIN;\nSELECT * FROM USER_RECYCLEBIN;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/FLASHBACK-TABLE-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/FLASHBACK-TABLE.html\nCREATE TABLE employees_test \n  AS SELECT * FROM employees;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/FLASHBACK-TABLE-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/FLASHBACK-TABLE.html\nSELECT object_name, droptime FROM user_recyclebin \n   WHERE original_name = 'PRINT_MEDIA';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/FLASHBACK-TABLE-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/FLASHBACK-TABLE.html\nSELECT salary\n  FROM employees_test\n  WHERE salary < 2500;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/FLASHBACK-TABLE-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/FLASHBACK-TABLE.html\nALTER TABLE employees_test\n   ENABLE ROW MOVEMENT;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/FLASHBACK-TABLE-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/FLASHBACK-TABLE.html\nUPDATE employees_test\n  SET salary = salary * 1.1\n  WHERE salary < 2500;\nCOMMIT;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/FLASHBACK-TABLE-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/FLASHBACK-TABLE.html\nSELECT salary\n  FROM employees_test\n  WHERE salary < 2500;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/FLASHBACK-TABLE-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/FLASHBACK-TABLE.html\nFLASHBACK TABLE employees_test\n  TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' minute);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/FLASHBACK-TABLE-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/FLASHBACK-TABLE.html\nSELECT salary\n  FROM employees_test\n  WHERE salary < 2500;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/FLASHBACK-TABLE-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/FLASHBACK-TABLE.html\nFLASHBACK TABLE print_media TO BEFORE DROP;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/FLASHBACK-TABLE-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/FLASHBACK-TABLE.html\nFLASHBACK TABLE print_media TO BEFORE DROP RENAME TO print_media_old;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/FLOOR-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/FLOOR.html\nSELECT FLOOR(15.7) \"Floor\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/FROM_TZ-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/FROM_TZ.html\nSELECT FROM_TZ(TIMESTAMP '2000-03-28 08:00:00', '3:00') \n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Floating-Point-Conditions-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Floating-Point-Conditions.html\nSELECT COUNT(*) FROM employees\n  WHERE commission_pct IS NOT NAN;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Floating-Point-Conditions-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Floating-Point-Conditions.html\nSELECT last_name FROM employees\n  WHERE salary IS NOT INFINITE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Format-Models-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Format-Models.html\nSELECT TO_CHAR(number, 'fmt')\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Format-Models-47.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Format-Models.html\nSELECT TO_CHAR(TO_DATE('0207','MM/YY'), 'MM/YY') FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Format-Models-48.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Format-Models.html\nSELECT TO_CHAR(TO_DATE('0207', 'fxmm/yy'), 'mm/yy') FROM DUAL;\nSELECT TO_CHAR(TO_DATE('0207', 'fxmm/yy'), 'mm/yy') FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Format-Models-49.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Format-Models.html\nSELECT TO_CHAR (TO_DATE('02#07','MM/YY'), 'MM/YY') FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Format-Models-50.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Format-Models.html\nSELECT TO_CHAR(TO_DATE('27-OCT-98', 'DD-MON-RR'), 'YYYY') \"Year\" FROM DUAL;\nSELECT TO_CHAR(TO_DATE('27-OCT-17', 'DD-MON-RR'), 'YYYY') \"Year\" FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Format-Models-51.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Format-Models.html\nSELECT TO_CHAR(TO_DATE('27-OCT-98', 'DD-MON-RR'), 'YYYY') \"Year\" FROM DUAL;\nSELECT TO_CHAR(TO_DATE('27-OCT-17', 'DD-MON-RR'), 'YYYY') \"Year\" FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Format-Models-52.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Format-Models.html\nSELECT TO_CHAR(SYSDATE, 'fmDDTH') || ' of ' ||\n       TO_CHAR(SYSDATE, 'fmMonth') || ', ' ||\n       TO_CHAR(SYSDATE, 'YYYY') \"Ides\" \n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Format-Models-53.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Format-Models.html\nSELECT TO_CHAR(SYSDATE, 'DDTH') || ' of ' ||\n   TO_CHAR(SYSDATE, 'Month') || ', ' ||\n   TO_CHAR(SYSDATE, 'YYYY') \"Ides\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Format-Models-54.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Format-Models.html\nSELECT TO_CHAR(SYSDATE, 'fmDay') || '''s Special' \"Menu\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Format-Models-56.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Format-Models.html\nSELECT last_name employee, TO_CHAR(salary, '$99,990.99')\n  FROM employees\n  WHERE department_id = 80;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Format-Models-57.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Format-Models.html\nSELECT last_name employee, TO_CHAR(hire_date,'fmMonth DD, YYYY') hiredate\n  FROM employees\n  WHERE department_id = 20;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Format-Models-58.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Format-Models.html\nUPDATE employees \n  SET hire_date = TO_DATE('2008 05 20','YYYY MM DD') \n  WHERE last_name = 'Hunold';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/GRANT-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/GRANT.html\nGRANT CREATE SESSION \n   TO hr;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/GRANT-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/GRANT.html\nGRANT CREATE SESSION\n  TO hr, newuser IDENTIFIED BY password1, password2;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/GRANT-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/GRANT.html\nGRANT SELECT, UPDATE \n   ON emp_view TO PUBLIC;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/GRANT-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/GRANT.html\nGRANT SELECT \n   ON oe.customers_seq TO hr;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/GRANT-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/GRANT.html\nSELECT oe.customers_seq.NEXTVAL \n   FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/GRANT-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/GRANT.html\nGRANT REFERENCES (employee_id), \n      UPDATE (employee_id, salary, commission_pct) \n   ON hr.employees\n   TO oe;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/GRANT-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/GRANT.html\nCREATE TABLE dependent \n   (dependno   NUMBER, \n    dependname VARCHAR2(10), \n    employee   NUMBER \n   CONSTRAINT in_emp REFERENCES hr.employees(employee_id) );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/GRANT-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/GRANT.html\nGRANT\n     CREATE ANY MATERIALIZED VIEW\n   , ALTER ANY MATERIALIZED VIEW\n   , DROP ANY MATERIALIZED VIEW\n   , QUERY REWRITE\n   , GLOBAL QUERY REWRITE\n   TO dw_manager\n   WITH ADMIN OPTION;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/GRANT-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/GRANT.html\nGRANT dw_manager \n   TO sh \n   WITH ADMIN OPTION;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/GRANT-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/GRANT.html\nGRANT dw_manager \n   TO sh \n   WITH DELEGATE OPTION;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/GRANT-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/GRANT.html\nGRANT SELECT ON sh.sales TO warehouse_user;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/GRANT-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/GRANT.html\nGRANT warehouse_user TO dw_manager;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/GRANT-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/GRANT.html\nGRANT INHERIT PRIVILEGES ON USER sh TO hr;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/GRANT-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/GRANT.html\nGRANT READ ON DIRECTORY bfile_dir TO hr\n   WITH GRANT OPTION;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/GRANT-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/GRANT.html\nGRANT ALL ON bonuses TO hr \n   WITH GRANT OPTION;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/GREATEST-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/GREATEST.html\nSELECT GREATEST('HARRY', 'HARRIOT', 'HAROLD') \"Greatest\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/GREATEST-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/GREATEST.html\nSELECT GREATEST (1, '3.925', '2.4') \"Greatest\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/GROUPING-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/GROUPING.html\nSELECT \n    DECODE(GROUPING(department_name), 1, 'ALL DEPARTMENTS', department_name)\n      AS department,\n    DECODE(GROUPING(job_id), 1, 'All Jobs', job_id) AS job,\n    COUNT(*) \"Total Empl\",\n    AVG(salary) * 12 \"Average Sal\"\n  FROM employees e, departments d\n  WHERE d.department_id = e.department_id\n  GROUP BY ROLLUP (department_name, job_id)\n  ORDER BY department, job;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/GROUPING_ID-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/GROUPING_ID.html\nSELECT channel_id, promo_id, sum(amount_sold) s_sales,\n       GROUPING(channel_id) gc,\n       GROUPING(promo_id) gp,\n       GROUPING_ID(channel_id, promo_id) gcp,\n       GROUPING_ID(promo_id, channel_id) gpc\n  FROM sales\n  WHERE promo_id > 496\n  GROUP BY CUBE(channel_id, promo_id)\n  ORDER BY channel_id, promo_id, s_sales, gc;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/GROUP_ID-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/GROUP_ID.html\nSELECT co.country_region, co.country_subregion,\n       SUM(s.amount_sold) \"Revenue\", GROUP_ID() g\n  FROM sales s, customers c, countries co\n  WHERE s.cust_id = c.cust_id\n    AND c.country_id = co.country_id\n    AND s.time_id = '1-JAN-00'\n    AND co.country_region IN ('Americas', 'Europe')\n  GROUP BY GROUPING SETS ( (co.country_region, co.country_subregion),\n                           (co.country_region, co.country_subregion) )\n  ORDER BY co.country_region, co.country_subregion, \"Revenue\", g;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Graphic-Syntax-Diagrams-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Graphic-Syntax-Diagrams.html\nDROP LIBRARY hq_lib;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Graphic-Syntax-Diagrams-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Graphic-Syntax-Diagrams.html\nALTER JAVA SOURCE jsource_1 COMPILE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/HEXTORAW-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/HEXTORAW.html\nCREATE TABLE test (raw_col RAW(10));\nINSERT INTO test VALUES (HEXTORAW('7D'));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/HEXTORAW-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/HEXTORAW.html\nSELECT UTL_RAW.CAST_TO_VARCHAR2(HEXTORAW('4041424344'))\n  FROM DUAL;\n@ABCD\n"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Hierarchical-Queries-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Hierarchical-Queries.html\nSELECT employee_id, last_name, manager_id\n   FROM employees\n   CONNECT BY PRIOR employee_id = manager_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Hierarchical-Queries-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Hierarchical-Queries.html\nSELECT employee_id, last_name, manager_id, LEVEL\n   FROM employees\n   CONNECT BY PRIOR employee_id = manager_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Hierarchical-Queries-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Hierarchical-Queries.html\nSELECT last_name, employee_id, manager_id, LEVEL\n      FROM employees\n      START WITH employee_id = 100\n      CONNECT BY PRIOR employee_id = manager_id\n      ORDER SIBLINGS BY last_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Hierarchical-Queries-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Hierarchical-Queries.html\nUPDATE employees SET manager_id = 145\n   WHERE employee_id = 100;\nSELECT last_name \"Employee\", \n   LEVEL, SYS_CONNECT_BY_PATH(last_name, '/') \"Path\"\n   FROM employees\n   WHERE level <= 3 AND department_id = 80\n   START WITH last_name = 'King'\n   CONNECT BY PRIOR employee_id = manager_id AND LEVEL <= 4;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Hierarchical-Queries-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Hierarchical-Queries.html\nSELECT last_name \"Employee\", CONNECT_BY_ISCYCLE \"Cycle\",\n   LEVEL, SYS_CONNECT_BY_PATH(last_name, '/') \"Path\"\n   FROM employees\n   WHERE level <= 3 AND department_id = 80\n   START WITH last_name = 'King'\n   CONNECT BY NOCYCLE PRIOR employee_id = manager_id AND LEVEL <= 4\n   ORDER BY \"Employee\", \"Cycle\", LEVEL, \"Path\";"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Hierarchical-Queries-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Hierarchical-Queries.html\nSELECT LTRIM(SYS_CONNECT_BY_PATH (warehouse_id,','),',') FROM\n   (SELECT ROWNUM r, warehouse_id FROM warehouses)\n   WHERE CONNECT_BY_ISLEAF = 1\n   START WITH r = 1\n   CONNECT BY r = PRIOR r + 1\n   ORDER BY warehouse_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Hierarchical-Queries-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Hierarchical-Queries.html\nSELECT last_name \"Employee\", CONNECT_BY_ROOT last_name \"Manager\",\n   LEVEL-1 \"Pathlen\", SYS_CONNECT_BY_PATH(last_name, '/') \"Path\"\n   FROM employees\n   WHERE LEVEL > 1 and department_id = 110\n   CONNECT BY PRIOR employee_id = manager_id\n   ORDER BY \"Employee\", \"Manager\", \"Pathlen\", \"Path\";"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Hierarchical-Queries-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Hierarchical-Queries.html\nSELECT name, SUM(salary) \"Total_Salary\" FROM (\n   SELECT CONNECT_BY_ROOT last_name as name, Salary\n      FROM employees\n      WHERE department_id = 110\n      CONNECT BY PRIOR employee_id = manager_id)\n      GROUP BY name\n   ORDER BY name, \"Total_Salary\";"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Hierarchical-Query-Pseudocolumns-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Hierarchical-Query-Pseudocolumns.html\nSELECT last_name \"Employee\", CONNECT_BY_ISLEAF \"IsLeaf\",\n       LEVEL, SYS_CONNECT_BY_PATH(last_name, '/') \"Path\"\n  FROM employees\n  WHERE LEVEL <= 3 AND department_id = 80\n  START WITH employee_id = 100\n  CONNECT BY PRIOR employee_id = manager_id AND LEVEL <= 4\n  ORDER BY \"Employee\", \"IsLeaf\";"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/IN-Condition-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/IN-Condition.html\nSELECT * FROM employees\n  WHERE job_id IN\n  ('PU_CLERK','SH_CLERK')\n  ORDER BY employee_id;\nSELECT * FROM employees\n  WHERE salary IN\n  (SELECT salary \n   FROM employees\n   WHERE department_id =30)\n  ORDER BY employee_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/IN-Condition-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/IN-Condition.html\nSELECT * FROM employees\n  WHERE salary NOT IN\n  (SELECT salary \n   FROM employees\n  WHERE department_id = 30)\n  ORDER BY employee_id;\nSELECT * FROM employees\n  WHERE job_id NOT IN\n  ('PU_CLERK', 'SH_CLERK')\n  ORDER BY employee_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/IN-Condition-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/IN-Condition.html\nSELECT 'True' FROM employees\n   WHERE department_id NOT IN (10, 20);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/IN-Condition-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/IN-Condition.html\nSELECT 'True' FROM employees\n    WHERE department_id NOT IN (10, 20, NULL);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/IN-Condition-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/IN-Condition.html\nSELECT 'True' FROM employees\n   WHERE department_id NOT IN (SELECT 0 FROM DUAL WHERE 1=2);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/IN-Condition-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/IN-Condition.html\nSELECT employee_id, last_name FROM employees\n   WHERE (employee_id, LEVEL) \n      IN (SELECT employee_id, 2 FROM employees)\n   START WITH employee_id = 2\n   CONNECT BY PRIOR employee_id = manager_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/IN-Condition-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/IN-Condition.html\nSELECT v.employee_id, v.last_name, v.lev FROM\n      (SELECT employee_id, last_name, LEVEL lev \n      FROM employees v\n      START WITH employee_id = 100 \n      CONNECT BY PRIOR employee_id = manager_id) v \n   WHERE (v.employee_id, v.lev) IN\n      (SELECT employee_id, 2 FROM employees);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/INITCAP-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/INITCAP.html\nSELECT INITCAP('the soap') \"Capitals\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/INSERT-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/INSERT.html\nCREATE TABLE raises (emp_id NUMBER, sal NUMBER \n   CONSTRAINT check_sal CHECK(sal > 8000));\nEXECUTE DBMS_ERRLOG.CREATE_ERROR_LOG('raises', 'errlog');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/INSERT-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/INSERT.html\nINSERT INTO raises\n   SELECT employee_id, salary*1.1 FROM employees\n   WHERE commission_pct > .2\n   LOG ERRORS INTO errlog ('my_bad') REJECT LIMIT 10;\nSELECT ORA_ERR_MESG$, ORA_ERR_TAG$, emp_id, sal FROM errlog;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/INSERT-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/INSERT.html\nINSERT INTO employees@remote\n   VALUES (8002, 'Juan', 'Fernandez', 'juanf@example.com', NULL, \n   TO_DATE('04-OCT-1992', 'DD-MON-YYYY'), 'SH_CLERK', 3000, \n   NULL, 121, 20);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/INSERT-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/INSERT.html\nINSERT INTO departments \n   VALUES  (departments_seq.nextval, 'Entertainment', 162, 1400);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/INSERT-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/INSERT.html\nINSERT INTO employees \n      (employee_id, last_name, email, hire_date, job_id, salary)\n   VALUES \n   (employees_seq.nextval, 'Doe', 'john.doe@example.com', \n       SYSDATE, 'SH_CLERK', 2400) \n   RETURNING salary*12, job_id INTO :bnd1, :bnd2;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/INSERT-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/INSERT.html\nINSERT INTO persons VALUES (person_t('Bob', 1234));\nINSERT INTO persons VALUES (employee_t('Joe', 32456, 12, 100000));\nINSERT INTO persons VALUES (\n   part_time_emp_t('Tim', 5678, 13, 1000, 20));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/INSERT-16.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/INSERT.html\nINSERT INTO books VALUES (\n   'An Autobiography', person_t('Bob', 1234));\nINSERT INTO books VALUES (\n   'Business Rules', employee_t('Joe', 3456, 12, 10000));\nINSERT INTO books VALUES (\n   'Mixing School and Work', \n   part_time_emp_t('Tim', 5678, 13, 1000, 20));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/INSERT-17.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/INSERT.html\nCREATE TABLE long_tab (pic_id NUMBER, long_pics LONG RAW);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/INSERT-18.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/INSERT.html\nCREATE TABLE lob_tab (pic_id NUMBER, lob_pics BLOB);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/INSERT-19.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/INSERT.html\nINSERT INTO lob_tab \n   SELECT pic_id, TO_LOB(long_pics) FROM long_tab;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/INSERT-20.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/INSERT.html\nALTER TABLE long_tab DROP COLUMN long_pics;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/INSERT-21.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/INSERT.html\nSELECT * FROM sales_input_table;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/INSERT-24.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/INSERT.html\nINSERT ALL\n      INTO sales (prod_id, cust_id, time_id, amount)\n      VALUES (product_id, customer_id, weekly_start_date, sales_sun)\n      INTO sales (prod_id, cust_id, time_id, amount)\n      VALUES (product_id, customer_id, weekly_start_date+1, sales_mon)\n      INTO sales (prod_id, cust_id, time_id, amount)\n      VALUES (product_id, customer_id, weekly_start_date+2, sales_tue)\n      INTO sales (prod_id, cust_id, time_id, amount)\n      VALUES (product_id, customer_id, weekly_start_date+3, sales_wed)\n      INTO sales (prod_id, cust_id, time_id, amount)\n      VALUES (product_id, customer_id, weekly_start_date+4, sales_thu)\n      INTO sales (prod_id, cust_id, time_id, amount)\n      VALUES (product_id, customer_id, weekly_start_date+5, sales_fri)\n      INTO sales (prod_id, cust_id, time_id, amount)\n      VALUES (product_id, customer_id, weekly_start_date+6, sales_sat)\n   SELECT product_id, customer_id, weekly_start_date, sales_sun,\n      sales_mon, sales_tue, sales_wed, sales_thu, sales_fri, sales_sat\n      FROM sales_input_table;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/INSERT-25.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/INSERT.html\nSELECT * FROM sales\n   ORDER BY prod_id, cust_id, time_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/INSERT-26.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/INSERT.html\nCREATE TABLE small_orders \n   (order_id       NUMBER(12)   NOT NULL,\n    customer_id    NUMBER(6)    NOT NULL,\n    order_total    NUMBER(8,2),\n    sales_rep_id   NUMBER(6)\n   );\nCREATE TABLE medium_orders AS SELECT * FROM small_orders;\nCREATE TABLE large_orders AS SELECT * FROM small_orders;\nCREATE TABLE special_orders \n   (order_id       NUMBER(12)    NOT NULL,\n    customer_id    NUMBER(6)     NOT NULL,\n    order_total    NUMBER(8,2),\n    sales_rep_id   NUMBER(6),\n    credit_limit   NUMBER(9,2),\n    cust_email     VARCHAR2(40)\n   );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/INSERT-27.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/INSERT.html\nINSERT ALL\n   WHEN order_total <= 100000 THEN\n      INTO small_orders\n   WHEN order_total > 1000000 AND order_total <= 200000 THEN\n      INTO medium_orders\n   WHEN order_total > 200000 THEN\n      INTO large_orders\n   SELECT order_id, order_total, sales_rep_id, customer_id\n      FROM orders;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/INSERT-28.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/INSERT.html\nINSERT ALL\n   WHEN order_total <= 100000 THEN\n      INTO small_orders\n   WHEN order_total > 100000 AND order_total <= 200000 THEN\n      INTO medium_orders\n   ELSE\n      INTO large_orders\n   SELECT order_id, order_total, sales_rep_id, customer_id\n      FROM orders;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/INSERT-29.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/INSERT.html\nINSERT ALL\n   WHEN ottl <= 100000 THEN\n      INTO small_orders\n         VALUES(oid, ottl, sid, cid)\n   WHEN ottl > 100000 and ottl <= 200000 THEN\n      INTO medium_orders \n         VALUES(oid, ottl, sid, cid)\n   WHEN ottl > 200000 THEN\n      into large_orders\n         VALUES(oid, ottl, sid, cid)\n   WHEN ottl > 290000 THEN\n      INTO special_orders\n   SELECT o.order_id oid, o.customer_id cid, o.order_total ottl,\n      o.sales_rep_id sid, c.credit_limit cl, c.cust_email cem\n      FROM orders o, customers c\n      WHERE o.customer_id = c.customer_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/INSERT-30.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/INSERT.html\nINSERT FIRST\n   WHEN ottl <= 100000 THEN\n      INTO small_orders\n         VALUES(oid, ottl, sid, cid)\n   WHEN ottl > 100000 and ottl <= 200000 THEN\n      INTO medium_orders\n         VALUES(oid, ottl, sid, cid)\n   WHEN ottl > 290000 THEN\n      INTO special_orders\n   WHEN ottl > 200000 THEN\n      INTO large_orders\n         VALUES(oid, ottl, sid, cid)\n   SELECT o.order_id oid, o.customer_id cid, o.order_total ottl,\n      o.sales_rep_id sid, c.credit_limit cl, c.cust_email cem\n      FROM orders o, customers c\n      WHERE o.customer_id = c.customer_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/INSERT-31.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/INSERT.html\nCREATE TABLE people ( \n  person_id   INTEGER NOT NULL PRIMARY KEY, \n  given_name  VARCHAR2(100) NOT NULL, \n  family_name VARCHAR2(100) NOT NULL, \n  title       VARCHAR2(20), \n  birth_date  DATE \n);\nCREATE TABLE patients ( \n  patient_id          INTEGER NOT NULL PRIMARY KEY REFERENCES people (person_id), \n  last_admission_date DATE \n);\nCREATE TABLE staff ( \n  staff_id   INTEGER NOT NULL PRIMARY KEY REFERENCES people (person_id), \n  hired_date DATE \n);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/INSERT-32.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/INSERT.html\nINSERT INTO people \nVALUES (1, 'Dave', 'Badger', 'Mr', date'1960-05-01');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/INSERT-33.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/INSERT.html\nINSERT INTO people \nVALUES (2, 'Simon', 'Fox', 'Mr');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/INSERT-34.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/INSERT.html\nINSERT INTO people (person_id, given_name, family_name, title) \nVALUES (2, 'Simon', 'Fox', 'Mr');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/INSERT-35.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/INSERT.html\nINSERT INTO people (person_id, given_name, family_name, title) \nVALUES (3, 'Dave', 'Frog', (SELECT 'Mr' FROM dual));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/INSERT-36.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/INSERT.html\nINSERT INTO people (person_id, given_name, family_name, title) \n  WITH names AS ( \n    SELECT 4, 'Ruth',     'Fox',      'Mrs'    FROM dual UNION ALL \n    SELECT 5, 'Isabelle', 'Squirrel', 'Miss'   FROM dual UNION ALL \n    SELECT 6, 'Justin',   'Frog',     'Master' FROM dual UNION ALL \n    SELECT 7, 'Lisa',     'Owl',      'Dr'     FROM dual \n  ) \n  SELECT * FROM names;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/INSERT-37.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/INSERT.html\nROLLBACK;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/INSERT-38.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/INSERT.html\nINSERT INTO people (person_id, given_name, family_name, title) \n  WITH names AS ( \n    SELECT 4, 'Ruth',     'Fox' family_name,      'Mrs'    FROM dual UNION ALL \n    SELECT 5, 'Isabelle', 'Squirrel' family_name, 'Miss'   FROM dual UNION ALL \n    SELECT 6, 'Justin',   'Frog' family_name,     'Master' FROM dual UNION ALL \n    SELECT 7, 'Lisa',     'Owl' family_name,      'Dr'     FROM dual \n  ) \n  SELECT * FROM names \n  WHERE  family_name LIKE 'F%';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/INSERT-39.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/INSERT.html\nROLLBACK;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/INSERT-40.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/INSERT.html\nINSERT ALL \n  /* Every one is a person */ \n  INTO people (person_id, given_name, family_name, title) \n    VALUES (id, given_name, family_name, title) \n  INTO patients (patient_id, last_admission_date) \n    VALUES (id, admission_date) \n  INTO staff (staff_id, hired_date) \n    VALUES (id, hired_date) \n  WITH names AS ( \n    SELECT 4 id, 'Ruth' given_name, 'Fox' family_name, 'Mrs' title, \n           NULL hired_date, DATE'2009-12-31' admission_date \n    FROM   dual UNION ALL \n    SELECT 5 id, 'Isabelle' given_name, 'Squirrel' family_name, 'Miss' title , \n           NULL hired_date, DATE'2014-01-01' admission_date \n    FROM   dual UNION ALL \n    SELECT 6 id, 'Justin' given_name, 'Frog' family_name, 'Master' title, \n           NULL hired_date, DATE'2015-04-22' admission_date \n    FROM   dual UNION ALL \n    SELECT 7 id, 'Lisa' given_name, 'Owl' family_name, 'Dr' title, \n           DATE'2015-01-01' hired_date, NULL admission_date \n    FROM   dual \n  ) \n  SELECT * FROM names;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/INSERT-41.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/INSERT.html\nROLLBACK;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/INSERT-42.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/INSERT.html\nINSERT ALL \n  /* Everyone is a person, so insert all rows into people */ \n  WHEN 1=1 THEN \n    INTO people (person_id, given_name, family_name, title) \n    VALUES (id, given_name, family_name, title) \n  /* Only people with an admission date are patients */ \n  WHEN admission_date IS NOT NULL THEN \n    INTO patients (patient_id, last_admission_date) \n    VALUES (id, admission_date) \n  /* Only people with a hired date are staff */ \n  WHEN hired_date IS NOT NULL THEN \n    INTO staff (staff_id, hired_date) \n    VALUES (id, hired_date) \n  WITH names AS ( \n    SELECT 4 id, 'Ruth' given_name, 'Fox' family_name, 'Mrs' title, \n           NULL hired_date, DATE'2009-12-31' admission_date \n    FROM   dual UNION ALL \n    SELECT 5 id, 'Isabelle' given_name, 'Squirrel' family_name, 'Miss' title , \n           NULL hired_date, DATE'2014-01-01' admission_date \n    FROM   dual UNION ALL \n    SELECT 6 id, 'Justin' given_name, 'Frog' family_name, 'Master' title, \n           NULL hired_date, DATE'2015-04-22' admission_date \n    FROM   dual UNION ALL \n    SELECT 7 id, 'Lisa' given_name, 'Owl' family_name, 'Dr' title, \n           DATE'2015-01-01' hired_date, NULL admission_date \n    FROM   dual \n  ) \n  SELECT * FROM names;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/INSERT-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/INSERT.html\nINSERT INTO departments\n   VALUES (280, 'Recreation', 121, 1700);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/INSERT-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/INSERT.html\nINSERT INTO departments\n   VALUES (280, 'Recreation', DEFAULT, 1700);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/INSERT-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/INSERT.html\nINSERT INTO employees (employee_id, last_name, email, \n      hire_date, job_id, salary, commission_pct) \n   VALUES (207, 'Gregory', 'pgregory@example.com', \n      sysdate, 'PU_CLERK', 1.2E3, NULL);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/INSERT-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/INSERT.html\nINSERT INTO \n   (SELECT employee_id, last_name, email, hire_date, job_id, \n      salary, commission_pct FROM employees) \n   VALUES (207, 'Gregory', 'pgregory@example.com', \n      sysdate, 'PU_CLERK', 1.2E3, NULL);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/INSERT-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/INSERT.html\nINSERT INTO bonuses\n   SELECT employee_id, salary*1.1 \n   FROM employees\n   WHERE commission_pct > 0.25;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/INSTR-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/INSTR.html\nSELECT INSTR('CORPORATE FLOOR','OR', 3, 2) \"Instring\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/INSTR-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/INSTR.html\nSELECT INSTR('CORPORATE FLOOR','OR', -3, 2) \"Reversed Instring\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/INSTR-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/INSTR.html\nSELECT INSTRB('CORPORATE FLOOR','OR',5,2) \"Instring in bytes\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/IS-OF-type-Condition-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/IS-OF-type-Condition.html\nSELECT * FROM persons p \n   WHERE VALUE(p) IS OF TYPE (employee_t);\nSELECT * FROM persons p \n   WHERE VALUE(p) IS OF (ONLY part_time_emp_t);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ITERATION_NUMBER-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ITERATION_NUMBER.html\nSELECT country, prod, year, s\n  FROM sales_view_ref\n  MODEL\n    PARTITION BY (country)\n    DIMENSION BY (prod, year)\n    MEASURES (sale s)\n    IGNORE NAV\n    UNIQUE DIMENSION\n    RULES UPSERT SEQUENTIAL ORDER ITERATE(2)\n      (\n        s['Mouse Pad', 2001 + ITERATION_NUMBER] =\n          s['Mouse Pad', 1998 + ITERATION_NUMBER]\n      )\n  ORDER BY country, prod, year;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Interval-Expressions-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Interval-Expressions.html\nSELECT (SYSTIMESTAMP - order_date) DAY(9) TO SECOND FROM orders\n   WHERE order_id = 2458;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON-Object-Access-Expressions-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON-Object-Access-Expressions.html\nSELECT po.po_document.PONumber.number()\n  FROM j_purchaseorder po;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON-Object-Access-Expressions-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON-Object-Access-Expressions.html\nSELECT po.po_document.ShippingInstructions.Phone\n  FROM j_purchaseorder po;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON-Object-Access-Expressions-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON-Object-Access-Expressions.html\nSELECT po.po_document.LineItems.Part.Description\n  FROM j_purchaseorder po;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_ARRAY-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_ARRAY.html\nSELECT JSON_ARRAY (     \n    JSON_OBJECT('percentage' VALUE .50),\n    JSON_ARRAY(1,2,3),\n    100,\n    'California',\n    null\n    NULL ON NULL\n    ) \"JSON Array Example\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_ARRAYAGG-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_ARRAYAGG.html\nCREATE TABLE id_table (id NUMBER);\nINSERT INTO id_table VALUES(624);\nINSERT INTO id_table VALUES(null);\nINSERT INTO id_table VALUES(925);\nINSERT INTO id_table VALUES(585);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_ARRAYAGG-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_ARRAYAGG.html\nSELECT JSON_ARRAYAGG(id ORDER BY id RETURNING VARCHAR2(100)) ID_NUMBERS\n  FROM id_table;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_DATAGUIDE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_DATAGUIDE.html\nSELECT EXTRACT(YEAR FROM date_loaded) YEAR,\n       JSON_DATAGUIDE(po_document) \"DATA GUIDE\"\n  FROM j_purchaseorder\n  GROUP BY extract(YEAR FROM date_loaded)\n  ORDER BY extract(YEAR FROM date_loaded) DESC;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_OBJECT-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_OBJECT.html\nSELECT JSON_OBJECT(\n'name' : first_name || ' ' || last_name,\n'email' : email,\n'phone' : phone_number,\n'hire_date' : hire_date\n)\nFROM employees\nWHERE employee_id = 140;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_OBJECT-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_OBJECT.html\nSELECT JSON_OBJECT(*)\nFROM employees\nWHERE employee_id = 140;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_OBJECT-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_OBJECT.html\nSELECT JSON_OBJECT(\n'first_name' VALUE first_name,\n'last_name' VALUE last_name,\n'email' VALUE email,\n'hire_date' VALUE hire_date\n)\nFROM employees\nWHERE employee_id = 140;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_OBJECT-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_OBJECT.html\nSELECT JSON_OBJECT(first_name, last_name, email, hire_date)\nFROM employees\nWHERE employee_id = 140;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_OBJECT-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_OBJECT.html\nSELECT JSON_OBJECT('NAME' VALUE first_name, d.*)\nFROM employees e, departments d\nWHERE e.department_id = d.department_id\nAND e.employee_id =140"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_OBJECT-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_OBJECT.html\nSELECT JSON_ARRAYAGG(JSON_OBJECT(*))\nFROM departments"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_OBJECT-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_OBJECT.html\nSELECT JSON_OBJECT (\n    KEY 'deptno' VALUE d.department_id,\n    KEY 'deptname' VALUE d.department_name \n    ) \"Department Objects\"\n  FROM departments d\n  ORDER BY d.department_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_OBJECTAGG-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_OBJECTAGG.html\nSELECT JSON_OBJECTAGG(KEY department_name VALUE department_id) \"Department Numbers\"\n  FROM departments\n  WHERE department_id <= 30;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_QUERY-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_QUERY.html\nSELECT JSON_QUERY('{a:100, b:200, c:300}', '$') AS value\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_QUERY-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_QUERY.html\nSELECT JSON_QUERY('{a:100, b:200, c:300}', '$.a' WITH WRAPPER) AS value\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_QUERY-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_QUERY.html\nSELECT JSON_QUERY('[{\"a\":100},{\"b\":200},{\"c\":300}]', '$[*]'\n       RETURNING VARCHAR2(100) WITH CONDITIONAL WRAPPER) AS value\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_QUERY-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_QUERY.html\nSELECT JSON_QUERY('[{\"a\":100},{\"b\":200},{\"c\":300}]', '$[3]'\n       EMPTY ON ERROR) AS value\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_QUERY-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_QUERY.html\nSELECT JSON_QUERY('{a:100, b:200, c:300}', '$.*' WITH WRAPPER) AS value\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_QUERY-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_QUERY.html\nSELECT JSON_QUERY('[0,1,2,3,4]', '$') AS value\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_QUERY-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_QUERY.html\nSELECT JSON_QUERY('[0,1,2,3,4]', '$' WITH WRAPPER) AS value\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_QUERY-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_QUERY.html\nSELECT JSON_QUERY('[0,1,2,3,4]', '$[*]' WITH WRAPPER) AS value\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_QUERY-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_QUERY.html\nSELECT JSON_QUERY('[0,1,2,3,4,5,6,7,8]', '$[0, 3 to 5, 7]' WITH WRAPPER) AS value\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_QUERY-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_QUERY.html\nSELECT JSON_QUERY('[0,1,2,3,4]', '$[3]' WITH WRAPPER) AS value\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_QUERY-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_QUERY.html\nSELECT JSON_QUERY('[{a:100},{b:200},{c:300}]', '$[0]'\n       WITH CONDITIONAL WRAPPER) AS value\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_QUERY-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_QUERY.html\nSELECT JSON_QUERY('[{\"a\":100},{\"b\":200},{\"c\":300}]', '$[*]'\n       WITH CONDITIONAL WRAPPER) AS value\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_SERIALIZE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_SERIALIZE.html\nSELECT JSON_SERIALIZE('{price:20, currency:\" €\"}' ASCII PRETTY ORDERED) from dual;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_TABLE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_TABLE.html\nSELECT t.*\nFROM j_purchaseOrder\nNESTED po_document COLUMNS(PONumber, Reference, Requestor) t;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_TABLE-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_TABLE.html\nSELECT t.*\nFROM j_purchaseOrder LEFT OUTER JOIN\nJSON_TABLE(po_document COLUMNS(PONumber, Reference, Requestor)) t ON 1=1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_TABLE-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_TABLE.html\nSELECT requestor\nFROM j_purchaseorder,\nJSON_TABLE(po_document, '$'\nCOLUMNS\n  (requestor VARCHAR2(32) PATH '$.Requestor',\n   has_zip VARCHAR2(5) EXISTS PATH '$.ShippingInstructions.Address.zipCode'))\nWHERE (has_zip = 'true');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_TABLE-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_TABLE.html\nSELECT *\nFROM JSON_TABLE('[1,2,[\"a\",\"b\"]]', '$'\nCOLUMNS (outer_value_0 NUMBER PATH '$[0]',\n         outer_value_1 NUMBER PATH '$[1]', \n         outer_value_2 VARCHAR2(20) FORMAT JSON PATH '$[2]'));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_TABLE-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_TABLE.html\nSELECT *\nFROM JSON_TABLE('[1,2,[\"a\",\"b\"]]', '$'\nCOLUMNS (outer_value_0 NUMBER PATH '$[0]',\n         outer_value_1 NUMBER PATH '$[1]',\n         NESTED PATH '$[2]'\n         COLUMNS (nested_value_0 VARCHAR2(1) PATH '$[0]',\n                  nested_value_1 VARCHAR2(1) PATH '$[1]')));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_TABLE-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_TABLE.html\nSELECT *\nFROM JSON_TABLE('{a:100, b:200, c:{d:300, e:400}}', '$'\nCOLUMNS (outer_value_0 NUMBER PATH '$.a',\n         outer_value_1 NUMBER PATH '$.b',\n         NESTED PATH '$.c'\n         COLUMNS (nested_value_0 NUMBER PATH '$.d',\n                  nested_value_1 NUMBER PATH '$.e')));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_TABLE-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_TABLE.html\nSELECT jt.*\nFROM j_purchaseorder,\nJSON_TABLE(po_document, '$'\nCOLUMNS\n  (requestor VARCHAR2(32) PATH '$.Requestor',\n   NESTED PATH '$.ShippingInstructions.Phone[*]'\n     COLUMNS (phone_type VARCHAR2(32) PATH '$.type',\n              phone_num VARCHAR2(20) PATH '$.number')))\nAS jt;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_TABLE-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_TABLE.html\nSELECT c.*\nFROM customer t,\nJSON_TABLE(t.json COLUMNS(\nid, name, phone, address,\nNESTED orders[*] COLUMNS(\nupdated, status,\nNESTED lineitems[*] COLUMNS(\ndescription, quantity NUMBER, price NUMBER\n)\n)\n)) c;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_TABLE-16.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_TABLE.html\nSELECT c.*\nFROM customer t,\nJSON_TABLE(t.json, '$' COLUMNS(\nid PATH '$.id',\nname PATH '$.name',\nphone PATH '$.phone',\naddress PATH '$.address',\nNESTED PATH '$.orders[*]' COLUMNS(\nupdated PATH '$.updated',\nstatus PATH '$.status',\nNESTED PATH '$.lineitems[*]' COLUMNS(\ndescription PATH '$.description',\nquantity NUMBER PATH '$.quantity',\nprice NUMBER PATH '$.price'\n)\n)\n)) c;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_TABLE-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_TABLE.html\nSELECT *\nFROM j_purchaseOrder\nNESTED po_document.LineItems[*]\nCOLUMNS(ItemNumber, Quantity NUMBER);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_TABLE-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_TABLE.html\nCREATE TABLE j_purchaseorder\n  (id RAW (16) NOT NULL,\n   date_loaded TIMESTAMP(6) WITH TIME ZONE,\n   po_document CLOB CONSTRAINT ensure_json CHECK (po_document IS JSON));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_TABLE-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_TABLE.html\nINSERT INTO j_purchaseorder\n  VALUES (\n    SYS_GUID(),\n    SYSTIMESTAMP,\n    '{\"PONumber\"              : 1600,\n      \"Reference\"             : \"ABULL-20140421\",\n       \"Requestor\"            : \"Alexis Bull\",\n       \"User\"                 : \"ABULL\",\n       \"CostCenter\"           : \"A50\",\n       \"ShippingInstructions\" : {\"name\"   : \"Alexis Bull\",\n                                 \"Address\": {\"street\"   : \"200 Sporting Green\",\n                                              \"city\"    : \"South San Francisco\",\n                                              \"state\"   : \"CA\",\n                                              \"zipCode\" : 99236,\n                                              \"country\" : \"United States of America\"},\n                                 \"Phone\" : [{\"type\" : \"Office\", \"number\" : \"909-555-7307\"},\n                                            {\"type\" : \"Mobile\", \"number\" : \"415-555-1234\"}]},\n       \"Special Instructions\" : null,\n       \"AllowPartialShipment\" : true,\n       \"LineItems\" : [{\"ItemNumber\" : 1,\n                       \"Part\" : {\"Description\" : \"One Magic Christmas\",\n                                 \"UnitPrice\"   : 19.95,\n                                 \"UPCCode\"     : 13131092899},\n                       \"Quantity\" : 9.0},\n                      {\"ItemNumber\" : 2,\n                       \"Part\" : {\"Description\" : \"Lethal Weapon\",\n                                 \"UnitPrice\"   : 19.95,\n                                 \"UPCCode\"     : 85391628927},\n                       \"Quantity\" : 5.0}]}');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_TABLE-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_TABLE.html\nSELECT jt.phones\nFROM j_purchaseorder,\nJSON_TABLE(po_document, '$.ShippingInstructions'\nCOLUMNS\n  (phones VARCHAR2(100) FORMAT JSON PATH '$.Phone')) AS jt;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_TABLE-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_TABLE.html\nSELECT jt.*\nFROM j_purchaseorder,\nJSON_TABLE(po_document, '$.ShippingInstructions.Phone[*]'\nCOLUMNS (row_number FOR ORDINALITY,\n         phone_type VARCHAR2(10) PATH '$.type',\n         phone_num VARCHAR2(20) PATH '$.number'))\nAS jt;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_TABLE-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_TABLE.html\nSELECT requestor, has_zip\nFROM j_purchaseorder,\nJSON_TABLE(po_document, '$'\nCOLUMNS\n  (requestor VARCHAR2(32) PATH '$.Requestor',\n   has_zip VARCHAR2(5) EXISTS PATH '$.ShippingInstructions.Address.zipCode'));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_TRANSFORM-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_TRANSFORM.html\nUPDATE t SET jcol = JSON_TRANSFORM(jcol, SET '$.lastUpdated' = SYSTIMESTAMP)"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_TRANSFORM-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_TRANSFORM.html\nSELECT JSON_TRANSFORM (jcol, REMOVE '$.ssn') FROM t WHERE …"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_VALUE-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_VALUE.html\nSELECT JSON_VALUE('[{a:100}, {b:200}, {c:300}]', '$[*].c') AS value\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_VALUE-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_VALUE.html\nSELECT JSON_VALUE('{firstname:\"John\"}', '$.lastname') AS \"Last Name\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_VALUE-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_VALUE.html\nSELECT JSON_VALUE('{firstname:\"John\"}', '$.lastname'\n                  DEFAULT 'No last name found' ON ERROR) AS \"Last Name\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_VALUE-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_VALUE.html\nSELECT JSON_VALUE('{a:100}', '$.a') AS value\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_VALUE-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_VALUE.html\nSELECT JSON_VALUE('{a:100}', '$.a' RETURNING NUMBER) AS value\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_VALUE-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_VALUE.html\nSELECT JSON_VALUE('{a:{b:100}}', '$.a.b') AS value\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_VALUE-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_VALUE.html\nSELECT JSON_VALUE('{a:{b:100}, c:{d:200}, e:{f:300}}', '$.*.d') AS value\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_VALUE-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_VALUE.html\nSELECT JSON_VALUE('[0, 1, 2, 3]', '$[0]') AS value\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_VALUE-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_VALUE.html\nSELECT JSON_VALUE('{a:[5, 10, 15, 20]}', '$.a[2]') AS value\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/JSON_VALUE-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/JSON_VALUE.html\nSELECT JSON_VALUE('[{a:100}, {a:200}, {a:300}]', '$[1].a') AS value\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Joins-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Joins.html\nSELECT employee_id, manager_id \n   FROM employees\n   WHERE employees.manager_id(+) = employees.employee_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Joins-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Joins.html\nSELECT e1.employee_id, e1.manager_id, e2.employee_id\n   FROM employees e1, employees e2\n   WHERE e1.manager_id(+) = e2.employee_id\n   ORDER BY e1.employee_id, e1.manager_id, e2.employee_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Joins-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Joins.html\nSELECT * FROM A, B, D\n  WHERE A.c1 = B.c2(+) and D.c3 = B.c4(+);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/LAG-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/LAG.html\nSELECT hire_date, last_name, salary,\n       LAG(salary, 1, 0) OVER (ORDER BY hire_date) AS prev_sal\n  FROM employees\n  WHERE job_id = 'PU_CLERK'\n  ORDER BY hire_date;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/LAST_DAY-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/LAST_DAY.html\nSELECT SYSDATE,\n       LAST_DAY(SYSDATE) \"Last\",\n       LAST_DAY(SYSDATE) - SYSDATE \"Days Left\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/LAST_DAY-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/LAST_DAY.html\nSELECT last_name, hire_date,\n       TO_CHAR(ADD_MONTHS(LAST_DAY(hire_date), 5)) \"Eval Date\"\n  FROM employees\n  ORDER BY last_name, hire_date;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/LAST_VALUE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/LAST_VALUE.html\nSELECT employee_id, last_name, salary, hire_date,\n       LAST_VALUE(hire_date)\n         OVER (ORDER BY salary DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED\n               FOLLOWING) AS lv\n  FROM (SELECT * FROM employees\n          WHERE department_id = 90\n          ORDER BY hire_date);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/LAST_VALUE-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/LAST_VALUE.html\nSELECT employee_id, last_name, salary, hire_date,\n       LAST_VALUE(hire_date)\n         OVER (ORDER BY salary DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED\n               FOLLOWING) AS lv\n  FROM (SELECT * FROM employees\n          WHERE department_id = 90\n          ORDER BY hire_date DESC);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/LAST_VALUE-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/LAST_VALUE.html\nSELECT employee_id, last_name, salary, hire_date,\n       LAST_VALUE(hire_date)\n         OVER (ORDER BY salary DESC, employee_id ROWS BETWEEN UNBOUNDED PRECEDING\n               AND UNBOUNDED FOLLOWING) AS lv\n  FROM (SELECT * FROM employees\n          WHERE department_id = 90\n          ORDER BY hire_date);\nSELECT employee_id, last_name, salary, hire_date,\n       LAST_VALUE(hire_date)\n         OVER (ORDER BY salary DESC, employee_id ROWS BETWEEN UNBOUNDED PRECEDING\n               AND UNBOUNDED FOLLOWING) AS lv\n  FROM (SELECT * FROM employees\n          WHERE department_id = 90\n          ORDER BY hire_date DESC);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/LAST_VALUE-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/LAST_VALUE.html\nSELECT employee_id, last_name, salary, hire_date,\n       LAST_VALUE(hire_date)\n         OVER (ORDER BY salary DESC RANGE BETWEEN UNBOUNDED PRECEDING AND\n               UNBOUNDED FOLLOWING) AS lv\n  FROM (SELECT * FROM employees\n          WHERE department_id = 90\n          ORDER BY hire_date);\nSELECT employee_id, last_name, salary, hire_date,\n       LAST_VALUE(hire_date)\n         OVER (ORDER BY salary DESC RANGE BETWEEN UNBOUNDED PRECEDING AND\n               UNBOUNDED FOLLOWING) AS lv\n  FROM (SELECT * FROM employees\n          WHERE department_id = 90\n          ORDER BY hire_date DESC);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/LEAD-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/LEAD.html\nSELECT hire_date, last_name,\n       LEAD(hire_date, 1) OVER (ORDER BY hire_date) AS \"NextHired\" \n  FROM employees\n  WHERE department_id = 30\n  ORDER BY hire_date;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/LEAST-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/LEAST.html\nSELECT LEAST('HARRY','HARRIOT','HAROLD') \"Least\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/LEAST-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/LEAST.html\nSELECT LEAST (1, '2.1', '.000832') \"Least\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/LENGTH-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/LENGTH.html\nSELECT LENGTH('CANDIDE') \"Length in characters\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/LENGTH-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/LENGTH.html\nSELECT LENGTHB ('CANDIDE') \"Length in bytes\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/LISTAGG-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/LISTAGG.html\nSELECT LISTAGG(last_name, '; ')\n         WITHIN GROUP (ORDER BY hire_date, last_name) \"Emp_list\",\n       MIN(hire_date) \"Earliest\"\n  FROM employees\n  WHERE department_id = 30;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/LISTAGG-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/LISTAGG.html\nSELECT department_id \"Dept.\",\n       LISTAGG(last_name, '; ') WITHIN GROUP (ORDER BY hire_date) \"Employees\"\n  FROM employees\n  GROUP BY department_id\n  ORDER BY department_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/LISTAGG-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/LISTAGG.html\nSELECT department_id \"Dept.\",\n       LISTAGG(last_name, '; ' ON OVERFLOW TRUNCATE '...')\n               WITHIN GROUP (ORDER BY hire_date) \"Employees\"\n  FROM employees\n  GROUP BY department_id\n  ORDER BY department_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/LISTAGG-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/LISTAGG.html\nSELECT department_id \"Dept\", hire_date \"Date\", last_name \"Name\",\n       LISTAGG(last_name, '; ') WITHIN GROUP (ORDER BY hire_date, last_name)\n         OVER (PARTITION BY department_id) as \"Emp_list\"\n  FROM employees\n  WHERE hire_date < '01-SEP-2003'\n  ORDER BY \"Dept\", \"Date\", \"Name\";"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/LN-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/LN.html\nSELECT LN(95) \"Natural log of 95\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/LNNVL-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/LNNVL.html\nSELECT COUNT(*)\n  FROM employees\n  WHERE commission_pct < .2;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/LNNVL-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/LNNVL.html\nSELECT COUNT(*)\n  FROM employees\n  WHERE LNNVL(commission_pct >= .2);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/LOCALTIMESTAMP-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/LOCALTIMESTAMP.html\nALTER SESSION SET TIME_ZONE = '-5:00';\nSELECT CURRENT_TIMESTAMP, LOCALTIMESTAMP FROM DUAL;\nALTER SESSION SET TIME_ZONE = '-8:00';\nSELECT CURRENT_TIMESTAMP, LOCALTIMESTAMP FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/LOCALTIMESTAMP-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/LOCALTIMESTAMP.html\nCREATE TABLE local_test (col1 TIMESTAMP WITH LOCAL TIME ZONE);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/LOCALTIMESTAMP-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/LOCALTIMESTAMP.html\nINSERT INTO local_test\n  VALUES (TO_TIMESTAMP(LOCALTIMESTAMP, 'DD-MON-RR HH.MI.SSXFF'));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/LOCALTIMESTAMP-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/LOCALTIMESTAMP.html\nINSERT INTO local_test\n  VALUES (TO_TIMESTAMP(LOCALTIMESTAMP, 'DD-MON-RR HH.MI.SSXFF PM'));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/LOCK-TABLE-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/LOCK-TABLE.html\nLOCK TABLE employees\n   IN EXCLUSIVE MODE \n   NOWAIT;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/LOCK-TABLE-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/LOCK-TABLE.html\nLOCK TABLE employees@remote \n   IN SHARE MODE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/LOG-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/LOG.html\nSELECT LOG(10,100) \"Log base 10 of 100\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/LOWER-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/LOWER.html\nSELECT LOWER('MR. SCOTT MCMILLAN') \"Lowercase\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/LPAD-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/LPAD.html\nSELECT LPAD('Page 1',15,'*.') \"LPAD example\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/LTRIM-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/LTRIM.html\nSELECT LTRIM('<=====>BROWNING<=====>', '<>=') \"LTRIM Example\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Lexical-Conventions-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Lexical-Conventions.html\nSELECT last_name,salary*12,MONTHS_BETWEEN(SYSDATE,hire_date) \n  FROM employees\n  WHERE department_id = 30\n  ORDER BY last_name;\nSELECT last_name,\n  salary * 12,\n        MONTHS_BETWEEN( SYSDATE, hire_date )\nFROM employees\nWHERE department_id=30\nORDER BY last_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Literals-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Literals.html\nSELECT COUNT(*) \n  FROM employees \n  WHERE salary < BINARY_FLOAT_INFINITY;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Literals-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Literals.html\nSELECT COUNT(*) \n  FROM employees \n  WHERE TO_BINARY_FLOAT(commission_pct)\n     != BINARY_FLOAT_NAN;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Literals-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Literals.html\nSELECT COUNT(*) \n  FROM employees \n  WHERE salary < BINARY_DOUBLE_INFINITY;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Literals-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Literals.html\nINSERT INTO my_table VALUES (1, SYSDATE);\nINSERT INTO my_table VALUES (2, TRUNC(SYSDATE));\nSELECT *\n  FROM my_table;\nSELECT *\n  FROM my_table\n  WHERE datecol > TO_DATE('02-OCT-02', 'DD-MON-YY');\nSELECT *\n  FROM my_table\n  WHERE datecol = TO_DATE('03-OCT-02','DD-MON-YY');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Literals-16.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Literals.html\nSELECT *\n  FROM my_table\n  WHERE datecol = DATE '2002-10-03';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Literals-17.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Literals.html\nSELECT *\n  FROM my_table\n  WHERE TRUNC(datecol) = DATE '2002-10-03';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Literals-18.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Literals.html\nINSERT INTO my_table\n  VALUES (3, TO_DATE('3-OCT-2002','DD-MON-YYYY'));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Literals-19.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Literals.html\nINSERT INTO my_table\n  VALUES (4, '03-OCT-02');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Literals-20.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Literals.html\nINSERT INTO my_table\n  VALUES (5, TRUNC(SYSDATE));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Literals-27.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Literals.html\nSELECT TIMESTAMP '2009-10-29 01:30:00' AT TIME ZONE 'US/Pacific'\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Literals-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Literals.html\nALTER SESSION SET NLS_NUMERIC_CHARACTERS=',.';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Literals-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Literals.html\nSELECT 2 * 1.23, 3 * '2,34' FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Literals-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Literals.html\nSELECT 2 * 1,23 FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Literals-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Literals.html\nSELECT 3 * '2.34' FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Literals-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Literals.html\nSELECT COUNT(*) \n  FROM employees \n  WHERE TO_BINARY_FLOAT(commission_pct)\n     != BINARY_FLOAT_NAN;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Logical-Conditions-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Logical-Conditions.html\nSELECT *\n  FROM employees\n  WHERE NOT (job_id IS NULL)\n  ORDER BY employee_id;\nSELECT *\n  FROM employees\n  WHERE NOT \n  (salary BETWEEN 1000 AND 2000)\n  ORDER BY employee_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Logical-Conditions-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Logical-Conditions.html\nSELECT *\n  FROM employees\n  WHERE job_id = 'PU_CLERK'\n  AND department_id = 30\n  ORDER BY employee_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Logical-Conditions-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Logical-Conditions.html\nSELECT *\n  FROM employees\n  WHERE job_id = 'PU_CLERK'\n  OR department_id = 10\n  ORDER BY employee_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Logical-Conditions-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Logical-Conditions.html\nSELECT * FROM employees\nWHERE hire_date < TO_DATE('01-JAN-2004', 'DD-MON-YYYY')\n  AND salary > 2500\n  ORDER BY employee_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Logical-Conditions-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Logical-Conditions.html\nSELECT employee_id FROM employees\n   WHERE commission_pct = .4 OR salary > 20000\n   ORDER BY employee_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/MAKE_REF-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/MAKE_REF.html\nSELECT MAKE_REF (oc_inventories, 3003)\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/MAX-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/MAX.html\nSELECT MAX(salary) \"Maximum\"\n  FROM employees;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/MAX-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/MAX.html\nSELECT manager_id, last_name, salary,\n       MAX(salary) OVER (PARTITION BY manager_id) AS mgr_max\n  FROM employees\n  ORDER BY manager_id, last_name, salary;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/MAX-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/MAX.html\nSELECT manager_id, last_name, salary\n  FROM (SELECT manager_id, last_name, salary, \n               MAX(salary) OVER (PARTITION BY manager_id) AS rmax_sal\n          FROM employees)\n  WHERE salary = rmax_sal\n  ORDER BY manager_id, last_name, salary;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/MEDIAN-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/MEDIAN.html\nSELECT department_id, MEDIAN(salary)\n  FROM employees\n  GROUP BY department_id\n  ORDER BY department_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/MEDIAN-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/MEDIAN.html\nSELECT manager_id, employee_id, salary,\n       MEDIAN(salary) OVER (PARTITION BY manager_id) \"Median by Mgr\"\n  FROM employees\n  WHERE department_id > 60\n  ORDER BY manager_id, employee_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/MERGE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/MERGE.html\nCREATE TABLE bonuses (employee_id NUMBER, bonus NUMBER DEFAULT 100);\nINSERT INTO bonuses(employee_id)\n   (SELECT e.employee_id FROM hr.employees e, oe.orders o\n   WHERE e.employee_id = o.sales_rep_id\n   GROUP BY e.employee_id);\nSELECT * FROM bonuses ORDER BY employee_id;\nMERGE INTO bonuses D\n   USING (SELECT employee_id, salary, department_id FROM hr.employees\n   WHERE department_id = 80) S\n   ON (D.employee_id = S.employee_id)\n   WHEN MATCHED THEN UPDATE SET D.bonus = D.bonus + S.salary*.01\n     DELETE WHERE (S.salary > 8000)\n   WHEN NOT MATCHED THEN INSERT (D.employee_id, D.bonus)\n     VALUES (S.employee_id, S.salary*.01)\n     WHERE (S.salary <= 8000);\nSELECT * FROM bonuses ORDER BY employee_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/MERGE-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/MERGE.html\nCREATE TABLE people_source ( \n  person_id  INTEGER NOT NULL PRIMARY KEY, \n  first_name VARCHAR2(20) NOT NULL, \n  last_name  VARCHAR2(20) NOT NULL, \n  title      VARCHAR2(10) NOT NULL \n);\nCREATE TABLE people_target ( \n  person_id  INTEGER NOT NULL PRIMARY KEY, \n  first_name VARCHAR2(20) NOT NULL, \n  last_name  VARCHAR2(20) NOT NULL, \n  title      VARCHAR2(10) NOT NULL \n);\nINSERT INTO people_target VALUES (1, 'John', 'Smith', 'Mr');\nINSERT INTO people_target VALUES (2, 'alice', 'jones', 'Mrs');\nINSERT INTO people_source VALUES (2, 'Alice', 'Jones', 'Mrs.');\nINSERT INTO people_source VALUES (3, 'Jane', 'Doe', 'Miss');\nINSERT INTO people_source VALUES (4, 'Dave', 'Brown', 'Mr');\nCOMMIT;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/MERGE-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/MERGE.html\nvar person_id  NUMBER;\nvar first_name VARCHAR2(20);\nvar last_name  VARCHAR2(20);\nvar title      VARCHAR2(10);\nexec :person_id := 3;\nexec :first_name := 'Gerald';\nexec :last_name := 'Walker';\nexec :title := 'Mr';\nMERGE INTO people_target \n  ON (person_id = :person_id)\nWHEN MATCHED THEN UPDATE\nSET first_name = :first_name,\n    last_name = :last_name,\n    title = :title\nWHEN NOT MATCHED THEN INSERT\n    (person_id, first_name, last_name, title)\n    VALUES (:person_id, :first_name, :last_name, :title);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/MERGE-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/MERGE.html\nSELECT * FROM people_target;\nROLLBACK;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/MERGE-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/MERGE.html\nvar person_id  NUMBER;\nvar first_name VARCHAR2(20);\nvar last_name  VARCHAR2(20);\nvar title      VARCHAR2(10);\nexec :person_id := 2;\nexec :first_name := 'Alice';\nexec :last_name := 'Jones';\nexec :title := 'Mrs';\nMERGE INTO people_target \n   ON (person_id = :person_id)\nWHEN MATCHED THEN UPDATE\nSET first_name = :first_name,\n    last_name = :last_name,\n    title = :title\nWHEN NOT MATCHED THEN INSERT\n    (person_id, first_name, last_name, title)\n    VALUES (:person_id, :first_name, :last_name, :title);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/MERGE-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/MERGE.html\nSELECT * FROM people_target;\nROLLBACK;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/MERGE-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/MERGE.html\nMERGE INTO people_target pt \nUSING people_source ps \nON    (pt.person_id = ps.person_id) \nWHEN MATCHED THEN UPDATE \n  SET pt.first_name = ps.first_name, \n      pt.last_name = ps.last_name, \n      pt.title = ps.title;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/MERGE-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/MERGE.html\nSELECT * FROM people_target;\nROLLBACK;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/MERGE-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/MERGE.html\nMERGE INTO people_target pt \nUSING people_source ps \nON    (pt.person_id = ps.person_id) \nWHEN NOT MATCHED THEN INSERT \n  (pt.person_id, pt.first_name, pt.last_name, pt.title) \n  VALUES (ps.person_id, ps.first_name, ps.last_name, ps.title);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/MERGE-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/MERGE.html\nSELECT * FROM people_target;\nROLLBACK;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/MERGE-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/MERGE.html\nMERGE INTO people_target pt \nUSING people_source ps \nON    (pt.person_id = ps.person_id) \nWHEN MATCHED THEN UPDATE \n  SET pt.first_name = ps.first_name, \n      pt.last_name = ps.last_name, \n      pt.title = ps.title \nWHEN NOT MATCHED THEN INSERT \n  (pt.person_id, pt.first_name, pt.last_name, pt.title) \n  VALUES (ps.person_id, ps.first_name, ps.last_name, ps.title);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/MERGE-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/MERGE.html\nSELECT * FROM people_target;\nROLLBACK;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/MERGE-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/MERGE.html\nMERGE INTO people_target pt \nUSING people_source ps \nON    (pt.person_id = ps.person_id) \nWHEN MATCHED THEN UPDATE \n  SET pt.first_name = ps.first_name, \n      pt.last_name = ps.last_name, \n      pt.title = ps.title \n  DELETE where pt.title  = 'Mrs.' \nWHEN NOT MATCHED THEN INSERT \n  (pt.person_id, pt.first_name, pt.last_name, pt.title) \n  VALUES (ps.person_id, ps.first_name, ps.last_name, ps.title) \n  WHERE ps.title = 'Mr';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/MERGE-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/MERGE.html\nSELECT * FROM people_target;\nROLLBACK;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/MIN-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/MIN.html\nSELECT MIN(hire_date) \"Earliest\"\n  FROM employees;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/MIN-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/MIN.html\nSELECT manager_id, last_name, hire_date, salary,\n       MIN(salary) OVER(PARTITION BY manager_id ORDER BY hire_date\n         RANGE UNBOUNDED PRECEDING) AS p_cmin\n  FROM employees\n  ORDER BY manager_id, last_name, hire_date, salary;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/MOD-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/MOD.html\nSELECT MOD(11,4) \"Modulus\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/MONTHS_BETWEEN-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/MONTHS_BETWEEN.html\nSELECT MONTHS_BETWEEN\n       (TO_DATE('02-02-1995','MM-DD-YYYY'),\n        TO_DATE('01-01-1995','MM-DD-YYYY') ) \"Months\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Model-Conditions-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Model-Conditions.html\nSELECT country, prod, year, s\n  FROM sales_view_ref\n  MODEL\n    PARTITION BY (country)\n    DIMENSION BY (prod, year)\n    MEASURES (sale s)\n    IGNORE NAV\n    UNIQUE DIMENSION\n    RULES UPSERT SEQUENTIAL ORDER\n    (\n      s[ANY, 2000] = 0\n    )\n  ORDER BY country, prod, year;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Model-Conditions-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Model-Conditions.html\nSELECT country, prod, year, s\n  FROM sales_view_ref\n  MODEL\n    PARTITION BY (country)\n    DIMENSION BY (prod, year)\n    MEASURES (sale s)\n    IGNORE NAV\n    UNIQUE DIMENSION\n    RULES UPSERT SEQUENTIAL ORDER\n    (\n      s['Mouse Pad', 2000] =\n        CASE WHEN s['Mouse Pad', 1999] IS PRESENT\n             THEN s['Mouse Pad', 1999]\n             ELSE 0\n        END\n    )\n  ORDER BY country, prod, year;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Model-Expressions-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Model-Expressions.html\nSELECT country,prod,year,s\n  FROM sales_view_ref\n  MODEL\n    PARTITION BY (country)\n    DIMENSION BY (prod, year)\n    MEASURES (sale s)\n    IGNORE NAV\n    UNIQUE DIMENSION\n    RULES UPSERT SEQUENTIAL ORDER\n    (\n      s[prod='Mouse Pad', year=2000] =\n        s['Mouse Pad', 1998] + s['Mouse Pad', 1999],\n      s['Standard Mouse', 2001] = s['Standard Mouse', 2000]\n    )\n  ORDER BY country, prod, year;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Multiset-Conditions-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Multiset-Conditions.html\nSELECT customer_id, cust_address_ntab\n  FROM customers_demo\n  WHERE cust_address_ntab IS A SET\n  ORDER BY customer_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Multiset-Conditions-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Multiset-Conditions.html\nSELECT product_id, TO_CHAR(ad_finaltext) AS text\n   FROM print_media\n   WHERE ad_textdocs_ntab IS NOT EMPTY \n   ORDER BY product_id, text;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Multiset-Conditions-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Multiset-Conditions.html\nSELECT customer_id, cust_address_ntab\n  FROM customers_demo\n  WHERE cust_address_typ('8768 N State Rd 37', 47404, \n                         'Bloomington', 'IN', 'US')\n  MEMBER OF cust_address_ntab\n  ORDER BY customer_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Multiset-Conditions-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Multiset-Conditions.html\nSELECT customer_id, cust_address_ntab\n  FROM customers_demo\n  WHERE cust_address_ntab SUBMULTISET OF cust_address2_ntab\n  ORDER BY customer_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Multiset-Operators-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Multiset-Operators.html\nCREATE TABLE customers_demo AS\n  SELECT * FROM customers;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Multiset-Operators-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Multiset-Operators.html\nCREATE TYPE cust_address_tab_typ AS\n  TABLE OF cust_address_typ;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Multiset-Operators-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Multiset-Operators.html\nALTER TABLE customers_demo\n  ADD (cust_address_ntab cust_address_tab_typ,\n       cust_address2_ntab cust_address_tab_typ)\n    NESTED TABLE cust_address_ntab STORE AS cust_address_ntab_store\n    NESTED TABLE cust_address2_ntab STORE AS cust_address2_ntab_store;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Multiset-Operators-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Multiset-Operators.html\nUPDATE customers_demo cd\n  SET cust_address_ntab = \n    CAST(MULTISET(SELECT cust_address\n                    FROM customers c\n                    WHERE c.customer_id =\n                          cd.customer_id) as cust_address_tab_typ);\nUPDATE customers_demo cd\n  SET cust_address2_ntab = \n    CAST(MULTISET(SELECT cust_address\n                    FROM customers c\n                    WHERE c.customer_id =\n                          cd.customer_id) as cust_address_tab_typ);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Multiset-Operators-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Multiset-Operators.html\nSELECT customer_id, cust_address_ntab\n  MULTISET EXCEPT DISTINCT cust_address2_ntab multiset_except\n  FROM customers_demo\n  ORDER BY customer_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Multiset-Operators-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Multiset-Operators.html\nSELECT customer_id, cust_address_ntab\n  MULTISET INTERSECT DISTINCT cust_address2_ntab multiset_intersect\n  FROM customers_demo\n  ORDER BY customer_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Multiset-Operators-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Multiset-Operators.html\nSELECT customer_id, cust_address_ntab\n  MULTISET UNION cust_address2_ntab multiset_union\n  FROM customers_demo\n  ORDER BY customer_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/NANVL-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/NANVL.html\nINSERT INTO float_point_demo\n  VALUES (0,'NaN','NaN');\nSELECT *\n  FROM float_point_demo;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/NANVL-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/NANVL.html\nSELECT bin_float, NANVL(bin_float,0)\n  FROM float_point_demo;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/NCHR-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/NCHR.html\nSELECT NCHR(187)\n  FROM DUAL;\nSELECT CHR(187 USING NCHAR_CS)\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/NEW_TIME-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/NEW_TIME.html\nALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS';\nSELECT NEW_TIME(TO_DATE('11-10-09 01:23:45', 'MM-DD-YY HH24:MI:SS'), 'AST', 'PST')\n         \"New Date and Time\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/NEXT_DAY-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/NEXT_DAY.html\nSELECT NEXT_DAY('15-OCT-2009','TUESDAY') \"NEXT DAY\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/NLSSORT-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/NLSSORT.html\nCREATE TABLE test (name VARCHAR2(15));\nINSERT INTO test VALUES ('Gaardiner');\nINSERT INTO test VALUES ('Gaberd');\nINSERT INTO test VALUES ('Gaasten');\nSELECT *\n  FROM test\n  ORDER BY name;\nSELECT *\n  FROM test\n  ORDER BY NLSSORT(name, 'NLS_SORT = XDanish');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/NLSSORT-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/NLSSORT.html\nSELECT *\n  FROM test\n  WHERE name > 'Gaberd'\n  ORDER BY name;\nSELECT *\n  FROM test\n  WHERE NLSSORT(name, 'NLS_SORT = XDanish') > \n        NLSSORT('Gaberd', 'NLS_SORT = XDanish')\n  ORDER BY name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/NLSSORT-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/NLSSORT.html\nALTER SESSION SET NLS_COMP = 'LINGUISTIC';\nALTER SESSION SET NLS_SORT = 'XDanish';\nSELECT *\n  FROM test\n  WHERE name > 'Gaberd'\n  ORDER BY name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/NLS_CHARSET_DECL_LEN-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/NLS_CHARSET_DECL_LEN.html\nSELECT NLS_CHARSET_DECL_LEN(200, nls_charset_id('ja16eucfixed')) \n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/NLS_CHARSET_ID-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/NLS_CHARSET_ID.html\nSELECT NLS_CHARSET_ID('ja16euc') \n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/NLS_CHARSET_NAME-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/NLS_CHARSET_NAME.html\nSELECT NLS_CHARSET_NAME(2)\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/NLS_COLLATION_ID-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/NLS_COLLATION_ID.html\nSELECT NLS_COLLATION_ID('BINARY_CI') \n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/NLS_COLLATION_NAME-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/NLS_COLLATION_NAME.html\nSELECT NLS_COLLATION_NAME(81919)\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/NLS_COLLATION_NAME-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/NLS_COLLATION_NAME.html\nSELECT NLS_COLLATION_NAME(208897,'S')\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/NLS_COLLATION_NAME-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/NLS_COLLATION_NAME.html\nSELECT NLS_COLLATION_NAME(208897,'L')\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/NLS_INITCAP-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/NLS_INITCAP.html\nSELECT NLS_INITCAP('ijsland') \"InitCap\"\n  FROM DUAL;\nSELECT NLS_INITCAP('ijsland', 'NLS_SORT = XDutch') \"InitCap\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/NLS_LOWER-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/NLS_LOWER.html\nSELECT NLS_LOWER('NOKTASINDA', 'NLS_SORT = XTurkish') \"Lowercase\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/NLS_UPPER-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/NLS_UPPER.html\nSELECT NLS_UPPER('große') \"Uppercase\"\n  FROM DUAL;\nSELECT NLS_UPPER('große', 'NLS_SORT = XGerman') \"Uppercase\" \n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/NOAUDIT-Traditional-Auditing-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/NOAUDIT-Traditional-Auditing.html\nNOAUDIT ROLE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/NOAUDIT-Traditional-Auditing-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/NOAUDIT-Traditional-Auditing.html\nNOAUDIT SELECT TABLE BY hr;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/NOAUDIT-Traditional-Auditing-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/NOAUDIT-Traditional-Auditing.html\nNOAUDIT DELETE ANY TABLE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/NOAUDIT-Traditional-Auditing-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/NOAUDIT-Traditional-Auditing.html\nNOAUDIT SELECT \n   ON hr.employees;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/NOAUDIT-Traditional-Auditing-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/NOAUDIT-Traditional-Auditing.html\nNOAUDIT SELECT \n   ON hr.employees\n   WHENEVER SUCCESSFUL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/NOAUDIT-Unified-Auditing-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/NOAUDIT-Unified-Auditing.html\nNOAUDIT POLICY table_pol;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/NOAUDIT-Unified-Auditing-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/NOAUDIT-Unified-Auditing.html\nSELECT *\n  FROM audit_unified_enabled_policies\n  WHERE policy_name = 'TABLE_POL';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/NOAUDIT-Unified-Auditing-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/NOAUDIT-Unified-Auditing.html\nSELECT policy_name, enabled_option, entity_name\n  FROM audit_unified_enabled_policies\n  WHERE policy_name = 'DML_POL'\n  ORDER BY entity_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/NOAUDIT-Unified-Auditing-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/NOAUDIT-Unified-Auditing.html\nNOAUDIT POLICY dml_pol BY hr;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/NOAUDIT-Unified-Auditing-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/NOAUDIT-Unified-Auditing.html\nSELECT policy_name, enabled_option, entity_name\n  FROM audit_unified_enabled_policies\n  WHERE policy_name = 'DML_POL';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/NOAUDIT-Unified-Auditing-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/NOAUDIT-Unified-Auditing.html\nNOAUDIT POLICY dml_pol BY sh;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/NOAUDIT-Unified-Auditing-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/NOAUDIT-Unified-Auditing.html\nSELECT *\n  FROM audit_unified_enabled_policies\n  WHERE policy_name = 'DML_POL';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/NOAUDIT-Unified-Auditing-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/NOAUDIT-Unified-Auditing.html\nNOAUDIT CONTEXT NAMESPACE userenv\n  ATTRIBUTES current_user, db_name\n  BY hr;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/NTH_VALUE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/NTH_VALUE.html\nSELECT prod_id, channel_id, MIN(amount_sold),\n    NTH_VALUE(MIN(amount_sold), 2) OVER (PARTITION BY prod_id ORDER BY channel_id\n    ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) nv\n  FROM sales\n  WHERE prod_id BETWEEN 13 and 16\n  GROUP BY prod_id, channel_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/NTILE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/NTILE.html\nSELECT last_name, salary, NTILE(4) OVER (ORDER BY salary DESC) AS quartile\n  FROM employees\n  WHERE department_id = 100\n  ORDER BY last_name, salary, quartile;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/NULLIF-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/NULLIF.html\nSELECT e.last_name, NULLIF(j.job_id, e.job_id) \"Old Job ID\"\n  FROM employees e, job_history j\n  WHERE e.employee_id = j.employee_id\n  ORDER BY last_name, \"Old Job ID\";"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/NUMTODSINTERVAL-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/NUMTODSINTERVAL.html\nSELECT manager_id, last_name, hire_date,\n       COUNT(*) OVER (PARTITION BY manager_id ORDER BY hire_date \n       RANGE NUMTODSINTERVAL(100, 'day') PRECEDING) AS t_count \n  FROM employees\n  ORDER BY last_name, hire_date;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/NUMTOYMINTERVAL-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/NUMTOYMINTERVAL.html\nSELECT last_name, hire_date, salary,\n       SUM(salary) OVER (ORDER BY hire_date \n       RANGE NUMTOYMINTERVAL(1,'year') PRECEDING) AS t_sal \n  FROM employees\n  ORDER BY last_name, hire_date;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/NVL-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/NVL.html\nSELECT last_name, NVL(TO_CHAR(commission_pct), 'Not Applicable') commission\n  FROM employees\n  WHERE last_name LIKE 'B%'\n  ORDER BY last_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/NVL2-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/NVL2.html\nSELECT last_name, salary,\n       NVL2(commission_pct, salary + (salary * commission_pct), salary) income\n  FROM employees\n  WHERE last_name like 'B%'\n  ORDER BY last_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Null-Conditions-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Null-Conditions.html\nSELECT last_name\n  FROM employees\n  WHERE commission_pct\n  IS NULL\n  ORDER BY last_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ORA_DM_PARTITION_NAME-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ORA_DM_PARTITION_NAME.html\nSELECT prediction(mymodel using *) pred, ora_dm_partition_name(mymodel USING *) pname FROM customers;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ORA_HASH-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ORA_HASH.html\nSELECT SUM(amount_sold)\n  FROM sales\n  WHERE ORA_HASH(CONCAT(cust_id, prod_id), 99, 5) = 0;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ORA_INVOKING_USER-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ORA_INVOKING_USER.html\nSELECT ORA_INVOKING_USER FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ORA_INVOKING_USERID-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ORA_INVOKING_USERID.html\nSELECT ORA_INVOKING_USERID FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ORA_ROWSCN-Pseudocolumn-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ORA_ROWSCN-Pseudocolumn.html\nSELECT ORA_ROWSCN, last_name\n  FROM employees\n  WHERE employee_id = 188;\nSELECT SCN_TO_TIMESTAMP(ORA_ROWSCN), last_name\n  FROM employees\n  WHERE employee_id = 188;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Object-Access-Expressions-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Object-Access-Expressions.html\nCREATE TABLE short_orders (\n   sales_rep VARCHAR2(25), item order_item_typ);\nUPDATE short_orders s SET sales_rep = 'Unassigned';\nSELECT o.item.line_item_id, o.item.quantity FROM short_orders o;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/PERCENTILE_CONT-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/PERCENTILE_CONT.html\nSELECT department_id,\n       PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY salary DESC) \"Median cont\",\n       PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY salary DESC) \"Median disc\"\n  FROM employees\n  GROUP BY department_id\n  ORDER BY department_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/PERCENTILE_CONT-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/PERCENTILE_CONT.html\nSELECT last_name, salary, department_id,\n       PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY salary DESC) \n         OVER (PARTITION BY department_id) \"Percentile_Cont\",\n       PERCENT_RANK() \n        OVER (PARTITION BY department_id ORDER BY salary DESC) \"Percent_Rank\"\n  FROM employees\n  WHERE department_id IN (30, 60)\n  ORDER BY last_name, salary, department_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/PERCENTILE_DISC-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/PERCENTILE_DISC.html\nSELECT last_name, salary, department_id,\n       PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY salary DESC)\n         OVER (PARTITION BY department_id) \"Percentile_Disc\",\n       CUME_DIST() OVER (PARTITION BY department_id \n         ORDER BY salary DESC) \"Cume_Dist\"\n  FROM employees\n  WHERE department_id in (30, 60)\n  ORDER BY last_name, salary, department_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/PERCENT_RANK-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/PERCENT_RANK.html\nSELECT PERCENT_RANK(15000, .05) WITHIN GROUP\n       (ORDER BY salary, commission_pct) \"Percent-Rank\" \n  FROM employees;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/PERCENT_RANK-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/PERCENT_RANK.html\nSELECT department_id, last_name, salary, PERCENT_RANK() \n       OVER (PARTITION BY department_id ORDER BY salary DESC) AS pr\n  FROM employees\n  ORDER BY pr, salary, last_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/POWER-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/POWER.html\nSELECT POWER(3,2) \"Raised\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/POWERMULTISET-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/POWERMULTISET.html\nCREATE TYPE cust_address_tab_tab_typ\n  AS TABLE OF cust_address_tab_typ;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/POWERMULTISET-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/POWERMULTISET.html\nSELECT CAST(POWERMULTISET(cust_address_ntab) AS cust_address_tab_tab_typ)\n  FROM customers_demo;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/POWERMULTISET_BY_CARDINALITY-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/POWERMULTISET_BY_CARDINALITY.html\nCREATE TYPE cust_address_tab_tab_typ\n  AS TABLE OF cust_address_tab_typ;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/POWERMULTISET_BY_CARDINALITY-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/POWERMULTISET_BY_CARDINALITY.html\nUPDATE customers_demo\n  SET cust_address_ntab = cust_address_ntab MULTISET UNION cust_address_ntab;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/POWERMULTISET_BY_CARDINALITY-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/POWERMULTISET_BY_CARDINALITY.html\nSELECT CAST(POWERMULTISET_BY_CARDINALITY(cust_address_ntab, 2)\n         AS cust_address_tab_tab_typ)\n  FROM customers_demo;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/PREDICTION-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/PREDICTION.html\nSELECT cust_gender, COUNT(*) AS cnt, ROUND(AVG(age)) AS avg_age\n   FROM mining_data_apply_v\n   WHERE PREDICTION(dt_sh_clas_sample COST MODEL\n      USING cust_marital_status, education, household_size) = 1\n   GROUP BY cust_gender\n   ORDER BY cust_gender;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/PREDICTION-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/PREDICTION.html\nSELECT cust_id, age, pred_age, age-pred_age age_diff, pred_det FROM\n   (SELECT cust_id, age, pred_age, pred_det,\n          RANK() OVER (ORDER BY ABS(age-pred_age) desc) rnk FROM\n   (SELECT cust_id, age,\n           PREDICTION(FOR age USING *) OVER () pred_age,\n           PREDICTION_DETAILS(FOR age ABS USING *) OVER () pred_det\n    FROM mining_data_apply_v))\n  WHERE rnk <= 3;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/PREDICTION_BOUNDS-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/PREDICTION_BOUNDS.html\nSELECT count(cust_id) cust_count, cust_marital_status\n  FROM (SELECT cust_id, cust_marital_status\n    FROM mining_data_apply_v\n    WHERE PREDICTION_BOUNDS(glmr_sh_regr_sample,0.98 USING *).LOWER > 24 AND\n          PREDICTION_BOUNDS(glmr_sh_regr_sample,0.98 USING *).UPPER < 46)\n    GROUP BY cust_marital_status;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/PREDICTION_COST-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/PREDICTION_COST.html\nSELECT cust_id \nFROM (SELECT cust_id,rank()\n       OVER (ORDER BY PREDICTION_COST(DT_SH_Clas_sample, 1 COST MODEL USING *)\n            ASC, cust_id) rnk\n        FROM mining_data_apply_v\n        WHERE country_name = 'Italy')\n  WHERE rnk <= 10\n  ORDER BY rnk;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/PREDICTION_DETAILS-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/PREDICTION_DETAILS.html\nSELECT PREDICTION_DETAILS(svmr_sh_regr_sample, null, 3 USING *) prediction_details\n    FROM mining_data_apply_v\n    WHERE cust_id = 100001;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/PREDICTION_DETAILS-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/PREDICTION_DETAILS.html\nSELECT cust_id, age, pred_age, age-pred_age age_diff, pred_det\n    FROM (SELECT cust_id, age, pred_age, pred_det,\n          RANK() OVER (ORDER BY ABS(age-pred_age) DESC) rnk\n          FROM (SELECT cust_id, age,\n             PREDICTION(FOR age USING *) OVER () pred_age,\n             PREDICTION_DETAILS(FOR age ABS USING *) OVER () pred_det\n             FROM mining_data_apply_v))\n    WHERE rnk <= 5;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/PREDICTION_PROBABILITY-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/PREDICTION_PROBABILITY.html\nSELECT cust_id FROM (\n   SELECT cust_id\n   FROM mining_data_apply_v\n   WHERE country_name = 'Italy'\n   ORDER BY PREDICTION_PROBABILITY(DT_SH_Clas_sample, 1 USING *)\n      DESC, cust_id)\n   WHERE rownum < 11;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/PREDICTION_PROBABILITY-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/PREDICTION_PROBABILITY.html\nSELECT cust_id, cust_marital_status, rank_anom, anom_det FROM\n    (SELECT cust_id, cust_marital_status, anom_det,\n            rank() OVER (PARTITION BY CUST_MARITAL_STATUS\n                         ORDER BY ANOM_PROB DESC,cust_id) rank_anom FROM\n     (SELECT cust_id, cust_marital_status,\n            PREDICTION_PROBABILITY(OF ANOMALY, 0 USING *)\n              OVER (PARTITION BY CUST_MARITAL_STATUS) anom_prob,\n            PREDICTION_DETAILS(OF ANOMALY, 0, 3 USING *)\n              OVER (PARTITION BY CUST_MARITAL_STATUS) anom_det\n     FROM mining_data_one_class_v\n    ))\n   WHERE rank_anom < 3 order by 2, 3;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/PREDICTION_SET-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/PREDICTION_SET.html\nSELECT T.cust_id, S.prediction, S.probability, S.cost\n  FROM (SELECT cust_id,\n               PREDICTION_SET(dt_sh_clas_sample COST MODEL USING *) pset\n          FROM mining_data_apply_v\n         WHERE cust_id < 100006) T,\n       TABLE(T.pset) S\nORDER BY cust_id, S.prediction;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/PRESENTNNV-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/PRESENTNNV.html\nSELECT country, prod, year, s\n  FROM sales_view_ref\n  MODEL\n    PARTITION BY (country)\n    DIMENSION BY (prod, year)\n    MEASURES (sale s)\n    IGNORE NAV\n    UNIQUE DIMENSION\n    RULES UPSERT SEQUENTIAL ORDER\n    ( s['Mouse Pad', 2002] = \n        PRESENTNNV(s['Mouse Pad', 2002], s['Mouse Pad', 2002], 10)\n    )\n  ORDER BY country, prod, year;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/PRESENTV-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/PRESENTV.html\nSELECT country, prod, year, s\n  FROM sales_view_ref\n  MODEL\n    PARTITION BY (country)\n    DIMENSION BY (prod, year)\n    MEASURES (sale s)\n    IGNORE NAV\n    UNIQUE DIMENSION\n    RULES UPSERT SEQUENTIAL ORDER\n    (\n      s['Mouse Pad', 2001] =\n        PRESENTV(s['Mouse Pad', 2000], s['Mouse Pad', 2000], 0)\n    )\n  ORDER BY country, prod, year;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/PREVIOUS-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/PREVIOUS.html\nSELECT dim_col, cur_val, num_of_iterations\n  FROM (SELECT 1 AS dim_col, 10 AS cur_val FROM dual)\n  MODEL\n    DIMENSION BY (dim_col)\n    MEASURES (cur_val, 0 num_of_iterations)\n    IGNORE NAV\n    UNIQUE DIMENSION\n    RULES ITERATE (1000) UNTIL (PREVIOUS(cur_val[1]) - cur_val[1] < 1)\n    (\n      cur_val[1] = cur_val[1]/2,\n      num_of_iterations[1] = num_of_iterations[1] + 1\n    );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/PURGE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/PURGE.html\nSELECT * FROM RECYCLEBIN;\nSELECT * FROM USER_RECYCLEBIN;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/PURGE-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/PURGE.html\nPURGE TABLE test;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/PURGE-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/PURGE.html\nPURGE TABLE RB$$33750$TABLE$0;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/PURGE-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/PURGE.html\nPURGE RECYCLEBIN;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Pattern-matching-Conditions-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Pattern-matching-Conditions.html\nSELECT last_name \n   FROM employees\n   WHERE last_name \n   LIKE '%A\\_B%' ESCAPE '\\'\n   ORDER BY last_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Pattern-matching-Conditions-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Pattern-matching-Conditions.html\nCREATE TABLE ducks (f CHAR(6), v VARCHAR2(6));\nINSERT INTO ducks VALUES ('DUCK', 'DUCK');\nSELECT '*'||f||'*' \"char\",\n   '*'||v||'*' \"varchar\"\n   FROM ducks;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Pattern-matching-Conditions-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Pattern-matching-Conditions.html\nSELECT first_name, last_name\nFROM employees\nWHERE REGEXP_LIKE (first_name, '^Ste(v|ph)en$')\nORDER BY first_name, last_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Pattern-matching-Conditions-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Pattern-matching-Conditions.html\nSELECT last_name\nFROM employees\nWHERE REGEXP_LIKE (last_name, '([aeiou])\\1', 'i')\nORDER BY last_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Pattern-matching-Conditions-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Pattern-matching-Conditions.html\nSELECT salary \n    FROM employees\n    WHERE last_name LIKE 'R%'\n    ORDER BY salary;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Pattern-matching-Conditions-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Pattern-matching-Conditions.html\nSELECT salary \n    FROM employees \n    WHERE last_name = 'R%'\n    ORDER BY salary;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Pattern-matching-Conditions-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Pattern-matching-Conditions.html\nSELECT salary \n    FROM employees \n    WHERE 'SM%' LIKE last_name\n    ORDER BY salary;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Pattern-matching-Conditions-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Pattern-matching-Conditions.html\nSELECT last_name \n    FROM employees\n    WHERE last_name LIKE '%A\\_B%' ESCAPE '\\'\n    ORDER BY last_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/RANK-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/RANK.html\nSELECT RANK(15500, .05) WITHIN GROUP\n   (ORDER BY salary, commission_pct) \"Rank\"\n   FROM employees;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/RANK-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/RANK.html\nSELECT RANK(15500) WITHIN GROUP \n   (ORDER BY salary DESC) \"Rank of 15500\" \n   FROM employees;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/RANK-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/RANK.html\nSELECT department_id, last_name, salary,\n       RANK() OVER (PARTITION BY department_id ORDER BY salary) RANK\n  FROM employees WHERE department_id = 60\n  ORDER BY RANK, last_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/RATIO_TO_REPORT-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/RATIO_TO_REPORT.html\nSELECT last_name, salary, RATIO_TO_REPORT(salary) OVER () AS rr\n   FROM employees\n   WHERE job_id = 'PU_CLERK'\n   ORDER BY last_name, salary, rr;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/RAWTOHEX-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/RAWTOHEX.html\nSELECT RAWTOHEX(raw_column) \"Graphics\"\n   FROM graphics;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/RAWTONHEX-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/RAWTONHEX.html\nSELECT RAWTONHEX(raw_column),\n   DUMP ( RAWTONHEX (raw_column) ) \"DUMP\" \n   FROM graphics;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REF-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REF.html\nCREATE TABLE addresses OF cust_address_typ;\nINSERT INTO addresses VALUES (\n   '123 First Street', '4GF H1J', 'Our Town', 'Ourcounty', 'US');\nSELECT REF(e) FROM addresses e;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REFTOHEX-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REFTOHEX.html\nCREATE TABLE warehouse_table OF warehouse_typ\n   (PRIMARY KEY (warehouse_id));\nCREATE TABLE location_table\n   (location_number NUMBER, building REF warehouse_typ \n   SCOPE IS warehouse_table);\nINSERT INTO warehouse_table VALUES (1, 'Downtown', 99);\nINSERT INTO location_table SELECT 10, REF(w) FROM warehouse_table w;\nSELECT REFTOHEX(building) FROM location_table;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_COUNT-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_COUNT.html\nSELECT REGEXP_COUNT('123123123123123', '(12)3', 1, 'i') REGEXP_COUNT\n   FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_COUNT-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_COUNT.html\nSELECT REGEXP_COUNT('123123123123', '123', 3, 'i') COUNT FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_COUNT-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_COUNT.html\nselect regexp_count('ABC123', '[A-Z][0-9]{2}') Char_num_like_A12_anywhere, \nregexp_count('A1B2C34', '[A-Z][0-9]{2}') Char_num_like_A12_anywhere from dual;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_COUNT-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_COUNT.html\nselect regexp_count('ABC12D3', '([A-Z][0-9]){2}') Char_num_within_2_places, \nregexp_count('A1B2C3', '([A-Z][0-9]){2}') Char_num_within_2_places from dual;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_COUNT-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_COUNT.html\nCREATE TABLE regexp_temp(empName varchar2(20));\nINSERT INTO regexp_temp (empName) VALUES ('John Doe');\nINSERT INTO regexp_temp (empName) VALUES ('Jane Doe');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_COUNT-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_COUNT.html\nSELECT empName, REGEXP_COUNT(empName, 'e', 1, 'c') \"CASE_SENSITIVE_E\" From regexp_temp;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_COUNT-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_COUNT.html\nSELECT empName, REGEXP_COUNT(empName, 'o', 1, 'c') \"CASE_SENSITIVE_O\" From regexp_temp;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_COUNT-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_COUNT.html\nSELECT empName, REGEXP_COUNT(empName, 'E', 1, 'i') \"CASE_INSENSITIVE_E\" From regexp_temp;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_COUNT-16.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_COUNT.html\nSELECT empName, REGEXP_COUNT(empName, 'do', 1, 'i') \"CASE_INSENSITIVE_STRING\" From regexp_temp;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_COUNT-17.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_COUNT.html\nSELECT empName, REGEXP_COUNT(empName, 'an', 1, 'c') \"CASE_SENSITIVE_STRING\" From regexp_temp;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_COUNT-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_COUNT.html\nselect regexp_count('ABC123', '[A-Z]'), regexp_count('A1B2C3', '[A-Z]') from dual;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_COUNT-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_COUNT.html\nselect regexp_count('ABC123', '[A-Z][0-9]'), regexp_count('A1B2C3', '[A-Z][0-9]') from dual;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_COUNT-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_COUNT.html\nselect regexp_count('ABC123', '[A-Z][0-9]'), regexp_count('A1B2C3', '[A-Z][0-9]') from dual;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_COUNT-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_COUNT.html\nselect regexp_count('ABC123', '[A-Z][0-9]{2}'), regexp_count('A1B2C3', '[A-Z][0-9]{2}') from dual;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_COUNT-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_COUNT.html\nselect regexp_count('ABC123', '([A-Z][0-9]){2}'), regexp_count('A1B2C3', '([A-Z][0-9]){2}') from dual;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_COUNT-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_COUNT.html\nselect regexp_count('ABC123', '[A-Z]') Match_char_ABC_count, \nregexp_count('A1B2C3', '[A-Z]') Match_char_ABC_count from dual;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_COUNT-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_COUNT.html\nselect regexp_count('ABC123', '[A-Z][0-9]') Match_string_C1_count, \nregexp_count('A1B2C3', '[A-Z][0-9]')  Match_strings_A1_B2_C3_count from dual;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_COUNT-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_COUNT.html\nselect regexp_count('ABC123A5', '^[A-Z][0-9]') Char_num_like_A1_at_start, \nregexp_count('A1B2C3', '^[A-Z][0-9]') Char_num_like_A1_at_start from dual;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_INSTR-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_INSTR.html\nSELECT\n  REGEXP_INSTR('500 Oracle Parkway, Redwood Shores, CA',\n               '[^ ]+', 1, 6) \"REGEXP_INSTR\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_INSTR-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_INSTR.html\nSELECT\n  REGEXP_INSTR('500 Oracle Parkway, Redwood Shores, CA',\n               '[s|r|p][[:alpha:]]{6}', 3, 2, 1, 'i') \"REGEXP_INSTR\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_INSTR-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_INSTR.html\nSELECT REGEXP_INSTR('1234567890', '(123)(4(56)(78))', 1, 1, 0, 'i', 1) \n\"REGEXP_INSTR\" FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_INSTR-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_INSTR.html\nSELECT REGEXP_INSTR('1234567890', '(123)(4(56)(78))', 1, 1, 0, 'i', 2) \n\"REGEXP_INSTR\" FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_INSTR-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_INSTR.html\nSELECT REGEXP_INSTR('1234567890', '(123)(4(56)(78))', 1, 1, 0, 'i', 4) \n\"REGEXP_INSTR\" FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_INSTR-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_INSTR.html\nCREATE TABLE regexp_temp(empName varchar2(20), emailID varchar2(20));\nINSERT INTO regexp_temp (empName, emailID) VALUES ('John Doe', 'johndoe@example.com');\nINSERT INTO regexp_temp (empName, emailID) VALUES ('Jane Doe', 'janedoe');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_INSTR-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_INSTR.html\nSELECT emailID, REGEXP_INSTR(emailID, '\\w+@\\w+(\\.\\w+)+') \"IS_A_VALID_EMAIL\" FROM regexp_temp;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_REPLACE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_REPLACE.html\nSELECT\n  REGEXP_REPLACE(phone_number,\n                 '([[:digit:]]{3})\\.([[:digit:]]{3})\\.([[:digit:]]{4})',\n                 '(\\1) \\2-\\3') \"REGEXP_REPLACE\"\n  FROM employees\n  ORDER BY \"REGEXP_REPLACE\";"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_REPLACE-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_REPLACE.html\nSELECT\n  REGEXP_REPLACE(country_name, '(.)', '\\1 ') \"REGEXP_REPLACE\"\n  FROM countries;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_REPLACE-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_REPLACE.html\nWITH strings as (   \n  SELECT 'AddressLine1' s FROM dual union all   \n  SELECT 'ZipCode' s FROM dual union all   \n  SELECT 'Country' s FROM dual   \n)   \n  SELECT s \"STRING\",  \n         lower(regexp_replace(s, '([A-Z0-9])', '_\\1', 2)) \"MODIFIED_STRING\"  \n  FROM strings;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_REPLACE-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_REPLACE.html\nWITH date_strings AS (   \n  SELECT  '2015-01-01' d from dual union all   \n  SELECT '2000-12-31' d from dual union all   \n  SELECT '900-01-01' d from dual   \n)   \n  SELECT d \"STRING\",   \n         regexp_replace(d, '([[:digit:]]+)-([[:digit:]]{2})-([[:digit:]]{2})', '\\3.\\2.\\1') \"MODIFIED_STRING\"  \n  FROM date_strings;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_REPLACE-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_REPLACE.html\nWITH strings as (   \n  SELECT 'NEW YORK' s FROM dual union all   \n  SELECT 'New York' s FROM dual union all   \n  SELECT 'new york' s FROM dual   \n)   \n  SELECT s \"STRING\",  \n        regexp_replace(s, '[a-z]', '1', 1, 0, 'i') \"CASE_INSENSITIVE\",  \n        regexp_replace(s, '[a-z]', '1', 1, 0, 'c') \"CASE_SENSITIVE\",  \n        regexp_replace(s, '[a-zA-Z]', '1', 1, 0, 'c') \"CASE_SENSITIVE_MATCHING\"  \n  FROM  strings;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_REPLACE-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_REPLACE.html\nSELECT\n  REGEXP_REPLACE('500   Oracle     Parkway,    Redwood  Shores, CA',\n                 '( ){2,}', ' ') \"REGEXP_REPLACE\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_REPLACE-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_REPLACE.html\nCREATE TABLE regexp_temp(empName varchar2(20), emailID varchar2(20));\nINSERT INTO regexp_temp (empName, emailID) VALUES ('John Doe', 'johndoe@example.com');\nINSERT INTO regexp_temp (empName, emailID) VALUES ('Jane Doe', 'janedoe@example.com');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_REPLACE-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_REPLACE.html\nSELECT empName, REGEXP_REPLACE (empName, 'Jane', 'John') \"STRING_REPLACE\" FROM regexp_temp;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_REPLACE-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_REPLACE.html\nSELECT empName, REGEXP_REPLACE (empName, 'Jane', 'John') \"STRING_REPLACE\" FROM regexp_temp;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_REPLACE-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_REPLACE.html\nWITH strings AS (   \n  SELECT 'abc123' s FROM dual union all   \n  SELECT '123abc' s FROM dual union all   \n  SELECT 'a1b2c3' s FROM dual   \n)   \n  SELECT s \"STRING\", regexp_replace(s, '[0-9]', '') \"MODIFIED_STRING\"  \n  FROM strings;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_REPLACE-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_REPLACE.html\nWITH strings AS (   \n  SELECT 'abc123' s from DUAL union all   \n  SELECT '123abc' s from DUAL union all   \n  SELECT 'a1b2c3' s from DUAL   \n)   \n  SELECT s \"STRING\", REGEXP_REPLACE(s, '[0-9]', '', 1, 1) \"MODIFIED_STRING\"  \n  FROM   strings;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_REPLACE-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_REPLACE.html\nWITH strings AS (   \n  SELECT 'abc123' s from DUAL union all   \n  SELECT '123abc' s from DUAL union all   \n  SELECT 'a1b2c3' s from DUAL   \n)   \n  SELECT s \"STRING\", REGEXP_REPLACE(s, '[0-9]', '', 1, 2) \"MODIFIED_STRING\"  \n  FROM   strings;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_REPLACE-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_REPLACE.html\nWITH strings AS (   \n  SELECT 'Hello  World' s FROM dual union all   \n  SELECT 'Hello        World' s FROM dual union all   \n  SELECT 'Hello,   World  !' s FROM dual   \n)   \n  SELECT s \"STRING\", regexp_replace(s, ' {2,}', ' ') \"MODIFIED_STRING\"  \n  FROM   strings;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_SUBSTR-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_SUBSTR.html\nSELECT\n  REGEXP_SUBSTR('500 Oracle Parkway, Redwood Shores, CA',\n                ',[^,]+,') \"REGEXPR_SUBSTR\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_SUBSTR-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_SUBSTR.html\nSELECT\n  REGEXP_SUBSTR('http://www.example.com/products',\n                'http://([[:alnum:]]+\\.?){3,4}/?') \"REGEXP_SUBSTR\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_SUBSTR-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_SUBSTR.html\nSELECT REGEXP_SUBSTR('1234567890', '(123)(4(56)(78))', 1, 1, 'i', 1) \n\"REGEXP_SUBSTR\" FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_SUBSTR-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_SUBSTR.html\nSELECT REGEXP_SUBSTR('1234567890', '(123)(4(56)(78))', 1, 1, 'i', 4) \n\"REGEXP_SUBSTR\" FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_SUBSTR-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_SUBSTR.html\nCREATE TABLE regexp_temp(empName varchar2(20), emailID varchar2(20));\nINSERT INTO regexp_temp (empName, emailID) VALUES ('John Doe', 'johndoe@example.com');\nINSERT INTO regexp_temp (empName, emailID) VALUES ('Jane Doe', 'janedoe');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_SUBSTR-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_SUBSTR.html\nSELECT empName, REGEXP_SUBSTR(emailID, '[[:alnum:]]+\\@[[:alnum:]]+\\.[[:alnum:]]+') \"Valid Email\" FROM regexp_temp;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_SUBSTR-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_SUBSTR.html\nSELECT empName, REGEXP_SUBSTR(emailID, '[[:alnum:]]+\\@[[:alnum:]]+\\.[[:alnum:]]+') \"Valid Email\", REGEXP_INSTR(emailID, '\\w+@\\w+(\\.\\w+)+') \"FIELD_WITH_VALID_EMAIL\" FROM regexp_temp;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_SUBSTR-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_SUBSTR.html\nwith strings as (   \n  select 'ABC123' str from dual union all   \n  select 'A1B2C3' str from dual union all   \n  select '123ABC' str from dual union all   \n  select '1A2B3C' str from dual   \n)   \n  select regexp_substr(str, '[0-9]') First_Occurrence_of_Number,    \n         regexp_substr(str, '[0-9].*') Num_Followed_by_String,   \n         regexp_substr(str, '[A-Z][0-9]') Letter_Followed_by_String   \n  from strings;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGEXP_SUBSTR-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGEXP_SUBSTR.html\nwith strings as (    \n  select 'LHRJFK/010315/JOHNDOE' str from dual union all    \n  select 'CDGLAX/050515/JANEDOE' str from dual union all    \n  select 'LAXCDG/220515/JOHNDOE' str from dual union all    \n  select 'SFOJFK/010615/JANEDOE' str from dual    \n)    \n  SELECT regexp_substr(str, '[A-Z]{6}') String_of_6_characters,   \n         regexp_substr(str, '[0-9]+') First_Matching_Numbers,   \n         regexp_substr(str, '[A-Z].*$') Letter_by_other_characters,     \n         regexp_substr(str, '/[A-Z].*$') Slash_letter_and_characters     \n  FROM strings;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGR_-Linear-Regression-Functions-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGR_-Linear-Regression-Functions.html\nSELECT job_id,\nREGR_COUNT(SYSDATE-hire_date, salary) count\n   FROM employees\n   WHERE department_id in (30, 50)\n   GROUP BY job_id\n   ORDER BY job_id, count;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGR_-Linear-Regression-Functions-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGR_-Linear-Regression-Functions.html\nSELECT job_id,\nREGR_R2(SYSDATE-hire_date, salary) Regr_R2\n   FROM employees\n   WHERE department_id in (80, 50)\n   GROUP by job_id\n  ORDER BY job_id, Regr_R2;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGR_-Linear-Regression-Functions-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGR_-Linear-Regression-Functions.html\nSELECT job_id,\nREGR_AVGY(SYSDATE-hire_date, salary) avgy,\nREGR_AVGX(SYSDATE-hire_date, salary) avgx\n   FROM employees\n   WHERE department_id in (30,50)\n   GROUP BY job_id\n   ORDER BY job_id, avgy, avgx;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGR_-Linear-Regression-Functions-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGR_-Linear-Regression-Functions.html\nSELECT job_id,\nREGR_SXY(SYSDATE-hire_date, salary) regr_sxy,\nREGR_SXX(SYSDATE-hire_date, salary) regr_sxx,\nREGR_SYY(SYSDATE-hire_date, salary) regr_syy\n   FROM employees\n   WHERE department_id in (80, 50)\n   GROUP BY job_id\n   ORDER BY job_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGR_-Linear-Regression-Functions-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGR_-Linear-Regression-Functions.html\nSELECT job_id, employee_id ID, salary,\nREGR_SLOPE(SYSDATE-hire_date, salary)\n   OVER (PARTITION BY job_id) slope,\nREGR_INTERCEPT(SYSDATE-hire_date, salary)\n   OVER (PARTITION BY job_id) intcpt,\nREGR_R2(SYSDATE-hire_date, salary)\n   OVER (PARTITION BY job_id) rsqr,\nREGR_COUNT(SYSDATE-hire_date, salary)\n   OVER (PARTITION BY job_id) count,\nREGR_AVGX(SYSDATE-hire_date, salary)\n   OVER (PARTITION BY job_id) avgx,\nREGR_AVGY(SYSDATE-hire_date, salary)\n   OVER (PARTITION BY job_id) avgy\n   FROM employees\n   WHERE department_id in (50, 80)\n   ORDER BY job_id, employee_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REGR_-Linear-Regression-Functions-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REGR_-Linear-Regression-Functions.html\nSELECT job_id,\nREGR_SLOPE(SYSDATE-hire_date, salary) slope,\nREGR_INTERCEPT(SYSDATE-hire_date, salary) intercept\n   FROM employees\n   WHERE department_id in (50,80)\n   GROUP BY job_id\n   ORDER BY job_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REMAINDER-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REMAINDER.html\nSELECT bin_float, bin_double, REMAINDER(bin_float, bin_double)\n  FROM float_point_demo;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/RENAME-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/RENAME.html\nRENAME departments_new TO emp_departments;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/RENAME-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/RENAME.html\nCREATE TABLE temporary \n   (employee_id, start_date, end_date, job_id, dept_id) \nAS SELECT \n     employee_id, start_date, end_date, job_id, department_id\nFROM job_history;\nDROP TABLE job_history;\nRENAME temporary TO job_history;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REPLACE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REPLACE.html\nSELECT REPLACE('JACK and JUE','J','BL') \"Changes\"\n     FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REVOKE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REVOKE.html\nREVOKE DROP ANY TABLE \n    FROM hr, oe;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REVOKE-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REVOKE.html\nREVOKE dw_manager \n    FROM sh;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REVOKE-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REVOKE.html\nREVOKE INHERIT PRIVILEGES ON USER sh FROM hr;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REVOKE-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REVOKE.html\nGRANT SELECT \n    ON hr.departments_seq TO oe;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REVOKE-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REVOKE.html\nREVOKE SELECT \n    ON hr.departments_seq FROM oe;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REVOKE-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REVOKE.html\nGRANT REFERENCES, UPDATE \n    ON hr.employees TO oe;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REVOKE-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REVOKE.html\nCREATE TABLE dependent \n(dependno   NUMBER, \n dependname VARCHAR2(10), \n employee   NUMBER                   \n    CONSTRAINT in_emp REFERENCES hr.employees(employee_id) );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REVOKE-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REVOKE.html\nREVOKE REFERENCES \n    ON hr.employees \n    FROM oe \n    CASCADE CONSTRAINTS;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REVOKE-16.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REVOKE.html\nREVOKE READ ON DIRECTORY bfile_dir FROM hr;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REVOKE-17.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REVOKE.html\nCONNECT hr\n\nGRANT UPDATE ON employees TO oe WITH GRANT OPTION;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REVOKE-18.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REVOKE.html\nCONNECT oe\n\nGRANT UPDATE ON hr.employees TO pm;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REVOKE-19.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REVOKE.html\nCONNECT sh\n\nREVOKE UPDATE ON hr.employees FROM oe;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REVOKE-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REVOKE.html\nREVOKE CREATE TABLESPACE \n   FROM dw_manager;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REVOKE-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REVOKE.html\nREVOKE dw_user\n  FROM dw_manager;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REVOKE-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REVOKE.html\nGRANT ALL \n   ON orders TO hr;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REVOKE-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REVOKE.html\nREVOKE DELETE \n   ON orders FROM hr;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REVOKE-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REVOKE.html\nREVOKE ALL \n   ON orders FROM hr;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REVOKE-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REVOKE.html\nGRANT SELECT, UPDATE \n    ON emp_details_view TO public;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REVOKE-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REVOKE.html\nREVOKE UPDATE \n    ON emp_details_view FROM public;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/REVOKE-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/REVOKE.html\nGRANT INHERIT PRIVILEGES ON USER sh TO hr;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ROLLBACK-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ROLLBACK.html\nROLLBACK;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ROLLBACK-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ROLLBACK.html\nROLLBACK TO SAVEPOINT banda_sal;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ROLLBACK-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ROLLBACK.html\nROLLBACK WORK \n    FORCE '25.32.87';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ROUND-date-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ROUND-date.html\nSELECT ROUND (TO_DATE ('27-OCT-00'),'YEAR')\n   \"New Year\" FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ROUND-number-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ROUND-number.html\nSELECT ROUND(15.193,1) \"Round\" FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ROUND-number-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ROUND-number.html\nSELECT ROUND(15.193,-1) \"Round\" FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ROUND_TIES_TO_EVEN-number-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ROUND_TIES_TO_EVEN-number.html\nSELECT ROUND_TIES_TO_EVEN(45.177,-1) \"ROUND_EVEN\" FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ROWID-Pseudocolumn-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ROWID-Pseudocolumn.html\nSELECT ROWID, last_name\n  FROM employees\n  WHERE department_id = 20;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ROWIDTOCHAR-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ROWIDTOCHAR.html\nSELECT ROWID FROM employees \n   WHERE ROWIDTOCHAR(ROWID) LIKE '%JAAB%'\n   ORDER BY ROWID;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ROWIDTONCHAR-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ROWIDTONCHAR.html\nSELECT LENGTHB( ROWIDTONCHAR(ROWID) ) Length, ROWIDTONCHAR(ROWID) \n   FROM employees\n   ORDER BY length;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ROWNUM-Pseudocolumn-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ROWNUM-Pseudocolumn.html\nSELECT *\n  FROM employees\n  WHERE ROWNUM < 11;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ROWNUM-Pseudocolumn-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ROWNUM-Pseudocolumn.html\nSELECT *\n  FROM employees\n  WHERE ROWNUM < 11\n  ORDER BY last_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ROWNUM-Pseudocolumn-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ROWNUM-Pseudocolumn.html\nSELECT *\n  FROM (SELECT * FROM employees ORDER BY employee_id)\n  WHERE ROWNUM < 11;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ROWNUM-Pseudocolumn-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ROWNUM-Pseudocolumn.html\nSELECT *\n  FROM employees\n  WHERE ROWNUM > 1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ROWNUM-Pseudocolumn-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ROWNUM-Pseudocolumn.html\nUPDATE my_table\n  SET column1 = ROWNUM;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ROW_NUMBER-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ROW_NUMBER.html\nSELECT department_id, first_name, last_name, salary\nFROM\n(\n  SELECT\n    department_id, first_name, last_name, salary,\n    ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary desc) rn\n  FROM employees\n)\nWHERE rn <= 3\nORDER BY department_id, salary DESC, last_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ROW_NUMBER-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ROW_NUMBER.html\nSELECT sales_2000.channel_desc, sales_2000.prod_name,\n       sales_2000.amt amt_2000,  top_5_prods_1999_year.amt amt_1999,\n       sales_2000.amt  - top_5_prods_1999_year.amt amt_diff\nFROM\n/* The first subquery finds the 5 top-selling products per channel in year 1999. */\n  (SELECT channel_desc, prod_name, amt\n   FROM\n   (\n     SELECT channel_desc, prod_name, sum(amount_sold) amt,\n       ROW_NUMBER () OVER (PARTITION BY channel_desc\n                           ORDER BY SUM(amount_sold) DESC) rn\n     FROM sales, times, channels, products\n     WHERE sales.time_id = times.time_id\n       AND times.calendar_year = 1999\n       AND channels.channel_id = sales.channel_id\n       AND products.prod_id = sales.prod_id\n     GROUP BY channel_desc, prod_name\n   )\n   WHERE rn <= 5\n  ) top_5_prods_1999_year,\n/* The next subquery finds sales per product and per channel in 2000. */\n  (SELECT channel_desc, prod_name, sum(amount_sold) amt\n     FROM sales, times, channels, products\n     WHERE sales.time_id = times.time_id\n       AND times.calendar_year = 2000\n       AND channels.channel_id = sales.channel_id\n       AND products.prod_id = sales.prod_id\n     GROUP BY channel_desc, prod_name\n  ) sales_2000\nWHERE sales_2000.channel_desc = top_5_prods_1999_year.channel_desc\n  AND sales_2000.prod_name = top_5_prods_1999_year.prod_name\nORDER BY sales_2000.channel_desc, sales_2000.prod_name\n;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/RPAD-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/RPAD.html\nSELECT last_name, RPAD(' ', salary/1000/1, '*') \"Salary\"\n   FROM employees\n   WHERE department_id = 80\n   ORDER BY last_name, \"Salary\";"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/RTRIM-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/RTRIM.html\nSELECT RTRIM('<=====>BROWNING<=====>', '<>=') \"RTRIM Example\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SAVEPOINT-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SAVEPOINT.html\nUPDATE employees \n    SET salary = 7000 \n    WHERE last_name = 'Banda';\nSAVEPOINT banda_sal;\nUPDATE employees \n    SET salary = 12000 \n    WHERE last_name = 'Greene';\nSAVEPOINT greene_sal;\nSELECT SUM(salary) FROM employees;\nROLLBACK TO SAVEPOINT banda_sal;\nUPDATE employees \n    SET salary = 11000 \n    WHERE last_name = 'Greene';\nCOMMIT;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SCN_TO_TIMESTAMP-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SCN_TO_TIMESTAMP.html\nSELECT SCN_TO_TIMESTAMP(ORA_ROWSCN) FROM employees\n   WHERE employee_id = 188;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SCN_TO_TIMESTAMP-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SCN_TO_TIMESTAMP.html\nSELECT salary FROM employees WHERE employee_id = 188;\nUPDATE employees SET salary = salary*10 WHERE employee_id = 188;\nCOMMIT;\nSELECT salary FROM employees WHERE employee_id = 188;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SCN_TO_TIMESTAMP-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SCN_TO_TIMESTAMP.html\nSELECT SCN_TO_TIMESTAMP(ORA_ROWSCN) FROM employees\n   WHERE employee_id = 188;\nFLASHBACK TABLE employees TO TIMESTAMP\n   TO_TIMESTAMP('28-AUG-03 01.00.00.000000000 PM');\nSELECT salary FROM employees WHERE employee_id = 188;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT\n      ename, mgr,\n      FIRST_VALUE(sal) OVER w AS \"first\",\n      LAST_VALUE(sal) OVER w AS \"last\",\n      NTH_VALUE(sal, 2) OVER w AS \"second\",\n      NTH_VALUE(sal, 4) OVER w AS \"fourth\"\n   FROM emp\n   WINDOW w AS (PARTITION BY deptno ORDER BY sal ROWS UNBOUNDED PRECEDING);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-100.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nUPDATE TABLE(SELECT h.people FROM hr_info h\n   WHERE h.department_id = 280) p\n   SET p.salary = p.salary + 100;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-101.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nDELETE TABLE(SELECT h.people FROM hr_info h\n   WHERE h.department_id = 280) p\n   WHERE p.salary > 1700;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-102.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT t1.department_id, t2.* FROM hr_info t1, TABLE(t1.people) t2\n   WHERE t2.department_id = t1.department_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-103.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT t1.department_id, t2.* \n   FROM hr_info t1, TABLE(CAST(MULTISET(\n      SELECT t3.last_name, t3.department_id, t3.salary \n         FROM people t3\n      WHERE t3.department_id = t1.department_id)\n      AS people_tab_typ)) t2;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-105.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT LPAD(' ',2*(LEVEL-1)) || last_name org_chart, \n        employee_id, manager_id, job_id\n    FROM employees\n    START WITH job_id = 'AD_VP' \n    CONNECT BY PRIOR employee_id = manager_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-106.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT LPAD(' ',2*(LEVEL-1)) || last_name org_chart, \n        employee_id, manager_id, job_id\n    FROM employees\n    WHERE job_id != 'FI_MGR'\n    START WITH job_id = 'AD_VP' \n    CONNECT BY PRIOR employee_id = manager_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-107.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT LPAD(' ',2*(LEVEL-1)) || last_name org_chart, \nemployee_id, manager_id, job_id \n    FROM employees\n    START WITH job_id = 'AD_PRES' \n    CONNECT BY PRIOR employee_id = manager_id AND LEVEL <= 2;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-108.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT last_name, department_name \n   FROM employees@remote, departments\n   WHERE employees.department_id = departments.department_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-109.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nUPDATE table1 t_alias1 \n    SET column = \n        (SELECT expr \n            FROM table2 t_alias2 \n            WHERE t_alias1.column = t_alias2.column);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT docID FROM vec_table\nORDER BY VECTOR_DISTANCE(data, :query_vec)\nFETCH APPROX FIRST 20 ROWS ONLY;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-110.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT department_id, last_name, salary \n   FROM employees x \n   WHERE salary > (SELECT AVG(salary) \n      FROM employees \n      WHERE x.department_id = department_id) \n   ORDER BY department_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-111.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT CURRENT_DATE FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-112.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT CURRENT_DATE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-113.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT employees_seq.nextval \n    FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-114.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT employees_seq.currval \n    FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-115.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nCREATE TABLE Ticker (SYMBOL VARCHAR2(10), tstamp DATE, price NUMBER);\nINSERT INTO Ticker VALUES('ACME', '01-Apr-11', 12);\nINSERT INTO Ticker VALUES('ACME', '02-Apr-11', 17);\nINSERT INTO Ticker VALUES('ACME', '03-Apr-11', 19);\nINSERT INTO Ticker VALUES('ACME', '04-Apr-11', 21);\nINSERT INTO Ticker VALUES('ACME', '05-Apr-11', 25);\nINSERT INTO Ticker VALUES('ACME', '06-Apr-11', 12);\nINSERT INTO Ticker VALUES('ACME', '07-Apr-11', 15);\nINSERT INTO Ticker VALUES('ACME', '08-Apr-11', 20);\nINSERT INTO Ticker VALUES('ACME', '09-Apr-11', 24);\nINSERT INTO Ticker VALUES('ACME', '10-Apr-11', 25);\nINSERT INTO Ticker VALUES('ACME', '11-Apr-11', 19);\nINSERT INTO Ticker VALUES('ACME', '12-Apr-11', 15);\nINSERT INTO Ticker VALUES('ACME', '13-Apr-11', 25);\nINSERT INTO Ticker VALUES('ACME', '14-Apr-11', 25);\nINSERT INTO Ticker VALUES('ACME', '15-Apr-11', 14);\nINSERT INTO Ticker VALUES('ACME', '16-Apr-11', 12);\nINSERT INTO Ticker VALUES('ACME', '17-Apr-11', 14);\nINSERT INTO Ticker VALUES('ACME', '18-Apr-11', 24);\nINSERT INTO Ticker VALUES('ACME', '19-Apr-11', 23);\nINSERT INTO Ticker VALUES('ACME', '20-Apr-11', 22);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-116.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT *\nFROM Ticker MATCH_RECOGNIZE (\n     PARTITION BY symbol\n     ORDER BY tstamp\n     MEASURES STRT.tstamp AS start_tstamp,\n              LAST(DOWN.tstamp) AS bottom_tstamp,\n              LAST(UP.tstamp) AS end_tstamp\n     ONE ROW PER MATCH\n     AFTER MATCH SKIP TO LAST UP\n     PATTERN (STRT DOWN+ UP+)\n     DEFINE\n        DOWN AS DOWN.price < PREV(DOWN.price),\n        UP AS UP.price > PREV(UP.price)\n     ) MR\nORDER BY MR.symbol, MR.start_tstamp;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-117.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT deptno, ename FROM emp\nORDER BY sal DESC\nFETCH FIRST 2 PARTITIONS BY deptno, 3 ROWS ONLY;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-118.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nCREATE TABLE chunk_table ( \n  doc_id NUMBER, \n  chunk_id NUMBER, \n  data_vec VECTOR\n );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT employee_id FROM (SELECT * FROM employees)\n   FOR UPDATE OF employee_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT employee_id FROM (SELECT employee_id+1 AS employee_id FROM employees)\n   FOR UPDATE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT employee_id FROM (SELECT employee_id+1 AS employee_id FROM employees)\n   FOR UPDATE OF employee_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT avgsal\n   FROM (SELECT AVG(salary) AS avgsal FROM employees GROUP BY job_id)\n   FOR UPDATE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-17.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\ncreate or replace function greet(name varchar2 default 'World')\n                  return varchar2 SQL_MACRO(Scalar) is\nbegin\n  return q'{ 'Hello, ' || name || '!' }';\nend;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-18.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT greet ('World') from dual;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-19.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT greet ('Bob') from dual;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-20.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\ncreate or replace function split_part(string    varchar2, \n                                      delimiter varchar2,\n                                      position  pls_integer)\n          return varchar2 SQL_MACRO(Scalar) is\nbegin\n  return q'{\n    regexp_substr(replace(string, delimiter||delimiter, delimiter||' '||delimiter), \n                  '[^'||delimiter||']+', 1, position, 'imx')\n  }';\nend;\n/\nSELECT split_part( sysdate, '-', 2) month from dual;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-21.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\ncreate or replace function budget(job varchar2) return varchar2 SQL_MACRO is\nbegin\n  return q'{\n     select deptno, sum(sal) budget \n     from emp \n     where job = budget.job\n     group by deptno\n  }';\nend;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-22.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT * FROM budget ('MANAGER');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-23.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nWITH\n FUNCTION get_domain(url VARCHAR2) RETURN VARCHAR2 IS\n   pos BINARY_INTEGER;\n   len BINARY_INTEGER;\n BEGIN\n   pos := INSTR(url, 'www.');\n   len := INSTR(SUBSTR(url, pos + 4), '.') - 1;\n   RETURN SUBSTR(url, pos + 4, len);\n END;\nSELECT DISTINCT get_domain(catalog_url)\n  FROM product_information;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-24.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nWITH \n   dept_costs AS (\n      SELECT department_name, SUM(salary) dept_total\n         FROM employees e, departments d\n         WHERE e.department_id = d.department_id\n      GROUP BY department_name),\n   avg_cost AS (\n      SELECT SUM(dept_total)/COUNT(*) avg\n      FROM dept_costs)\nSELECT * FROM dept_costs\n   WHERE dept_total >\n      (SELECT avg FROM avg_cost)\n      ORDER BY department_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-25.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nWITH\n  reports_to_101 (eid, emp_last, mgr_id, reportLevel) AS\n  (\n     SELECT employee_id, last_name, manager_id, 0 reportLevel\n     FROM employees\n     WHERE employee_id = 101\n   UNION ALL\n     SELECT e.employee_id, e.last_name, e.manager_id, reportLevel+1\n     FROM reports_to_101 r, employees e\n     WHERE r.eid = e.manager_id\n  )\nSELECT eid, emp_last, mgr_id, reportLevel\nFROM reports_to_101\nORDER BY reportLevel, eid;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-26.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nWITH\n  reports_to_101 (eid, emp_last, mgr_id, reportLevel, mgr_list) AS\n  (\n     SELECT employee_id, last_name, manager_id, 0 reportLevel,\n            CAST(manager_id AS VARCHAR2(2000))\n     FROM employees\n     WHERE employee_id = 101\n  UNION ALL\n     SELECT e.employee_id, e.last_name, e.manager_id, reportLevel+1,\n            CAST(mgr_list || ',' || manager_id AS VARCHAR2(2000))\n     FROM reports_to_101 r, employees e\n     WHERE r.eid = e.manager_id\n  )\nSELECT eid, emp_last, mgr_id, reportLevel, mgr_list\nFROM reports_to_101\nORDER BY reportLevel, eid;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-27.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nWITH\n  reports_to_101 (eid, emp_last, mgr_id, reportLevel) AS\n  (\n    SELECT employee_id, last_name, manager_id, 0 reportLevel\n    FROM employees\n    WHERE employee_id = 101\n  UNION ALL\n    SELECT e.employee_id, e.last_name, e.manager_id, reportLevel+1\n    FROM reports_to_101 r, employees e\n    WHERE r.eid = e.manager_id\n  )\nSELECT eid, emp_last, mgr_id, reportLevel\nFROM reports_to_101\nWHERE reportLevel <= 1\nORDER BY reportLevel, eid;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-28.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nWITH\n  org_chart (eid, emp_last, mgr_id, reportLevel, salary, job_id) AS\n  (\n    SELECT employee_id, last_name, manager_id, 0 reportLevel, salary, job_id\n    FROM employees\n    WHERE manager_id is null\n  UNION ALL\n    SELECT e.employee_id, e.last_name, e.manager_id,\n           r.reportLevel+1 reportLevel, e.salary, e.job_id\n    FROM org_chart r, employees e\n    WHERE r.eid = e.manager_id\n  )\n  SEARCH DEPTH FIRST BY emp_last SET order1\nSELECT lpad(' ',2*reportLevel)||emp_last emp_name, eid, mgr_id, salary, job_id\nFROM org_chart\nORDER BY order1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-29.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nWITH\n  dup_hiredate (eid, emp_last, mgr_id, reportLevel, hire_date, job_id) AS\n  (\n    SELECT employee_id, last_name, manager_id, 0 reportLevel, hire_date, job_id\n    FROM employees\n    WHERE manager_id is null\n  UNION ALL\n    SELECT e.employee_id, e.last_name, e.manager_id,\n           r.reportLevel+1 reportLevel, e.hire_date, e.job_id\n    FROM dup_hiredate r, employees e\n    WHERE r.eid = e.manager_id\n  )\n  SEARCH DEPTH FIRST BY hire_date SET order1\n  CYCLE hire_date SET is_cycle TO 'Y' DEFAULT 'N'\nSELECT lpad(' ',2*reportLevel)||emp_last emp_name, eid, mgr_id,\n       hire_date, job_id, is_cycle\nFROM dup_hiredate\nORDER BY order1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-30.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nWITH\n  emp_count (eid, emp_last, mgr_id, mgrLevel, salary, cnt_employees) AS\n  (\n    SELECT employee_id, last_name, manager_id, 0 mgrLevel, salary, 0 cnt_employees\n    FROM employees\n  UNION ALL\n    SELECT e.employee_id, e.last_name, e.manager_id,\n           r.mgrLevel+1 mgrLevel, e.salary, 1 cnt_employees\n    FROM emp_count r, employees e\n    WHERE e.employee_id = r.mgr_id\n  )\n  SEARCH DEPTH FIRST BY emp_last SET order1\nSELECT emp_last, eid, mgr_id, salary, sum(cnt_employees), max(mgrLevel) mgrLevel\nFROM emp_count\nGROUP BY emp_last, eid, mgr_id, salary\nHAVING max(mgrLevel) > 0\nORDER BY mgr_id NULLS FIRST, emp_last;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-31.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT time_hier.member_name as TIME,\n sales,\n units\nFROM\n sales_av HIERARCHIES(time_hier)\nWHERE time_hier.level_name = 'YEAR'\nORDER BY time_hier.hier_order;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-33.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nWITH\n  my_av ANALYTIC VIEW AS (\n    USING sales_av HIERARCHIES (time_hier)\n    ADD MEASURES (\n      lag_sales AS (LAG(sales) OVER (HIERARCHY time_hier OFFSET 1))\n    )\n  )\nSELECT time_hier.member_name time, sales, lag_sales\nFROM my_av HIERARCHIES (time_hier)\nWHERE time_hier.level_name = 'YEAR'\nORDER BY time_hier.hier_order;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-35.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nWITH\n  my_av ANALYTIC VIEW AS (\n    USING sales_av HIERARCHIES (time_hier)\n    FILTER FACT (\n      time_hier TO quarter_of_year IN (1, 2) \n        AND year_name IN ('CY2011', 'CY2012')\n    )\n  )\nSELECT time_hier.member_name time, sales\n  FROM my_av HIERARCHIES (time_hier)\n  WHERE time_hier.level_name IN ('YEAR', 'QUARTER')\n  ORDER BY time_hier.hier_order;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-37.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT time_hier.member_name time, sales, lag_sales\nFROM\n  ANALYTIC VIEW (\n    USING sales_av HIERARCHIES (time_hier)\n    ADD MEASURES (\n      lag_sales AS (LAG(sales) OVER (HIERARCHY time_hier OFFSET 1))\n    )\n  )\nWHERE time_hier.level_name = 'YEAR'\nORDER BY time_hier.hier_order;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-39.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT * \n   FROM employees \n   WHERE department_id = 30\n   ORDER BY last_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT * \n            FROM ( VALUES (1,'SCOTT'), \n                          (2,'SMITH'), \n                          (3,'JOHN' ) \n                 ) t1 (employee_id, first_name);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-40.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT last_name, job_id, salary, department_id \n   FROM employees \n   WHERE NOT (job_id = 'PU_CLERK' AND department_id = 30)\n   ORDER BY last_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-41.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT a.department_id \"Department\",\n   a.num_emp/b.total_count \"%_Employees\",\n   a.sal_sum/b.total_sal \"%_Salary\"\nFROM\n(SELECT department_id, COUNT(*) num_emp, SUM(salary) sal_sum\n   FROM employees\n   GROUP BY department_id) a,\n(SELECT COUNT(*) total_count, SUM(salary) total_sal\n   FROM employees) b\nORDER BY a.department_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-42.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT * FROM sales PARTITION (sales_q2_2000) s\n   WHERE s.amount_sold > 1500\n   ORDER BY cust_id, time_id, channel_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-43.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT * FROM orders\n   WHERE order_date < TO_DATE('2006-06-15', 'YYYY-MM-DD');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-44.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT COUNT(*) * 10 FROM orders SAMPLE (10);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-45.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT COUNT(*) * 10 FROM orders SAMPLE (10);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-46.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT COUNT(*) * 10 FROM orders SAMPLE(10) SEED (1);\nSELECT COUNT(*) * 10 FROM orders SAMPLE(10) SEED(4);\nSELECT COUNT(*) * 10 FROM orders SAMPLE(10) SEED (1);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-47.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT salary FROM employees\n   WHERE last_name = 'Chung';\nUPDATE employees SET salary = 4000\n   WHERE last_name = 'Chung';\nSELECT salary FROM employees\n   WHERE last_name = 'Chung';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-48.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT salary FROM employees\n   AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' MINUTE)\n   WHERE last_name = 'Chung';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-49.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT salary FROM employees\n  VERSIONS BETWEEN TIMESTAMP\n    SYSTIMESTAMP - INTERVAL '10' MINUTE AND\n    SYSTIMESTAMP - INTERVAL '1' MINUTE\n  WHERE last_name = 'Chung';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nWITH X(foo, bar, baz) AS (\n         VALUES (0, 1, 2), (3, 4, 5), (6, 7, 8) ) SELECT * FROM X;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-50.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nUPDATE employees SET salary =      \n   (SELECT salary FROM employees\n   AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '2' MINUTE)\n   WHERE last_name = 'Chung')\n   WHERE last_name = 'Chung';\nSELECT salary FROM employees\n   WHERE last_name = 'Chung';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-51.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT department_id, MIN(salary), MAX (salary)\n     FROM employees\n     GROUP BY department_id\n   ORDER BY department_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-52.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT department_id, MIN(salary), MAX (salary)\n     FROM employees\n     WHERE job_id = 'PU_CLERK'\n     GROUP BY department_id\n   ORDER BY department_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-53.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT TRUNC(hire_date, 'YYYY') year_hired, COUNT(*)\nFROM employees\nGROUP BY year_hired\nORDER BY year_hired;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-54.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT TRUNC(hire_date, 'YYYY') hire_date, COUNT(*)\nFROM employees\nGROUP BY hire_date\nORDER BY hire_date;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-55.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT DECODE(GROUPING(department_name), 1, 'All Departments',\n      department_name) AS department_name,\n   DECODE(GROUPING(job_id), 1, 'All Jobs', job_id) AS job_id,\n   COUNT(*) \"Total Empl\", AVG(salary) * 12 \"Average Sal\"\n   FROM employees e, departments d\n   WHERE d.department_id = e.department_id\n   GROUP BY CUBE (department_name, job_id)\n   ORDER BY department_name, job_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-56.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT channel_desc, calendar_month_desc, co.country_id,\n      TO_CHAR(sum(amount_sold) , '9,999,999,999') SALES$\n   FROM sales, customers, times, channels, countries co\n   WHERE sales.time_id=times.time_id \n      AND sales.cust_id=customers.cust_id \n      AND sales.channel_id= channels.channel_id \n      AND customers.country_id = co.country_id\n      AND channels.channel_desc IN ('Direct Sales', 'Internet') \n      AND times.calendar_month_desc IN ('2000-09', '2000-10')\n      AND co.country_iso_code IN ('UK', 'US')\n  GROUP BY GROUPING SETS( \n      (channel_desc, calendar_month_desc, co.country_id), \n      (channel_desc, co.country_id), \n      (calendar_month_desc, co.country_id) );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-57.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT last_name, employee_id, manager_id FROM employees\n   CONNECT BY employee_id = manager_id\n   ORDER BY last_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-58.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT last_name, employee_id, manager_id FROM employees\n   CONNECT BY PRIOR employee_id = manager_id\n   AND salary > commission_pct\n   ORDER BY last_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-59.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT department_id, MIN(salary), MAX (salary)\n   FROM employees\n   GROUP BY department_id\n   HAVING MIN(salary) < 5000\n   ORDER BY department_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-60.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT department_id, manager_id \n   FROM employees \n   GROUP BY department_id, manager_id HAVING (department_id, manager_id) IN\n   (SELECT department_id, manager_id FROM employees x \n      WHERE x.department_id = employees.department_id)\n   ORDER BY department_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-61.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT * \n   FROM employees\n   WHERE job_id = 'PU_CLERK' \n   ORDER BY salary DESC;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-62.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT last_name, department_id, salary\n   FROM employees\n   ORDER BY department_id ASC, salary DESC, last_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-63.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT last_name, department_id, salary \n   FROM employees \n   ORDER BY 2 ASC, 3 DESC, 1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-64.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nCREATE OR REPLACE VIEW sales_view_ref AS\n  SELECT country_name country,\n         prod_name prod,\n         calendar_year year,\n         SUM(amount_sold) sale,\n         COUNT(amount_sold) cnt\n    FROM sales,times,customers,countries,products\n    WHERE sales.time_id = times.time_id\n      AND sales.prod_id = products.prod_id\n      AND sales.cust_id = customers.cust_id\n      AND customers.country_id = countries.country_id\n      AND ( customers.country_id = 52779\n            OR customers.country_id = 52776 )\n      AND ( prod_name = 'Standard Mouse'\n            OR prod_name = 'Mouse Pad' )\n    GROUP BY country_name,prod_name,calendar_year;\nSELECT country, prod, year, sale\n  FROM sales_view_ref\n  ORDER BY country, prod, year;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-65.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT country,prod,year,s\n  FROM sales_view_ref\n  MODEL\n    PARTITION BY (country)\n    DIMENSION BY (prod, year)\n    MEASURES (sale s)\n    IGNORE NAV\n    UNIQUE DIMENSION\n    RULES UPSERT SEQUENTIAL ORDER\n    (\n      s[prod='Mouse Pad', year=2001] =\n        s['Mouse Pad', 1999] + s['Mouse Pad', 2000],\n      s['Standard Mouse', 2002] = s['Standard Mouse', 2001]\n    )\n  ORDER BY country, prod, year;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-66.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT country, year, sale, csum\n   FROM \n   (SELECT country, year, SUM(sale) sale\n    FROM sales_view_ref\n    GROUP BY country, year\n   )\n   MODEL DIMENSION BY (country, year)\n         MEASURES (sale, 0 csum) \n         RULES (csum[any, any]= \n                  SUM(sale) OVER (PARTITION BY country \n                                  ORDER BY year \n                                  ROWS UNBOUNDED PRECEDING) \n                )\n   ORDER BY country, year;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-67.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT employee_id, last_name\n  FROM employees\n  ORDER BY employee_id\n  FETCH FIRST 5 ROWS ONLY;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-68.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT employee_id, last_name\n  FROM employees\n  ORDER BY employee_id\n  OFFSET 5 ROWS FETCH NEXT 5 ROWS ONLY;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-69.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT employee_id, last_name, salary\n  FROM employees\n  ORDER BY salary\n  FETCH FIRST 5 PERCENT ROWS ONLY;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-70.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT employee_id, last_name, salary\n  FROM employees\n  ORDER BY salary\n  FETCH FIRST 5 PERCENT ROWS WITH TIES;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-71.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT e.employee_id, e.salary, e.commission_pct\n   FROM employees e, departments d\n   WHERE job_id = 'SA_REP'\n   AND e.department_id = d.department_id\n   AND location_id = 2500\n   ORDER BY e.employee_id\n   FOR UPDATE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-72.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT e.employee_id, e.salary, e.commission_pct\n   FROM employees e JOIN departments d\n   USING (department_id)\n   WHERE job_id = 'SA_REP'\n   AND location_id = 2500\n   ORDER BY e.employee_id\n   FOR UPDATE OF e.salary;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-73.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nINSERT INTO (SELECT department_id, department_name, location_id\n   FROM departments WHERE location_id < 2000)\n   VALUES (9999, 'Entertainment', 2500);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-74.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nINSERT INTO (SELECT department_id, department_name, location_id\n   FROM departments WHERE location_id < 2000 WITH CHECK OPTION)\n   VALUES (9999, 'Entertainment', 2500);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-75.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nCREATE TABLE pivot_table AS\nSELECT * FROM\n(SELECT EXTRACT(YEAR FROM order_date) year, order_mode, order_total FROM orders)\nPIVOT\n(SUM(order_total) FOR order_mode IN ('direct' AS Store, 'online' AS Internet));\nSELECT * FROM pivot_table ORDER BY year;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-76.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT * FROM pivot_table\n  UNPIVOT (yearly_total FOR order_mode IN (store AS 'direct',\n           internet AS 'online'))\n  ORDER BY year, order_mode;\nSELECT * FROM pivot_table\n  UNPIVOT INCLUDE NULLS \n    (yearly_total FOR order_mode IN (store AS 'direct', internet AS 'online'))\n  ORDER BY year, order_mode;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-77.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT last_name, job_id, departments.department_id, department_name\n   FROM employees, departments\n   WHERE employees.department_id = departments.department_id\n   ORDER BY last_name, job_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-79.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT last_name, job_id, departments.department_id, department_name\n   FROM employees, departments\n   WHERE employees.department_id = departments.department_id\n   AND job_id = 'SA_MAN'\n   ORDER BY last_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-80.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT last_name, department_id FROM employees\n   WHERE department_id =\n     (SELECT department_id FROM employees\n      WHERE last_name = 'Lorentz')\n   ORDER BY last_name, department_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-81.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nUPDATE employees \n    SET salary = salary * 1.1\n    WHERE employee_id IN (SELECT employee_id FROM job_history);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-82.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nCREATE TABLE new_departments \n   (department_id, department_name, location_id)\n   AS SELECT department_id, department_name, location_id \n   FROM departments;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-83.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT e1.last_name||' works for '||e2.last_name \n   \"Employees and Their Managers\"\n   FROM employees e1, employees e2 \n   WHERE e1.manager_id = e2.employee_id\n      AND e1.last_name LIKE 'R%'\n   ORDER BY e1.last_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-85.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT d.department_id, e.last_name\n   FROM departments d LEFT OUTER JOIN employees e\n   ON d.department_id = e.department_id\n   ORDER BY d.department_id, e.last_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-86.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT d.department_id, e.last_name\n   FROM departments d, employees e\n   WHERE d.department_id = e.department_id(+)\n   ORDER BY d.department_id, e.last_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-87.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT d.department_id, e.last_name\n   FROM departments d RIGHT OUTER JOIN employees e\n   ON d.department_id = e.department_id\n   ORDER BY d.department_id, e.last_name;\n              Grant\n              Zeuss"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-88.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT d.department_id as d_dept_id, e.department_id as e_dept_id,\n      e.last_name\n   FROM departments d FULL OUTER JOIN employees e\n   ON d.department_id = e.department_id\n   ORDER BY d.department_id, e.last_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-89.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT department_id AS d_e_dept_id, e.last_name\n   FROM departments d FULL OUTER JOIN employees e\n   USING (department_id)\n   ORDER BY department_id, e.last_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-90.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nCREATE TABLE inventory (time_id    DATE,\n                        product    VARCHAR2(10),\n                        quantity   NUMBER);\nINSERT INTO inventory VALUES (TO_DATE('01/04/01', 'DD/MM/YY'), 'bottle', 10);\nINSERT INTO inventory VALUES (TO_DATE('06/04/01', 'DD/MM/YY'), 'bottle', 10);\nINSERT INTO inventory VALUES (TO_DATE('01/04/01', 'DD/MM/YY'), 'can', 10);\nINSERT INTO inventory VALUES (TO_DATE('04/04/01', 'DD/MM/YY'), 'can', 10);\nSELECT times.time_id, product, quantity FROM inventory \n   PARTITION BY  (product) \n   RIGHT OUTER JOIN times ON (times.time_id = inventory.time_id) \n   WHERE times.time_id BETWEEN TO_DATE('01/04/01', 'DD/MM/YY') \n      AND TO_DATE('06/04/01', 'DD/MM/YY') \n   ORDER BY  2,1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-91.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT time_id, product, LAST_VALUE(quantity IGNORE NULLS) \n   OVER (PARTITION BY product ORDER BY time_id) quantity \n   FROM ( SELECT times.time_id, product, quantity \n             FROM inventory PARTITION BY  (product) \n                RIGHT OUTER JOIN times ON (times.time_id = inventory.time_id) \n   WHERE times.time_id BETWEEN TO_DATE('01/04/01', 'DD/MM/YY') \n      AND TO_DATE('06/04/01', 'DD/MM/YY')) \n   ORDER BY  2,1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-92.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT department_name FROM hr.departments d\n  WHERE NOT EXISTS (SELECT asdf FROM hr.employees e\n                  WHERE e.department_id = d.department_id\n                  AND e.salary >= 10000)\n  ORDER BY department_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-93.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT * FROM departments \n   WHERE EXISTS \n   (SELECT * FROM employees \n       WHERE departments.department_id = employees.department_id \n       AND employees.salary > 2500)\n   ORDER BY department_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-94.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT d.department_name, v.employee_id, v.last_name\n  FROM departments d CROSS APPLY (SELECT * FROM employees e\n                                  WHERE e.department_id = d.department_id) v\n  WHERE d.department_name IN ('Marketing', 'Operations', 'Public Relations')\n  ORDER BY d.department_name, v.employee_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-95.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT d.department_name, v.employee_id, v.last_name\n  FROM departments d OUTER APPLY (SELECT * FROM employees e\n                                  WHERE e.department_id = d.department_id) v\n  WHERE d.department_name IN ('Marketing', 'Operations', 'Public Relations')\n  ORDER by d.department_name, v.employee_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-96.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT department_name, \n   (SELECT last_name FROM \n     (SELECT last_name FROM hr.employees e\n       WHERE e.department_id = d.department_id\n       ORDER BY e.salary DESC, e.employee_id ASC) \n     WHERE ROWNUM = 1) highest_paid\n  FROM hr.departments d;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-97.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nSELECT d.department_name, e2.last_name, e2.first_name, e2.salary, e2.email\n  FROM hr.departments d, \n     LATERAL (SELECT * FROM \n                       (SELECT * FROM hr.employees e\n                        WHERE e.department_id = d.department_id\n                        ORDER BY e.salary DESC, e.employee_id ASC)\n               WHERE ROWNUM = 1) e2;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-98.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nCREATE TYPE people_typ AS OBJECT (\n   last_name      VARCHAR2(25),\n   department_id  NUMBER(4),\n   salary         NUMBER(8,2));\n/\nCREATE TYPE people_tab_typ AS TABLE OF people_typ;\n/\nCREATE TABLE hr_info (\n   department_id   NUMBER(4),\n   location_id     NUMBER(4),\n   manager_id      NUMBER(6),\n   people          people_tab_typ)\n   NESTED TABLE people STORE AS people_stor_tab;\nINSERT INTO hr_info VALUES (280, 1800, 999, people_tab_typ());"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SELECT-99.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SELECT.html\nINSERT INTO TABLE(SELECT h.people FROM hr_info h\n   WHERE h.department_id = 280)\n   VALUES ('Smith', 280, 1750);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SESSIONTIMEZONE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SESSIONTIMEZONE.html\nSELECT SESSIONTIMEZONE FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SET-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SET.html\nSELECT customer_id, SET(cust_address_ntab) address\n  FROM customers_demo\n  ORDER BY customer_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SET-CONSTRAINTS-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SET-CONSTRAINTS.html\nSET CONSTRAINTS ALL IMMEDIATE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SET-CONSTRAINTS-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SET-CONSTRAINTS.html\nSET CONSTRAINTS emp_job_nn, emp_salary_min,\n   hr.jhist_dept_fk@remote DEFERRED;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SET-ROLE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SET-ROLE.html\nSET ROLE dw_manager IDENTIFIED BY password;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SET-ROLE-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SET-ROLE.html\nSET ROLE ALL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SET-ROLE-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SET-ROLE.html\nSET ROLE ALL EXCEPT dw_manager;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SET-ROLE-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SET-ROLE.html\nSET ROLE NONE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SET-TRANSACTION-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SET-TRANSACTION.html\nCOMMIT;\nSET TRANSACTION READ ONLY NAME 'West Coast';\nSELECT product_id, quantity_on_hand, 'San Francisco' location\n  FROM inventories\n    WHERE warehouse_id = 2\n    ORDER BY product_id;\nSELECT product_id, quantity_on_hand, 'Seattle' location\n  FROM inventories\n    WHERE warehouse_id = 4\n    ORDER BY product_id;\nCOMMIT;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SIGN-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SIGN.html\nSELECT SIGN(-15) \"Sign\" FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SIN-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SIN.html\nSELECT SIN(30 * 3.14159265359/180)\n \"Sine of 30 degrees\" FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SINH-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SINH.html\nSELECT SINH(1) \"Hyperbolic sine of 1\" FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SOUNDEX-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SOUNDEX.html\nSELECT last_name, first_name\n     FROM hr.employees\n     WHERE SOUNDEX(last_name)\n         = SOUNDEX('SMYTHE')\n     ORDER BY last_name, first_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SQL-JSON-Conditions-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SQL-JSON-Conditions.html\nCREATE TABLE tab (jcol JSON VALIDATE '{\"type\" : \"object\"}');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SQL-JSON-Conditions-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SQL-JSON-Conditions.html\nCREATE TABLE tab (jcol JSON CONSTRAINT jchk\n  CHECK (jcol IS JSON VALIDATE '{\"type\" : \"object\"}'));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SQL-JSON-Conditions-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SQL-JSON-Conditions.html\nINSERT INTO jsontab1(jschd) VALUES (json('\"a json string\"'));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SQL-JSON-Conditions-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SQL-JSON-Conditions.html\nALTER TABLE jsontab1\nADD jschd JSON CONSTRAINT jschdsv\n                   CHECK (jschd IS JSON VALIDATE USING '{\"type\":\"string\"}');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SQL-JSON-Conditions-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SQL-JSON-Conditions.html\nSELECT COUNT(1) FROM jsontab1 WHERE j IS JSON \nVALIDATE\n         '{\"type\" : \"object\",\n              \"properties\" : {\n                  \"id\" : {\n                      \"type\" : \"number\"\n                   }\n               }\n           }';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SQL-JSON-Conditions-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SQL-JSON-Conditions.html\nCREATE TABLE t (col1 VARCHAR2(100));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SQL-JSON-Conditions-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SQL-JSON-Conditions.html\nINSERT INTO t VALUES ( '[ \"LIT192\", \"CS141\", \"HIS160\" ]' );\nINSERT INTO t VALUES ( '{ \"Name\": \"John\" }' );\nINSERT INTO t VALUES ( '{ \"Grade Values\" : { A : 4.0, B : 3.0, C : 2.0 } }');\nINSERT INTO t VALUES ( '{ \"isEnrolled\" : true }' );\nINSERT INTO t VALUES ( '{ \"isMatriculated\" : False }' );\nINSERT INTO t VALUES (NULL);\nINSERT INTO t VALUES ('This is not well-formed JSON data');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SQL-JSON-Conditions-16.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SQL-JSON-Conditions.html\nSELECT col1\n  FROM t\n  WHERE col1 IS JSON;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SQL-JSON-Conditions-17.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SQL-JSON-Conditions.html\nSELECT col1\n  FROM t\n  WHERE col1 IS JSON STRICT;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SQL-JSON-Conditions-18.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SQL-JSON-Conditions.html\nSELECT col1\n  FROM t\n  WHERE col1 IS NOT JSON STRICT AND col1 IS JSON LAX;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SQL-JSON-Conditions-19.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SQL-JSON-Conditions.html\nCREATE TABLE t (col1 VARCHAR2(100));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SQL-JSON-Conditions-20.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SQL-JSON-Conditions.html\nINSERT INTO t VALUES ('{a:100, b:200, c:300}');\nINSERT INTO t VALUES ('{a:100, a:200, b:300}');\nINSERT INTO t VALUES ('{a:100, b : {a:100, c:300}}');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SQL-JSON-Conditions-21.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SQL-JSON-Conditions.html\nSELECT col1 FROM t\n  WHERE col1 IS JSON WITH UNIQUE KEYS;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SQL-JSON-Conditions-22.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SQL-JSON-Conditions.html\nSELECT col1 FROM t\n  WHERE col1 IS JSON WITHOUT UNIQUE KEYS;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SQL-JSON-Conditions-23.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SQL-JSON-Conditions.html\nCREATE TABLE j_purchaseorder\n  (id RAW (16) NOT NULL,\n   date_loaded TIMESTAMP(6) WITH TIME ZONE,\n   po_document CLOB CONSTRAINT ensure_json CHECK (po_document IS JSON));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SQL-JSON-Conditions-28.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SQL-JSON-Conditions.html\nCREATE TABLE t (name VARCHAR2(100));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SQL-JSON-Conditions-29.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SQL-JSON-Conditions.html\nINSERT INTO t VALUES ('[{first:\"John\"}, {middle:\"Mark\"}, {last:\"Smith\"}]');\nINSERT INTO t VALUES ('[{first:\"Mary\"}, {last:\"Jones\"}]');\nINSERT INTO t VALUES ('[{first:\"Jeff\"}, {last:\"Williams\"}]');\nINSERT INTO t VALUES ('[{first:\"Jean\"}, {middle:\"Anne\"}, {last:\"Brown\"}]');\nINSERT INTO t VALUES (NULL);\nINSERT INTO t VALUES ('This is not well-formed JSON data');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SQL-JSON-Conditions-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SQL-JSON-Conditions.html\nCREATE TABLE jtab(jcol JSON DOMAIN jd);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SQL-JSON-Conditions-30.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SQL-JSON-Conditions.html\nSELECT name FROM t\n  WHERE JSON_EXISTS(name, '$[0].first');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SQL-JSON-Conditions-31.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SQL-JSON-Conditions.html\nSELECT name FROM t\n  WHERE JSON_EXISTS(name, '$[1].middle');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SQL-JSON-Conditions-32.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SQL-JSON-Conditions.html\nSELECT name FROM t\n  WHERE JSON_EXISTS(name, '$[1].middle' TRUE ON ERROR);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SQL-JSON-Conditions-33.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SQL-JSON-Conditions.html\nSELECT name FROM t\n  WHERE JSON_EXISTS(name, '$[*].last');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SQL-JSON-Conditions-34.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SQL-JSON-Conditions.html\nSELECT name FROM t\n\n  WHERE JSON_EXISTS(name, '$[1]?(@.middle == $var1)' PASSING 'Anne' as \"var1\");"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SQL-JSON-Conditions-35.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SQL-JSON-Conditions.html\nCREATE TABLE families (family_doc VARCHAR2(200));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SQL-JSON-Conditions-36.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SQL-JSON-Conditions.html\nCREATE INDEX ix\n  ON families(family_doc)\n  INDEXTYPE IS CTXSYS.CONTEXT\n  PARAMETERS ('SECTION GROUP CTXSYS.JSON_SECTION_GROUP SYNC (ON COMMIT)');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SQL-JSON-Conditions-37.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SQL-JSON-Conditions.html\nINSERT INTO families\nVALUES ('{family : {id:10, ages:[40,38,12], address : {street : \"10 Main Street\"}}}');\nINSERT INTO families\nVALUES ('{family : {id:11, ages:[42,40,10,5], address : {street : \"200 East Street\", apt : 20}}}');\nINSERT INTO families\nVALUES ('{family : {id:12, ages:[25,23], address : {street : \"300 Oak Street\", apt : 10}}}');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SQL-JSON-Conditions-38.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SQL-JSON-Conditions.html\nCOMMIT;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SQL-JSON-Conditions-39.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SQL-JSON-Conditions.html\nSELECT family_doc FROM families\n  WHERE JSON_TEXTCONTAINS(family_doc, '$', '10');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SQL-JSON-Conditions-40.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SQL-JSON-Conditions.html\nSELECT family_doc FROM families\n  where json_textcontains(family_doc, '$.family.id', '10');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SQL-JSON-Conditions-41.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SQL-JSON-Conditions.html\nSELECT family_doc FROM families\n  WHERE JSON_TEXTCONTAINS(family_doc, '$.family.ages', '10');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SQL-JSON-Conditions-42.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SQL-JSON-Conditions.html\nSELECT family_doc FROM families\n  WHERE JSON_TEXTCONTAINS(family_doc, '$.family.address', '10');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SQL-JSON-Conditions-43.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SQL-JSON-Conditions.html\nSELECT family_doc FROM families\n  WHERE JSON_TEXTCONTAINS(family_doc, '$.family.address.apt', '10');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SQL-JSON-Conditions-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SQL-JSON-Conditions.html\nCREATE TABLE jtab (\n  id    NUMBER(9) PRIMARY KEY,\n  jcol  JSON CHECK(jcol IS JSON VALIDATE CAST USING '{\n                  \"type\": \"object\",\n                  \"properties\": {\n                       \"firstName\": {\n                        \"extendedType\": \"string\",\n                        \"maxLength\": 50\n                      },\n                      \"birthDate\" : {\n                        \"extendedType\": \"date\"\n                      }\n                    },\n                    \"required\": [\"firstName\", \"birthDate\"]\n                  }'\n  )\n);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SQL-JSON-Conditions-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SQL-JSON-Conditions.html\nCREATE TABLE jsontab1(\n    id NUMBER(4),\n    j  JSON CONSTRAINT jt1isj CHECK (j IS JSON VALIDATE USING     \n     '{\n       \"type\":\"object\", \n       \"minProperties\": 2\n      }')\n    );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SQL-JSON-Conditions-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SQL-JSON-Conditions.html\nINSERT INTO jsontab1(j) VALUES ('[\"a\", \"b\"]');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SQL-JSON-Conditions-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SQL-JSON-Conditions.html\nINSERT INTO jsontab1(j) VALUES ('{\"a\": \"a\", \"b\": \"b\"}');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SQRT-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SQRT.html\nSELECT SQRT(26) \"Square root\" FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/STATS_BINOMIAL_TEST-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/STATS_BINOMIAL_TEST.html\nSELECT AVG(DECODE(cust_gender, 'M', 1, 0)) real_proportion,\n       STATS_BINOMIAL_TEST\n         (cust_gender, 'M', 0.68, 'EXACT_PROB') exact,\n       STATS_BINOMIAL_TEST\n         (cust_gender, 'M', 0.68, 'ONE_SIDED_PROB_OR_LESS') prob_or_less\n  FROM sh.customers;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/STATS_CROSSTAB-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/STATS_CROSSTAB.html\nSELECT STATS_CROSSTAB\n         (cust_gender, cust_income_level, 'CHISQ_OBS') chi_squared,\n       STATS_CROSSTAB\n         (cust_gender, cust_income_level, 'CHISQ_SIG') p_value,\n       STATS_CROSSTAB\n         (cust_gender, cust_income_level, 'PHI_COEFFICIENT') phi_coefficient\n  FROM sh.customers;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/STATS_F_TEST-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/STATS_F_TEST.html\nSELECT VARIANCE(DECODE(cust_gender, 'M', cust_credit_limit, null)) var_men,\n       VARIANCE(DECODE(cust_gender, 'F', cust_credit_limit, null)) var_women,\n       STATS_F_TEST(cust_gender, cust_credit_limit, 'STATISTIC', 'F') f_statistic,\n       STATS_F_TEST(cust_gender, cust_credit_limit) two_sided_p_value\n  FROM sh.customers;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/STATS_KS_TEST-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/STATS_KS_TEST.html\nSELECT stats_ks_test(cust_gender, amount_sold, 'STATISTIC') ks_statistic,\n       stats_ks_test(cust_gender, amount_sold) p_value\n  FROM sh.customers c, sh.sales s\n  WHERE c.cust_id = s.cust_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/STATS_MODE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/STATS_MODE.html\nSELECT x FROM (SELECT x, COUNT(x) AS cnt1\n   FROM t GROUP BY x)\n   WHERE cnt1 =\n      (SELECT MAX(cnt2) FROM (SELECT COUNT(x) AS cnt2 FROM t GROUP BY x));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/STATS_MODE-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/STATS_MODE.html\nSELECT department_id, STATS_MODE(salary) FROM employees\n   GROUP BY department_id\n   ORDER BY department_id, stats_mode(salary);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/STATS_MODE-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/STATS_MODE.html\nSELECT commission_pct FROM\n   (SELECT commission_pct, COUNT(commission_pct) AS cnt1 FROM employees\n      GROUP BY commission_pct)\n   WHERE cnt1 = \n      (SELECT MAX (cnt2) FROM\n         (SELECT COUNT(commission_pct) AS cnt2\n         FROM employees GROUP BY commission_pct))\n   ORDER BY commission_pct;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/STATS_MW_TEST-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/STATS_MW_TEST.html\nSELECT STATS_MW_TEST\n         (cust_gender, amount_sold, 'STATISTIC') z_statistic,\n       STATS_MW_TEST\n         (cust_gender, amount_sold, 'ONE_SIDED_SIG', 'F') one_sided_p_value\n  FROM sh.customers c, sh.sales s\n  WHERE c.cust_id = s.cust_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/STATS_ONE_WAY_ANOVA-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/STATS_ONE_WAY_ANOVA.html\nSELECT cust_gender,\n       STATS_ONE_WAY_ANOVA(cust_income_level, amount_sold, 'F_RATIO') f_ratio,\n       STATS_ONE_WAY_ANOVA(cust_income_level, amount_sold, 'SIG') p_value\n  FROM sh.customers c, sh.sales s\n  WHERE c.cust_id = s.cust_id\n  GROUP BY cust_gender\n  ORDER BY cust_gender;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/STATS_T_TEST_-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/STATS_T_TEST_.html\nSELECT AVG(prod_list_price) group_mean,\n       STATS_T_TEST_ONE(prod_list_price, 60, 'STATISTIC') t_observed,\n       STATS_T_TEST_ONE(prod_list_price, 60) two_sided_p_value\n  FROM sh.products;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/STATS_T_TEST_-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/STATS_T_TEST_.html\nSELECT SUBSTR(cust_income_level, 1, 22) income_level,\n      AVG(DECODE(cust_gender, 'M', amount_sold, null)) sold_to_men,\n      AVG(DECODE(cust_gender, 'F', amount_sold, null)) sold_to_women,\n      STATS_T_TEST_INDEP(cust_gender, amount_sold, 'STATISTIC', 'F') t_observed,\n      STATS_T_TEST_INDEP(cust_gender, amount_sold) two_sided_p_value\n  FROM sh.customers c, sh.sales s\n  WHERE c.cust_id = s.cust_id\n  GROUP BY ROLLUP(cust_income_level)\n  ORDER BY income_level, sold_to_men, sold_to_women, t_observed;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/STATS_T_TEST_-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/STATS_T_TEST_.html\nSELECT SUBSTR(cust_income_level, 1, 22) income_level,\n       AVG(DECODE(cust_gender, 'M', amount_sold, null)) sold_to_men,\n       AVG(DECODE(cust_gender, 'F', amount_sold, null)) sold_to_women,\n       STATS_T_TEST_INDEPU(cust_gender, amount_sold, 'STATISTIC', 'F') t_observed,\n       STATS_T_TEST_INDEPU(cust_gender, amount_sold) two_sided_p_value\n  FROM sh.customers c, sh.sales s\n  WHERE c.cust_id = s.cust_id\n  GROUP BY ROLLUP(cust_income_level)\n  ORDER BY income_level, sold_to_men, sold_to_women, t_observed;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/STDDEV-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/STDDEV.html\nSELECT STDDEV(salary) \"Deviation\"\n   FROM employees;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/STDDEV-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/STDDEV.html\nSELECT last_name, salary, \n   STDDEV(salary) OVER (ORDER BY hire_date) \"StdDev\"\n   FROM employees  \n   WHERE department_id = 30\n   ORDER BY last_name, salary, \"StdDev\";"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/STDDEV_POP-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/STDDEV_POP.html\nSELECT STDDEV_POP(amount_sold) \"Pop\", \n   STDDEV_SAMP(amount_sold) \"Samp\"\n   FROM sales;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/STDDEV_POP-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/STDDEV_POP.html\nSELECT department_id, last_name, salary, \n   STDDEV_POP(salary) OVER (PARTITION BY department_id) AS pop_std\n   FROM employees\n   ORDER BY department_id, last_name, salary, pop_std;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/STDDEV_SAMP-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/STDDEV_SAMP.html\nSELECT department_id, last_name, hire_date, salary, \n   STDDEV_SAMP(salary) OVER (PARTITION BY department_id \n      ORDER BY hire_date \n      ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cum_sdev \n   FROM employees\n   ORDER BY department_id, last_name, hire_date, salary, cum_sdev;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SUBSTR-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SUBSTR.html\nSELECT SUBSTR('ABCDEFG',3,4) \"Substring\"\n     FROM DUAL;\nSELECT SUBSTR('ABCDEFG',-5,4) \"Substring\"\n     FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SUBSTR-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SUBSTR.html\nSELECT SUBSTRB('ABCDEFG',5,4.2) \"Substring with bytes\"\n     FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SUM-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SUM.html\nSELECT SUM(salary) \"Total\"\n   FROM employees;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SUM-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SUM.html\nSELECT manager_id, last_name, salary,\n   SUM(salary) OVER (PARTITION BY manager_id ORDER BY salary\n   RANGE UNBOUNDED PRECEDING) l_csum\n   FROM employees\n   ORDER BY manager_id, last_name, salary, l_csum;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SYSDATE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SYSDATE.html\nSELECT TO_CHAR\n    (SYSDATE, 'MM-DD-YYYY HH24:MI:SS') \"NOW\"\n     FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SYSTIMESTAMP-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SYSTIMESTAMP.html\nSELECT SYSTIMESTAMP FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SYSTIMESTAMP-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SYSTIMESTAMP.html\nSELECT TO_CHAR(SYSTIMESTAMP, 'SSSSS.FF') FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SYSTIMESTAMP-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SYSTIMESTAMP.html\nSELECT SYSTIMESTAMP AT TIME ZONE 'UTC' FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SYS_CONNECT_BY_PATH-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SYS_CONNECT_BY_PATH.html\nSELECT LPAD(' ', 2*level-1)||SYS_CONNECT_BY_PATH(last_name, '/') \"Path\"\n   FROM employees\n   START WITH last_name = 'Kochhar'\n   CONNECT BY PRIOR employee_id = manager_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SYS_CONTEXT-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SYS_CONTEXT.html\nCONNECT OE\n\nSELECT SYS_CONTEXT ('USERENV', 'SESSION_USER') \n   FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SYS_CONTEXT-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SYS_CONTEXT.html\nCONNECT OE\n\nSELECT role FROM session_roles;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SYS_CONTEXT-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SYS_CONTEXT.html\nSELECT SYS_CONTEXT ('hr_apps', 'group_no') \"User Group\" \n   FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SYS_DBURIGEN-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SYS_DBURIGEN.html\nSELECT SYS_DBURIGEN(employee_id, email)\n   FROM employees\n   WHERE employee_id = 206;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SYS_EXTRACT_UTC-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SYS_EXTRACT_UTC.html\nSELECT SYS_EXTRACT_UTC(TIMESTAMP '2000-03-28 11:30:00.00 -08:00')\n   FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SYS_GUID-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SYS_GUID.html\nALTER TABLE locations ADD (uid_col RAW(16));\nUPDATE locations SET uid_col = SYS_GUID();\nSELECT location_id, uid_col FROM locations\n   ORDER BY location_id, uid_col;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SYS_OP_ZONE_ID-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SYS_OP_ZONE_ID.html\nCREATE MATERIALIZED ZONEMAP sales_zmap\nAS\n  SELECT SYS_OP_ZONE_ID(rowid), MIN(time_id), MAX(time_id)\n  FROM sales\n  GROUP BY SYS_OP_ZONE_ID(rowid);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SYS_OP_ZONE_ID-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SYS_OP_ZONE_ID.html\nCREATE MATERIALIZED ZONEMAP sales_zmap\nSCALE 8\nAS\n  SELECT SYS_OP_ZONE_ID(rowid), MIN(time_id), MAX(time_id)\n  FROM sales\n  GROUP BY SYS_OP_ZONE_ID(rowid);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SYS_OP_ZONE_ID-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SYS_OP_ZONE_ID.html\nCREATE MATERIALIZED ZONEMAP sales_zmap\nSCALE 8\nAS\n  SELECT SYS_OP_ZONE_ID(rowid,12), MIN(time_id), MAX(time_id)\n  FROM sales\n  GROUP BY SYS_OP_ZONE_ID(rowid,12);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SYS_OP_ZONE_ID-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SYS_OP_ZONE_ID.html\nCREATE MATERIALIZED ZONEMAP sales_zmap\nAS\n  SELECT SYS_OP_ZONE_ID(s.rowid),\n         MIN(prod_category), MAX(prod_category),\n         MIN(country_id), MAX(country_id)\n  FROM sales s, products p, customers c\n  WHERE s.prod_id = p.prod_id(+) AND\n        s.cust_id = c.cust_id(+)\n  GROUP BY SYS_OP_ZONE_ID(s.rowid);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SYS_TYPEID-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SYS_TYPEID.html\nSELECT name, SYS_TYPEID(VALUE(p)) \"Type_id\" FROM persons p;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SYS_TYPEID-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SYS_TYPEID.html\nSELECT b.title, b.author.name, SYS_TYPEID(author)\n   \"Type_ID\" FROM books b;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SYS_XMLAGG-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SYS_XMLAGG.html\nSELECT SYS_XMLAGG(SYS_XMLGEN(last_name)) XMLAGG\n   FROM employees\n   WHERE last_name LIKE 'R%'\n   ORDER BY xmlagg;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/SYS_XMLGEN-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/SYS_XMLGEN.html\nSELECT SYS_XMLGEN(email)      \n   FROM employees\n   WHERE employee_id = 205;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Sequence-Pseudocolumns-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Sequence-Pseudocolumns.html\nSELECT employees_seq.nextval \n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Sequence-Pseudocolumns-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Sequence-Pseudocolumns.html\nINSERT INTO employees\n  VALUES (employees_seq.nextval, 'John', 'Doe', 'jdoe', '555-1212',\n          TO_DATE(SYSDATE), 'PU_CLERK', 2500, null, null, 30);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Sequence-Pseudocolumns-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Sequence-Pseudocolumns.html\nINSERT INTO orders (order_id, order_date, customer_id)\n  VALUES (orders_seq.nextval, TO_DATE(SYSDATE), 106);\nINSERT INTO order_items (order_id, line_item_id, product_id)\n  VALUES (orders_seq.currval, 1, 2359);\nINSERT INTO order_items (order_id, line_item_id, product_id)\n  VALUES (orders_seq.currval, 2, 3290);\nINSERT INTO order_items (order_id, line_item_id, product_id)\n  VALUES (orders_seq.currval, 3, 2381);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Syntax-for-Schema-Objects-and-Parts-in-SQL-Statements-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Syntax-for-Schema-Objects-and-Parts-in-SQL-Statements.html\nINSERT INTO departments\n  VALUES (280, 'ENTERTAINMENT_CLERK', 206, 1700);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Syntax-for-Schema-Objects-and-Parts-in-SQL-Statements-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Syntax-for-Schema-Objects-and-Parts-in-SQL-Statements.html\nDROP TABLE hr.employees;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Syntax-for-Schema-Objects-and-Parts-in-SQL-Statements-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Syntax-for-Schema-Objects-and-Parts-in-SQL-Statements.html\nCREATE VIEW Q1_2000_sales AS\n  SELECT *\n    FROM sales PARTITION (SALES_Q1_2000);\nDELETE FROM Q1_2000_sales\n  WHERE amount_sold < 0;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Syntax-for-Schema-Objects-and-Parts-in-SQL-Statements-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Syntax-for-Schema-Objects-and-Parts-in-SQL-Statements.html\nCREATE TYPE cust_address_typ\n  OID '82A4AF6A4CD1656DE034080020E0EE3D'\n  AS OBJECT\n    (street_address    VARCHAR2(40),\n     postal_code       VARCHAR2(10),\n     city              VARCHAR2(30),\n     state_province    VARCHAR2(10),\n     country_id        CHAR(2));\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Syntax-for-Schema-Objects-and-Parts-in-SQL-Statements-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Syntax-for-Schema-Objects-and-Parts-in-SQL-Statements.html\nSELECT c.cust_address.postal_code\n  FROM customers c;\nUPDATE customers c\n  SET c.cust_address.postal_code = '14621-2604'\n  WHERE c.cust_address.city = 'Rochester'\n    AND c.cust_address.state_province = 'NY';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Syntax-for-Schema-Objects-and-Parts-in-SQL-Statements-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Syntax-for-Schema-Objects-and-Parts-in-SQL-Statements.html\nSELECT TREAT(VALUE(c) AS catalog_typ).getCatalogName() \"Catalog Type\"\n  FROM categories_tab c\n  WHERE category_id = 90;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TAN-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TAN.html\nSELECT TAN(135 * 3.14159265359/180)\n   \"Tangent of 135 degrees\"  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TANH-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TANH.html\nSELECT TANH(.5) \"Hyperbolic tangent of .5\" \n   FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TIMESTAMP_TO_SCN-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TIMESTAMP_TO_SCN.html\nINSERT INTO orders (order_id, order_date, customer_id, order_total)\n   VALUES (5000, SYSTIMESTAMP, 188, 2345);\nCOMMIT;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_BINARY_DOUBLE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_BINARY_DOUBLE.html\nCREATE TABLE float_point_demo\n  (dec_num NUMBER(10,2), bin_double BINARY_DOUBLE, bin_float BINARY_FLOAT);\nINSERT INTO float_point_demo\n  VALUES (1234.56,1234.56,1234.56);\nSELECT * FROM float_point_demo;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_BINARY_DOUBLE-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_BINARY_DOUBLE.html\nSELECT dec_num, TO_BINARY_DOUBLE(dec_num)\n  FROM float_point_demo;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_BINARY_DOUBLE-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_BINARY_DOUBLE.html\nSELECT DUMP(dec_num) \"Decimal\",\n   DUMP(bin_double) \"Double\"\n   FROM float_point_demo;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_BINARY_DOUBLE-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_BINARY_DOUBLE.html\nSELECT TO_BINARY_DOUBLE('2oo' DEFAULT 0 ON CONVERSION ERROR) \"Value\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_BINARY_FLOAT-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_BINARY_FLOAT.html\nSELECT dec_num, TO_BINARY_FLOAT(dec_num)\n  FROM float_point_demo;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_BINARY_FLOAT-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_BINARY_FLOAT.html\nSELECT TO_BINARY_FLOAT('2oo' DEFAULT 0 ON CONVERSION ERROR) \"Value\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_BLOB-bfile-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_BLOB-bfile.html\nSELECT TO_BLOB(media_col, 'JPEG') FROM media_tab;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_BLOB-raw-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_BLOB-raw.html\nSELECT TO_BLOB(raw_column) blob FROM raw_table;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_CHAR-bfile-blob-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_CHAR-bfile-blob.html\nSELECT TO_CHAR(media_col, 873) FROM media_tab;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_CHAR-character-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_CHAR-character.html\nSELECT TO_CHAR('01110') FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_CHAR-character-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_CHAR-character.html\nSELECT TO_CHAR(ad_sourcetext) FROM print_media\n      WHERE product_id = 2268;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_CHAR-character-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_CHAR-character.html\nCREATE TABLE empl_temp \n  ( \n     employee_id NUMBER(6), \n     first_name  VARCHAR2(20), \n     last_name   VARCHAR2(25), \n     email       VARCHAR2(25), \n     hire_date   DATE DEFAULT SYSDATE, \n     job_id      VARCHAR2(10), \n     clob_column CLOB \n  );\nINSERT INTO empl_temp\nVALUES(111,'John','Doe','example.com','10-JAN-2015','1001','Experienced Employee');\nINSERT INTO empl_temp\nVALUES(112,'John','Smith','example.com','12-JAN-2015','1002','Junior Employee');\nINSERT INTO empl_temp\nVALUES(113,'Johnnie','Smith','example.com','12-JAN-2014','1002','Mid-Career Employee');\nINSERT INTO empl_temp\nVALUES(115,'Jane','Doe','example.com','15-JAN-2015','1005','Executive Employee');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_CHAR-character-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_CHAR-character.html\nSELECT To_char(clob_column) \"CLOB_TO_CHAR\" \nFROM   empl_temp \nWHERE  employee_id IN ( 111, 112, 115 );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_CHAR-datetime-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_CHAR-datetime.html\nCREATE TABLE date_tab (\n   ts_col      TIMESTAMP,\n   tsltz_col   TIMESTAMP WITH LOCAL TIME ZONE,\n   tstz_col    TIMESTAMP WITH TIME ZONE);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_CHAR-datetime-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_CHAR-datetime.html\nCREATE TABLE empl_temp \n  ( \n     employee_id NUMBER(6), \n     first_name  VARCHAR2(20), \n     last_name   VARCHAR2(25), \n     email       VARCHAR2(25), \n     hire_date   DATE DEFAULT SYSDATE, \n     job_id      VARCHAR2(10), \n     clob_column CLOB \n  );\nINSERT INTO empl_temp\nVALUES(111,'John','Doe','example.com','10-JAN-2015','1001','Experienced Employee');\nINSERT INTO empl_temp\nVALUES(112,'John','Smith','example.com','12-JAN-2015','1002','Junior Employee');\nINSERT INTO empl_temp\nVALUES(113,'Johnnie','Smith','example.com','12-JAN-2014','1002','Mid-Career Employee');\nINSERT INTO empl_temp\nVALUES(115,'Jane','Doe','example.com','15-JAN-2015','1005','Executive Employee');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_CHAR-datetime-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_CHAR-datetime.html\nSELECT hire_date \"Default\",  \n       TO_CHAR(hire_date,'DS') \"Short\",  \n       TO_CHAR(hire_date,'DL') \"Long\"FROM empl_temp  \nWHERE employee_id IN (111, 112, 115);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_CHAR-datetime-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_CHAR-datetime.html\nALTER SESSION SET TIME_ZONE = '-8:00';\nINSERT INTO date_tab VALUES (  \n   TIMESTAMP'1999-12-01 10:00:00',\n   TIMESTAMP'1999-12-01 10:00:00',\n   TIMESTAMP'1999-12-01 10:00:00');\nINSERT INTO date_tab VALUES (\n   TIMESTAMP'1999-12-02 10:00:00 -8:00', \n   TIMESTAMP'1999-12-02 10:00:00 -8:00',\n   TIMESTAMP'1999-12-02 10:00:00 -8:00');\nSELECT TO_CHAR(ts_col, 'DD-MON-YYYY HH24:MI:SSxFF') AS ts_date,\n   TO_CHAR(tstz_col, 'DD-MON-YYYY HH24:MI:SSxFF TZH:TZM') AS tstz_date\n   FROM date_tab\n   ORDER BY ts_date, tstz_date;\nSELECT SESSIONTIMEZONE, \n   TO_CHAR(tsltz_col, 'DD-MON-YYYY HH24:MI:SSxFF') AS tsltz\n   FROM date_tab\n   ORDER BY sessiontimezone, tsltz;\nALTER SESSION SET TIME_ZONE = '-5:00';\nSELECT TO_CHAR(ts_col, 'DD-MON-YYYY HH24:MI:SSxFF') AS ts_col,\n   TO_CHAR(tstz_col, 'DD-MON-YYYY HH24:MI:SSxFF TZH:TZM') AS tstz_col\n   FROM date_tab\n   ORDER BY ts_col, tstz_col;\nSELECT SESSIONTIMEZONE,\nTO_CHAR(tsltz_col, 'DD-MON-YYYY HH24:MI:SSxFF') AS tsltz_col\n   FROM date_tab\n   ORDER BY sessiontimezone, tsltz_col;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_CHAR-datetime-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_CHAR-datetime.html\nSELECT TO_CHAR(INTERVAL '123-2' YEAR(3) TO MONTH) FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_CHAR-datetime-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_CHAR-datetime.html\nWITH dates AS (  \n  SELECT date'2015-01-01' d FROM dual union  \n  SELECT date'2015-01-10' d FROM dual union  \n  SELECT date'2015-02-01' d FROM dual \n)  \nSELECT d \"Original Date\", \n       to_char(d, 'dd-mm-yyyy') \"Day-Month-Year\",  \n       to_char(d, 'hh24:mi') \"Time in 24-hr format\",  \n       to_char(d, 'iw-iyyy') \"ISO Year and Week of Year\" \nFROM dates;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_CHAR-datetime-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_CHAR-datetime.html\nWITH dates AS (  \n  SELECT date'2015-01-01' d FROM dual union  \n  SELECT date'2015-01-10' d FROM dual union  \n  SELECT date'2015-02-01' d FROM dual union \n  SELECT timestamp'2015-03-03 23:44:32' d FROM dual union  \n  SELECT timestamp'2015-04-11 12:34:56' d FROM dual   \n)  \nSELECT d \"Original Date\", \n       to_char(d, 'dd-mm-yyyy') \"Day-Month-Year\",  \n       to_char(d, 'hh24:mi') \"Time in 24-hr format\",  \n       to_char(d, 'iw-iyyy') \"ISO Year and Week of Year\", \n       to_char(d, 'Month') \"Month Name\", \n       to_char(d, 'Year') \"Year\"  \nFROM dates;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_CHAR-datetime-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_CHAR-datetime.html\nWITH dates AS (   \n  SELECT date'2015-01-01' d FROM dual union   \n  SELECT date'2015-01-10' d FROM dual union   \n  SELECT date'2015-02-01' d FROM dual union   \n  SELECT timestamp'2015-03-03 23:44:32' d FROM dual union   \n  SELECT timestamp'2015-04-11 12:34:56' d FROM dual    \n)   \nSELECT extract(minute from d) minutes,  \n       extract(hour from d) hours,  \n       extract(day from d) days,  \n       extract(month from d) months,  \n       extract(year from d) years  \nFROM dates;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_CHAR-datetime-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_CHAR-datetime.html\nWITH nums AS (  \n  SELECT 10 n FROM dual union  \n  SELECT 9.99 n FROM dual union  \n  SELECT 1000000 n FROM dual  --one million  \n)  \nSELECT n \"Input Number N\",  \n       to_char(n),  \n       to_char(n, '9,999,999.99') \"Number with Commas\",  \n       to_char(n, '0,000,000.000') \"Zero-padded Number\",  \n       to_char(n, '9.9EEEE') \"Scientific Notation\"  \nFROM nums;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_CHAR-datetime-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_CHAR-datetime.html\nWITH nums AS (  \n  SELECT 10 n FROM dual union  \n  SELECT 9.99 n FROM dual union  \n  SELECT .99 n FROM dual union  \n  SELECT 1000000 n FROM dual  --one million  \n)  \nSELECT n \"Input Number N\",  \n       to_char(n),  \n       to_char(n, '9,999,999.99') \"Number with Commas\", \n       to_char(n, '0,000,000.000') \"Zero_padded Number\",  \n       to_char(n, '9.9EEEE') \"Scientific Notation\",  \n       to_char(n, '$9,999,990.00') Monetary,  \n       to_char(n, 'X') \"Hexadecimal Value\" \nFROM nums;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_CHAR-datetime-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_CHAR-datetime.html\nWITH nums AS (  \n  SELECT 10 n FROM dual union  \n  SELECT 9.99 n FROM dual union  \n  SELECT .99 n FROM dual union  \n  SELECT 1000000 n FROM dual  --one million  \n)  \nSELECT n \"Input Number N\",  \n       to_char(n),  \n       to_char(n, '9,999,999.99') \"Number with Commas\",  \n       to_char(n, '0,000,000.000') \"Zero_padded Number\",  \n       to_char(n, '9.9EEEE') \"Scientific Notation\",  \n       to_char(n, '$9,999,990.00') Monetary,  \n       to_char(n, 'XXXXXX') \"Hexadecimal Value\"  \nFROM nums;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_CHAR-number-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_CHAR-number.html\nSELECT TO_CHAR('01110' + 1) FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_CHAR-number-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_CHAR-number.html\nSELECT TO_CHAR(-10000,'L99G999D99MI') \"Amount\"\n     FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_CHAR-number-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_CHAR-number.html\nSELECT TO_CHAR(-10000,'L99G999D99MI',\n   'NLS_NUMERIC_CHARACTERS = '',.''\n   NLS_CURRENCY = ''AusDollars'' ') \"Amount\"\n     FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_CHAR-number-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_CHAR-number.html\nSELECT TO_CHAR(-10000,'99G999D99C',\n   'NLS_NUMERIC_CHARACTERS = '',.''\n   NLS_ISO_CURRENCY=POLAND') \"Amount\"\n     FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_CHAR-number-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_CHAR-number.html\nCREATE TABLE empl_temp \n  ( \n     employee_id NUMBER(6), \n     first_name  VARCHAR2(20), \n     last_name   VARCHAR2(25), \n     email       VARCHAR2(25), \n     hire_date   DATE DEFAULT SYSDATE, \n     job_id      VARCHAR2(10), \n     clob_column CLOB \n  );\nINSERT INTO empl_temp\nVALUES(111,'John','Doe','example.com','10-JAN-2015','1001','Experienced Employee');\nINSERT INTO empl_temp\nVALUES(112,'John','Smith','example.com','12-JAN-2015','1002','Junior Employee');\nINSERT INTO empl_temp\nVALUES(113,'Johnnie','Smith','example.com','12-JAN-2014','1002','Mid-Career Employee');\nINSERT INTO empl_temp\nVALUES(115,'Jane','Doe','example.com','15-JAN-2015','1005','Executive Employee');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_CHAR-number-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_CHAR-number.html\nSELECT To_char(employee_id) \"NUM_TO_CHAR\" \nFROM   empl_temp \nWHERE  employee_id IN ( 111, 112, 113, 115 );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_CLOB-bfile-blob-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_CLOB-bfile-blob.html\nSELECT TO_CLOB(docu, 873, 'text/xml') FROM media_tab;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_CLOB-character-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_CLOB-character.html\nUPDATE PRINT_MEDIA \n   SET AD_FINALTEXT = TO_CLOB (AD_FLTEXTN);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_DATE-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_DATE.html\nSELECT TO_DATE(\n  'January 15, 1989, 11:00 A.M.',\n  'Month dd, YYYY, HH:MI A.M.',\n  'NLS_DATE_LANGUAGE = American')\n    FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_DATE-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_DATE.html\nALTER SESSION SET NLS_TERRITORY = 'KOREAN';\nSELECT TO_DATE(\n    'January 15, 1989, 11:00 A.M.',\n    'Month dd, YYYY, HH:MI A.M.',\n     'NLS_DATE_LANGUAGE = American')\n     FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_DATE-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_DATE.html\nSELECT TO_DATE('Febuary 15, 2016, 11:00 A.M.'\n       DEFAULT 'January 01, 2016 12:00 A.M.' ON CONVERSION ERROR,\n       'Month dd, YYYY, HH:MI A.M.') \"Value\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_DSINTERVAL-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_DSINTERVAL.html\nSELECT employee_id, last_name FROM employees\n   WHERE hire_date + TO_DSINTERVAL('100 00:00:00')\n   <= DATE '2002-11-01'\n   ORDER BY employee_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_DSINTERVAL-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_DSINTERVAL.html\nSELECT TO_CHAR(TIMESTAMP '2009-01-01 00:00:00' + TO_DSINTERVAL('P100DT05H'),\n   'YYYY-MM-DD HH24:MI:SS') \"Time Stamp\"\n     FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_DSINTERVAL-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_DSINTERVAL.html\nSELECT TO_DSINTERVAL('1o 1:02:10'\n       DEFAULT '10 8:00:00' ON CONVERSION ERROR) \"Value\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_MULTI_BYTE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_MULTI_BYTE.html\nSELECT dump(TO_MULTI_BYTE( 'A')) FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_NCHAR-character-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_NCHAR-character.html\nSELECT TO_NCHAR(cust_last_name) FROM customers\n   WHERE customer_id=103;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_NCHAR-datetime-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_NCHAR-datetime.html\nSELECT TO_NCHAR(ORDER_DATE) AS order_date\n   FROM ORDERS\n   WHERE ORDER_STATUS > 9\n   ORDER BY order_date;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_NCHAR-number-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_NCHAR-number.html\nSELECT TO_NCHAR(customer_id) \"NCHAR_Customer_ID\"  FROM orders \n   WHERE order_status > 9\n   ORDER BY \"NCHAR_Customer_ID\";"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_NCLOB-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_NCLOB.html\nINSERT INTO print_media (product_id, ad_id, ad_fltextn)\n   VALUES (3502, 31001, \n      TO_NCLOB('Placeholder for new product description'));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_NUMBER-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_NUMBER.html\nUPDATE employees SET salary = salary + \n   TO_NUMBER('100.00', '9G999D99')\n   WHERE last_name = 'Perkins';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_NUMBER-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_NUMBER.html\nSELECT TO_NUMBER('-AusDollars100','L9G999D99',\n   ' NLS_NUMERIC_CHARACTERS = '',.''\n     NLS_CURRENCY            = ''AusDollars''\n   ') \"Amount\"\n     FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_NUMBER-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_NUMBER.html\nSELECT TO_NUMBER('2,00' DEFAULT 0 ON CONVERSION ERROR) \"Value\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_SINGLE_BYTE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_SINGLE_BYTE.html\nSELECT TO_SINGLE_BYTE( CHR(15711393)) FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_TIMESTAMP-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_TIMESTAMP.html\nSELECT TO_TIMESTAMP ('10-Sep-02 14:10:10.123000', 'DD-Mon-RR HH24:MI:SS.FF')\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_TIMESTAMP-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_TIMESTAMP.html\nSELECT TO_TIMESTAMP ('10-Sept-02 14:10:10.123000'\n  DEFAULT NULL ON CONVERSION ERROR,\n  'DD-Mon-RR HH24:MI:SS.FF',\n  'NLS_DATE_LANGUAGE = American') \"Value\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_TIMESTAMP_TZ-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_TIMESTAMP_TZ.html\nSELECT TO_TIMESTAMP_TZ('1999-12-01 11:00:00 -8:00',\n  'YYYY-MM-DD HH:MI:SS TZH:TZM') FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_TIMESTAMP_TZ-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_TIMESTAMP_TZ.html\nSELECT order_id, line_item_id,\n  CAST(NULL AS TIMESTAMP WITH LOCAL TIME ZONE) order_date\n  FROM order_items\nUNION\nSELECT order_id, to_number(null), order_date\n  FROM orders;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_TIMESTAMP_TZ-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_TIMESTAMP_TZ.html\nSELECT TO_TIMESTAMP_TZ('1999-13-01 11:00:00 -8:00'\n  DEFAULT NULL ON CONVERSION ERROR,\n  'YYYY-MM-DD HH:MI:SS TZH:TZM') \"Value\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_UTC_TIMESTAMP_TZ-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_UTC_TIMESTAMP_TZ.html\nSELECT TO_UTC_TIMESTAMP_TZ('1998-01-01') FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_UTC_TIMESTAMP_TZ-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_UTC_TIMESTAMP_TZ.html\nSELECT TO_UTC_TIMESTAMP_TZ('2000-01-02T12:34:56.789') FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_UTC_TIMESTAMP_TZ-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_UTC_TIMESTAMP_TZ.html\nSELECT TO_UTC_TIMESTAMP_TZ('2016-05-05T00:00:00.000Z') FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_UTC_TIMESTAMP_TZ-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_UTC_TIMESTAMP_TZ.html\nSELECT TO_UTC_TIMESTAMP_TZ('2016-05-05T02:04:35.4678Z') FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_YMINTERVAL-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_YMINTERVAL.html\nSELECT hire_date, hire_date + TO_YMINTERVAL('01-02') \"14 months\"\n   FROM employees;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_YMINTERVAL-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_YMINTERVAL.html\nSELECT hire_date, hire_date + TO_YMINTERVAL('P1Y2M') FROM employees;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TO_YMINTERVAL-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TO_YMINTERVAL.html\nSELECT TO_YMINTERVAL('1x-02'\n       DEFAULT '00-00' ON CONVERSION ERROR) \"Value\"\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TRANSLATE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TRANSLATE.html\nSELECT TRANSLATE('SQL*Plus User''s Guide', ' */''', '___') FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TRANSLATE-USING-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TRANSLATE-USING.html\nCREATE TABLE translate_tab (char_col  VARCHAR2(100),\n                            nchar_col NVARCHAR2(50));\nINSERT INTO translate_tab \n   SELECT NULL, translated_name\n      FROM product_descriptions\n      WHERE product_id = 3501;\nSELECT * FROM translate_tab;\nUPDATE translate_tab \n   SET char_col = TRANSLATE (nchar_col USING CHAR_CS);\nSELECT * FROM translate_tab;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TREAT-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TREAT.html\nSELECT name, TREAT(VALUE(p) AS employee_t).salary salary \n   FROM persons p;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TRIM-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TRIM.html\nSELECT employee_id,\n      TO_CHAR(TRIM(LEADING 0 FROM hire_date))\n      FROM employees\n      WHERE department_id = 60\n      ORDER BY employee_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TRUNC-date-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TRUNC-date.html\nSELECT TRUNC(TO_DATE('27-OCT-92','DD-MON-YY'), 'YEAR')\n  \"New Year\" FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TRUNC-date-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TRUNC-date.html\nWITH dates AS (   \n  SELECT date'2015-01-01' d FROM dual union   \n  SELECT date'2015-01-10' d FROM dual union   \n  SELECT date'2015-02-01' d FROM dual union   \n  SELECT timestamp'2015-03-03 23:45:00' d FROM dual union   \n  SELECT timestamp'2015-04-11 12:34:56' d FROM dual    \n)   \nSELECT d \"Original Date\",   \n       trunc(d) \"Nearest Day, Time Removed\",   \n       trunc(d, 'ww') \"Nearest Week\", \n       trunc(d, 'iw') \"Start of Week\",   \n       trunc(d, 'mm') \"Start of Month\",   \n       trunc(d, 'year') \"Start of Year\"   \nFROM dates;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TRUNC-date-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TRUNC-date.html\nWITH dates AS (   \n  SELECT date'2015-01-01' d FROM dual union   \n  SELECT date'2015-01-10' d FROM dual union   \n  SELECT date'2015-02-01' d FROM dual union   \n  SELECT timestamp'2015-03-03 23:45:00' d FROM dual union   \n  SELECT timestamp'2015-04-11 12:34:56' d FROM dual    \n)   \nSELECT d \"Original Date\",   \n       trunc(d) \"Date with Time Removed\",   \n       to_char(trunc(d, 'mi'), 'dd-mon-yyyy hh24:mi') \"Nearest Minute\",   \n       trunc(d, 'iw') \"Start of Week\",   \n       trunc(d, 'mm') \"Start of Month\",   \n       trunc(d, 'year') \"Start of Year\"  \nFROM dates;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TRUNC-date-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TRUNC-date.html\nALTER SESSION SET nls_date_format = 'dd-mon-yyyy hh24:mi';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TRUNC-date-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TRUNC-date.html\nWITH dates AS (   \n  SELECT date'2015-01-01' d FROM dual union   \n  SELECT date'2015-01-10' d FROM dual union   \n  SELECT date'2015-02-01' d FROM dual union   \n  SELECT timestamp'2015-03-03 23:44:32' d FROM dual union   \n  SELECT timestamp'2015-04-11 12:34:56' d FROM dual    \n)   \nSELECT d \"Original Date\",   \n       trunc(d) \"Date, time removed\",   \n       to_char(trunc(d, 'mi'), 'dd-mon-yyyy hh24:mi') \"Nearest Minute\",   \n       trunc(d, 'iw') \"Start of Week\",   \n       trunc(d, 'mm') \"Start of Month\",   \n       trunc(d, 'year') \"Start of Year\"   \nFROM dates;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TRUNC-number-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TRUNC-number.html\nSELECT TRUNC(15.79,1) \"Truncate\" FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TRUNCATE-CLUSTER-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TRUNCATE-CLUSTER.html\nTRUNCATE CLUSTER personnel REUSE STORAGE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TRUNCATE-TABLE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TRUNCATE-TABLE.html\nTRUNCATE TABLE employees_demo;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TRUNCATE-TABLE-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TRUNCATE-TABLE.html\nTRUNCATE TABLE sales_demo PRESERVE MATERIALIZED VIEW LOG;\nTRUNCATE TABLE orders_demo;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/TZ_OFFSET-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/TZ_OFFSET.html\nSELECT TZ_OFFSET('US/Eastern') FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/The-UNION-ALL-INTERSECT-MINUS-Operators-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/The-UNION-ALL-INTERSECT-MINUS-Operators.html\nSELECT 3 FROM DUAL\n   INTERSECT\nSELECT 3f FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/The-UNION-ALL-INTERSECT-MINUS-Operators-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/The-UNION-ALL-INTERSECT-MINUS-Operators.html\nSELECT TO_BINARY_FLOAT(3) FROM DUAL\n   INTERSECT\nSELECT 3f FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/The-UNION-ALL-INTERSECT-MINUS-Operators-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/The-UNION-ALL-INTERSECT-MINUS-Operators.html\nSELECT '3' FROM DUAL\n   INTERSECT\nSELECT 3f FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/The-UNION-ALL-INTERSECT-MINUS-Operators-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/The-UNION-ALL-INTERSECT-MINUS-Operators.html\nSELECT location_id, department_name \"Department\", \n   TO_CHAR(NULL) \"Warehouse\"  FROM departments\n   UNION\n   SELECT location_id, TO_CHAR(NULL) \"Department\", warehouse_name \n   FROM warehouses;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/The-UNION-ALL-INTERSECT-MINUS-Operators-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/The-UNION-ALL-INTERSECT-MINUS-Operators.html\nSELECT product_id FROM order_items\nUNION\nSELECT product_id FROM inventories\nORDER BY product_id;\nSELECT location_id  FROM locations \nUNION ALL \nSELECT location_id  FROM departments\nORDER BY location_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/The-UNION-ALL-INTERSECT-MINUS-Operators-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/The-UNION-ALL-INTERSECT-MINUS-Operators.html\nSELECT product_id FROM inventories\nINTERSECT\nSELECT product_id FROM order_items\nORDER BY product_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/The-UNION-ALL-INTERSECT-MINUS-Operators-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/The-UNION-ALL-INTERSECT-MINUS-Operators.html\nSELECT product_id FROM inventories\nMINUS\nSELECT product_id FROM order_items\nORDER BY product_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/The-UNION-ALL-INTERSECT-MINUS-Operators-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/The-UNION-ALL-INTERSECT-MINUS-Operators.html\nSELECT product_id FROM inventories\nEXCEPT\nSELECT product_id FROM order_items\nORDER BY product_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Type-Constructor-Expressions-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Type-Constructor-Expressions.html\nCREATE TYPE address_book_t AS TABLE OF cust_address_typ; \nDECLARE \n   myaddr cust_address_typ := cust_address_typ( \n     '500 Oracle Parkway', 94065, 'Redwood Shores', 'CA','USA'); \n   alladdr address_book_t := address_book_t(); \nBEGIN \n   INSERT INTO customers VALUES ( \n      666999, 'Joe', 'Smith', myaddr, NULL, NULL, NULL, NULL, \n      NULL, NULL, NULL, NULL, NULL, NULL, NULL); \nEND; \n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Type-Constructor-Expressions-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Type-Constructor-Expressions.html\nCREATE TABLE warehouse_tab OF warehouse_typ;\nINSERT INTO warehouse_tab \n   VALUES (warehouse_typ(101, 'new_wh', 201));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/UID-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/UID.html\nSELECT UID FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/UNISTR-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/UNISTR.html\nSELECT UNISTR('abc\\00e5\\00f1\\00f6') FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/UPDATE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/UPDATE.html\nUPDATE employees e  \nSET    e.salary = j.max_salary\nFROM   jobs j\nWHERE  j.job_id = e.job_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/UPDATE-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/UPDATE.html\nUPDATE employees\n   SET commission_pct = NULL\n   WHERE job_id = 'SH_CLERK';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/UPDATE-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/UPDATE.html\nUPDATE employees SET \n    job_id = 'SA_MAN', salary = salary + 1000, department_id = 120 \n    WHERE first_name||' '||last_name = 'Douglas Grant';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/UPDATE-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/UPDATE.html\nUPDATE employees@remote\n   SET salary = salary*1.1\n   WHERE last_name = 'Baer';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/UPDATE-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/UPDATE.html\nUPDATE employees a \n    SET department_id = \n        (SELECT department_id \n            FROM departments \n            WHERE location_id = '2100'), \n        (salary, commission_pct) = \n        (SELECT 1.1*AVG(salary), 1.5*AVG(commission_pct) \n          FROM employees b \n          WHERE a.department_id = b.department_id) \n    WHERE department_id IN \n        (SELECT department_id \n          FROM departments\n          WHERE location_id = 2900 \n              OR location_id = 2700);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/UPDATE-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/UPDATE.html\nUPDATE sales PARTITION (sales_q1_1999) s\n   SET s.promo_id = 494\n   WHERE amount_sold > 1000;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/UPDATE-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/UPDATE.html\nCREATE TABLE people_demo1 OF people_typ;\nCREATE TABLE people_demo2 OF people_typ;\nUPDATE people_demo1 p SET VALUE(p) =\n   (SELECT VALUE(q) FROM people_demo2 q\n    WHERE p.department_id = q.department_id)\n   WHERE p.department_id = 10;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/UPDATE-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/UPDATE.html\nUPDATE employees\n  SET job_id ='SA_MAN', salary = salary + 1000, department_id = 140\n  WHERE last_name = 'Jones'\n  RETURNING salary*0.25, last_name, department_id\n    INTO :bnd1, :bnd2, :bnd3;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/UPDATE-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/UPDATE.html\nUPDATE employees\n   SET salary = salary * 1.1\n   WHERE department_id = 100\n   RETURNING SUM(salary) INTO :bnd1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/UPDATE-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/UPDATE.html\nUPDATE hr.employees e\n    SET e.salary = j.max_salary\n    FROM hr.jobs j    \n    WHERE e.job_id = j.job_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/UPPER-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/UPPER.html\nSELECT UPPER(last_name) \"Uppercase\"\n   FROM employees;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/USER-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/USER.html\nSELECT USER, UID FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/USERENV-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/USERENV.html\nSELECT USERENV('LANGUAGE') \"Language\" FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Unnesting-of-Nested-Subqueries-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Unnesting-of-Nested-Subqueries.html\nSELECT C.cust_last_name, C.country_id\n        FROM customers C\n        WHERE EXISTS (SELECT 1\n              FROM sales S\n              WHERE S.quantity_sold > 1000 and\n                    S.cust_id = C.cust_id);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Unnesting-of-Nested-Subqueries-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Unnesting-of-Nested-Subqueries.html\nSELECT C.cust_last_name, C.country_id\n        FROM customers C        \n        WHERE C.cust_id =ANY (SELECT S.cust_id\n                      FROM sales S\n                      WHERE S.quantity_sold > 1000);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Unnesting-of-Nested-Subqueries-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Unnesting-of-Nested-Subqueries.html\nSELECT C.cust_last_name, C.country_id\nFROM customers C\nWHERE NOT EXISTS (SELECT 1\n                  FROM sales S, products P\n                  WHERE P.prod_id = S.prod_id and\n                        P.prod_min_price > 90 and\n                        S.cust_id = C.cust_id);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Using-Extensible-Indexing-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Using-Extensible-Indexing.html\nSELECT last_name, salary FROM\n   (SELECT last_name, DENSE_RANK() OVER\n      (ORDER BY salary DESC) rank_val, salary FROM employees)\n   WHERE rank_val BETWEEN 10 AND 20;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Using-Extensible-Indexing-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Using-Extensible-Indexing.html\nCREATE OR REPLACE TYPE position_im AUTHID CURRENT_USER AS OBJECT\n(\n  curnum  NUMBER,\n  howmany NUMBER,\n  lower_bound NUMBER,  \n  upper_bound NUMBER,  \n/* lower_bound and upper_bound are used for the\nindex-based functional implementation */\n  STATIC FUNCTION ODCIGETINTERFACES(ifclist OUT SYS.ODCIOBJECTLIST) RETURN NUMBER, \n  STATIC FUNCTION ODCIINDEXCREATE \n    (ia SYS.ODCIINDEXINFO, parms VARCHAR2, env SYS.ODCIEnv) RETURN NUMBER,\n  STATIC FUNCTION ODCIINDEXTRUNCATE (ia SYS.ODCIINDEXINFO,\n                                     env SYS.ODCIEnv) RETURN NUMBER,\n  STATIC FUNCTION ODCIINDEXDROP(ia SYS.ODCIINDEXINFO, \n                                env SYS.ODCIEnv) RETURN NUMBER,\n  STATIC FUNCTION ODCIINDEXINSERT(ia SYS.ODCIINDEXINFO, rid ROWID,\n                                  newval NUMBER, env SYS.ODCIEnv) RETURN NUMBER,\n  STATIC FUNCTION ODCIINDEXDELETE(ia SYS.ODCIINDEXINFO, rid ROWID, oldval NUMBER,\n                                  env SYS.ODCIEnv) RETURN NUMBER,\n  STATIC FUNCTION ODCIINDEXUPDATE(ia SYS.ODCIINDEXINFO, rid ROWID, oldval NUMBER,\n                                  newval NUMBER, env SYS.ODCIEnv) RETURN NUMBER,\n  STATIC FUNCTION ODCIINDEXSTART(SCTX IN OUT position_im, ia SYS.ODCIINDEXINFO,\n                                 op SYS.ODCIPREDINFO, qi SYS.ODCIQUERYINFO,\n                                 strt NUMBER, stop NUMBER, lower_pos NUMBER,\n                                 upper_pos NUMBER, env SYS.ODCIEnv) RETURN NUMBER,\n  MEMBER FUNCTION ODCIINDEXFETCH(SELF IN OUT position_im, nrows NUMBER, \n                                 rids OUT SYS.ODCIRIDLIST, env SYS.ODCIEnv) \n                                 RETURN NUMBER,\n  MEMBER FUNCTION ODCIINDEXCLOSE(env SYS.ODCIEnv) RETURN NUMBER\n);\n/\nCREATE OR REPLACE TYPE BODY position_im\nIS\n   STATIC FUNCTION ODCIGETINTERFACES(ifclist OUT SYS.ODCIOBJECTLIST)\n       RETURN NUMBER IS\n   BEGIN\n       ifclist := SYS.ODCIOBJECTLIST(SYS.ODCIOBJECT('SYS','ODCIINDEX2'));\n       RETURN ODCICONST.SUCCESS;\n   END ODCIGETINTERFACES;\n STATIC FUNCTION ODCIINDEXCREATE (ia SYS.ODCIINDEXINFO, parms VARCHAR2, env SYS.ODCIEnv) RETURN\n NUMBER\n  IS\n   stmt   VARCHAR2(2000);\n  BEGIN\n/* Construct the SQL statement */\n   stmt := 'Create Table ' || ia.INDEXSCHEMA || '.' || ia.INDEXNAME ||\n           '_STORAGE_TAB' || '(col_val, base_rowid, constraint pk PRIMARY KEY ' ||\n           '(col_val, base_rowid)) ORGANIZATION INDEX AS SELECT ' ||\n           ia.INDEXCOLS(1).COLNAME || ', ROWID FROM ' || \n           ia.INDEXCOLS(1).TABLESCHEMA || '.' || ia.INDEXCOLS(1).TABLENAME;\n   EXECUTE IMMEDIATE stmt;\n   RETURN ODCICONST.SUCCESS;\n  END;\n  STATIC FUNCTION ODCIINDEXDROP(ia SYS.ODCIINDEXINFO, env SYS.ODCIEnv) RETURN NUMBER IS\n   stmt VARCHAR2(2000);\n  BEGIN\n/* Construct the SQL statement */\n   stmt := 'DROP TABLE ' || ia.INDEXSCHEMA || '.' || ia.INDEXNAME ||\n   '_STORAGE_TAB';\n/* Execute the statement */\n   EXECUTE IMMEDIATE stmt;\n   RETURN ODCICONST.SUCCESS;\n  END;\n  STATIC FUNCTION ODCIINDEXTRUNCATE(ia SYS.ODCIINDEXINFO, env SYS.ODCIEnv) RETURN NUMBER IS\n   stmt VARCHAR2(2000);\n  BEGIN\n/* Construct the SQL statement */\n   stmt := 'TRUNCATE TABLE ' || ia.INDEXSCHEMA || '.' || ia.INDEXNAME || '_STORAGE_TAB';\n\n   EXECUTE IMMEDIATE stmt;\n   RETURN ODCICONST.SUCCESS;\n  END;\n  STATIC FUNCTION ODCIINDEXINSERT(ia SYS.ODCIINDEXINFO, rid ROWID,\n                          newval NUMBER, env SYS.ODCIEnv) RETURN NUMBER IS\n   stmt VARCHAR2(2000);\n  BEGIN\n/* Construct the SQL statement */\n   stmt := 'INSERT INTO ' || ia.INDEXSCHEMA || '.' || ia.INDEXNAME || \n          '_STORAGE_TAB  VALUES (''' || newval || ''' , ''' || rid || ''' )';\n/* Execute the SQL statement */\n   EXECUTE IMMEDIATE stmt;\n   RETURN ODCICONST.SUCCESS;\n  END;\n\n  STATIC FUNCTION ODCIINDEXDELETE(ia SYS.ODCIINDEXINFO, rid ROWID, oldval NUMBER,\n                                  env SYS.ODCIEnv)\n     RETURN NUMBER IS\n   stmt VARCHAR2(2000);\n  BEGIN\n/* Construct the SQL statement */\n   stmt := 'DELETE FROM ' || ia.INDEXSCHEMA || '.' || ia.INDEXNAME || \n          '_STORAGE_TAB WHERE col_val = ''' || oldval || ''' AND base_rowid = ''' || rid || '''';\n/* Execute the statement */\n   EXECUTE IMMEDIATE stmt;\n   RETURN ODCICONST.SUCCESS;\n  END;\n  STATIC FUNCTION ODCIINDEXUPDATE(ia SYS.ODCIINDEXINFO, rid ROWID, oldval NUMBER,\n                          newval NUMBER, env SYS.ODCIEnv) RETURN NUMBER IS \n   stmt VARCHAR2(2000);\n  BEGIN\n/* Construct the SQL statement */\n   stmt := 'UPDATE ' || ia.INDEXSCHEMA || '.' || ia.INDEXNAME || \n          '_STORAGE_TAB SET col_val = ''' || newval || ''' WHERE f2 = '''|| rid ||'''';\n/* Execute the statement */\n   EXECUTE IMMEDIATE stmt;\n   RETURN ODCICONST.SUCCESS;\n  END;\n  STATIC FUNCTION ODCIINDEXSTART(SCTX IN OUT position_im, ia SYS.ODCIINDEXINFO,\n                         op SYS.ODCIPREDINFO, qi SYS.ODCIQUERYINFO,\n                         strt NUMBER, stop NUMBER, lower_pos NUMBER,\n                         upper_pos NUMBER, env SYS.ODCIEnv) RETURN NUMBER IS\n    rid              VARCHAR2(5072);\n    storage_tab_name VARCHAR2(65);\n    lower_bound_stmt VARCHAR2(2000);\n    upper_bound_stmt VARCHAR2(2000);\n    range_query_stmt VARCHAR2(2000);\n    lower_bound      NUMBER;\n    upper_bound      NUMBER;\n    cnum             INTEGER;\n    nrows            INTEGER;\n\n  BEGIN\n/* Take care of some error cases.\n    The only predicates in which position operator can appear are\n       op() = 1     OR\n       op() = 0     OR\n       op() between 0 and 1 \n*/\n    IF (((strt != 1) AND (strt != 0)) OR\n        ((stop != 1) AND (stop != 0)) OR\n        ((strt = 1) AND (stop = 0))) THEN\n      RAISE_APPLICATION_ERROR(-20101, \n                              'incorrect predicate for position_between operator');\n    END IF;\n    IF (lower_pos > upper_pos) THEN\n      RAISE_APPLICATION_ERROR(-20101, 'Upper Position must be greater than or\n      equal to Lower Position');\n    END IF;\n    IF (lower_pos <= 0) THEN\n      RAISE_APPLICATION_ERROR(-20101, 'Both Positions must be greater than zero');\n    END IF;\n    storage_tab_name := ia.INDEXSCHEMA || '.' || ia.INDEXNAME ||\n                        '_STORAGE_TAB';\n    upper_bound_stmt := 'Select MIN(col_val) FROM (Select /*+ INDEX_DESC(' ||\n                        storage_tab_name || ') */ DISTINCT ' ||\n                        'col_val FROM ' || storage_tab_name || ' ORDER BY ' ||\n                        'col_val DESC) WHERE rownum <= ' || lower_pos;\n    EXECUTE IMMEDIATE upper_bound_stmt INTO upper_bound;\n    IF (lower_pos != upper_pos) THEN\n      lower_bound_stmt := 'Select MIN(col_val) FROM (Select /*+ INDEX_DESC(' || \n                          storage_tab_name || ') */ DISTINCT ' ||\n                          'col_val FROM ' || storage_tab_name ||\n                          ' WHERE col_val < ' || upper_bound || ' ORDER BY ' ||\n                          'col_val DESC) WHERE rownum <= ' || \n                          (upper_pos - lower_pos);\n      EXECUTE IMMEDIATE lower_bound_stmt INTO lower_bound;\n    ELSE\n      lower_bound := upper_bound;\n    END IF;\n    IF (lower_bound IS NULL) THEN\n      lower_bound := upper_bound;\n    END IF;\n    range_query_stmt := 'Select base_rowid FROM ' || storage_tab_name ||\n                        ' WHERE col_val BETWEEN ' || lower_bound || ' AND ' ||\n                        upper_bound;\n    cnum := DBMS_SQL.OPEN_CURSOR;\n    DBMS_SQL.PARSE(cnum, range_query_stmt, DBMS_SQL.NATIVE);\n/* set context as the cursor number */\n    SCTX := position_im(cnum, 0, 0, 0);\n/* return success */\n    RETURN ODCICONST.SUCCESS;\n  END;\n  MEMBER FUNCTION ODCIINDEXFETCH(SELF IN OUT position_im, nrows NUMBER,\n                                 rids OUT SYS.ODCIRIDLIST, env SYS.ODCIEnv)\n   RETURN NUMBER IS\n    cnum    INTEGER;\n    rid_tab DBMS_SQL.Varchar2_table;\n    rlist   SYS.ODCIRIDLIST := SYS.ODCIRIDLIST();\n    i       INTEGER;\n    d       INTEGER;\n  BEGIN\n    cnum := SELF.curnum;\n    IF self.howmany = 0 THEN\n      dbms_sql.define_array(cnum, 1, rid_tab, nrows, 1);\n      d := DBMS_SQL.EXECUTE(cnum);\n    END IF;\n    d := DBMS_SQL.FETCH_ROWS(cnum);\n    IF d = nrows THEN\n      rlist.extend(d);\n    ELSE\n      rlist.extend(d+1);\n    END IF;\n    DBMS_SQL.COLUMN_VALUE(cnum, 1, rid_tab);\n    for i in 1..d loop\n      rlist(i) := rid_tab(i+SELF.howmany);\n    end loop;\n    SELF.howmany := SELF.howmany + d;\n    rids := rlist;\n    RETURN ODCICONST.SUCCESS;\n  END;\n  MEMBER FUNCTION ODCIINDEXCLOSE(env SYS.ODCIEnv) RETURN NUMBER IS\n    cnum INTEGER;\n  BEGIN\n    cnum := SELF.curnum;\n    DBMS_SQL.CLOSE_CURSOR(cnum);\n    RETURN ODCICONST.SUCCESS;\n  END;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Using-Extensible-Indexing-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Using-Extensible-Indexing.html\nCREATE OR REPLACE FUNCTION function_for_position_between\n                           (col NUMBER, lower_pos NUMBER, upper_pos NUMBER,\n                            indexctx IN SYS.ODCIIndexCtx,\n                            scanctx IN OUT position_im,\n                            scanflg IN NUMBER)\nRETURN NUMBER AS\n  rid              ROWID;\n  storage_tab_name VARCHAR2(65);\n  lower_bound_stmt VARCHAR2(2000);\n  upper_bound_stmt VARCHAR2(2000);\n  col_val_stmt     VARCHAR2(2000);\n  lower_bound      NUMBER;\n  upper_bound      NUMBER;\n  column_value     NUMBER;\nBEGIN\n  IF (indexctx.IndexInfo IS NOT NULL) THEN\n    storage_tab_name := indexctx.IndexInfo.INDEXSCHEMA || '.' ||\n                        indexctx.IndexInfo.INDEXNAME || '_STORAGE_TAB';\n    IF (scanctx IS NULL) THEN\n/* This is the first call. Open a cursor for future calls.\n   First, do some error checking\n*/\n      IF (lower_pos > upper_pos) THEN\n        RAISE_APPLICATION_ERROR(-20101,\n          'Upper Position must be greater than or equal to Lower Position');\n      END IF;\n      IF (lower_pos <= 0) THEN\n        RAISE_APPLICATION_ERROR(-20101,\n          'Both Positions must be greater than zero');\n      END IF;\n/* Obtain the upper and lower value bounds for the range we're interested in.\n*/\n      upper_bound_stmt := 'Select MIN(col_val) FROM (Select /*+ INDEX_DESC(' ||\n                        storage_tab_name || ') */ DISTINCT ' ||\n                        'col_val FROM ' || storage_tab_name || ' ORDER BY ' ||\n                        'col_val DESC) WHERE rownum <= ' || lower_pos;\n      EXECUTE IMMEDIATE upper_bound_stmt INTO upper_bound;\n      IF (lower_pos != upper_pos) THEN\n        lower_bound_stmt := 'Select MIN(col_val) FROM (Select /*+ INDEX_DESC(' ||\n                            storage_tab_name || ') */ DISTINCT ' ||\n                            'col_val FROM ' || storage_tab_name ||\n                            ' WHERE col_val < ' || upper_bound || ' ORDER BY ' ||\n                            'col_val DESC) WHERE rownum <= ' ||\n                            (upper_pos - lower_pos);\n        EXECUTE IMMEDIATE lower_bound_stmt INTO lower_bound;\n      ELSE\n        lower_bound := upper_bound;\n      END IF;\n      IF (lower_bound IS NULL) THEN\n        lower_bound := upper_bound;\n      END IF;\n/* Store the lower and upper bounds for future function invocations for\n   the positions.\n*/\n      scanctx := position_im(0, 0, lower_bound, upper_bound);\n    END IF;\n/* Fetch the column value corresponding to the rowid, and see if it falls\n   within the determined range.\n*/\n    col_val_stmt := 'Select col_val FROM ' || storage_tab_name ||\n                    ' WHERE base_rowid = ''' || indexctx.Rid || '''';\n    EXECUTE IMMEDIATE col_val_stmt INTO column_value;\n    IF (column_value <= scanctx.upper_bound AND\n        column_value >= scanctx.lower_bound AND\n        scanflg = ODCICONST.RegularCall) THEN\n      RETURN 1;\n    ELSE\n      RETURN 0;\n    END IF;\n  ELSE\n    RAISE_APPLICATION_ERROR(-20101, 'A column that has a domain index of' ||\n                            'Position indextype must be the first argument');\n  END IF;\nEND;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Using-Extensible-Indexing-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Using-Extensible-Indexing.html\nCREATE OR REPLACE OPERATOR position_between\n   BINDING (NUMBER, NUMBER, NUMBER) RETURN NUMBER \n   WITH INDEX CONTEXT, SCAN CONTEXT position_im\n   USING function_for_position_between;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Using-Extensible-Indexing-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Using-Extensible-Indexing.html\nCREATE INDEXTYPE position_indextype\n   FOR position_between(NUMBER, NUMBER, NUMBER)\n   USING position_im;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Using-Extensible-Indexing-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Using-Extensible-Indexing.html\nCREATE INDEX salary_index ON employees(salary) \n   INDEXTYPE IS position_indextype;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Using-Extensible-Indexing-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Using-Extensible-Indexing.html\nSELECT last_name, salary FROM employees\n   WHERE position_between(salary, 10, 20)=1\n   ORDER BY salary DESC, last_name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Using-XML-in-SQL-Statements-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Using-XML-in-SQL-Statements.html\nCREATE TABLE xwarehouses OF XMLTYPE\n  XMLTYPE STORE AS CLOB;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Using-XML-in-SQL-Statements-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Using-XML-in-SQL-Statements.html\nINSERT INTO xwarehouses VALUES \n  (xmltype('<?xml version=\"1.0\"?>\n  <Warehouse>\n    <WarehouseId>1</WarehouseId>\n    <WarehouseName>Southlake, Texas</WarehouseName>\n    <Building>Owned</Building>\n    <Area>25000</Area>\n    <Docks>2</Docks>\n    <DockType>Rear load</DockType>\n    <WaterAccess>true</WaterAccess>\n    <RailAccess>N</RailAccess>\n    <Parking>Street</Parking>\n    <VClearance>10</VClearance>\n  </Warehouse>'));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Using-XML-in-SQL-Statements-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Using-XML-in-SQL-Statements.html\nSELECT e.getClobVal() FROM xwarehouses e;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Using-XML-in-SQL-Statements-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Using-XML-in-SQL-Statements.html\nbegin\n dbms_xmlschema.registerSchema(\n  'http://www.example.com/xwarehouses.xsd',  \n  '<schema xmlns=\"http://www.w3.org/2001/XMLSchema\" \n       targetNamespace=\"http://www.example.com/xwarehouses.xsd\" \n       xmlns:who=\"http://www.example.com/xwarehouses.xsd\"\n       version=\"1.0\">\n\n  <simpleType name=\"RentalType\">\n   <restriction base=\"string\">\n    <enumeration value=\"Rented\"/>\n    <enumeration value=\"Owned\"/>\n   </restriction>\n  </simpleType>\n\n  <simpleType name=\"ParkingType\">\n   <restriction base=\"string\">\n    <enumeration value=\"Street\"/>\n    <enumeration value=\"Lot\"/>\n   </restriction>\n  </simpleType>\n\n  <element name = \"Warehouse\">\n    <complexType>\n     <sequence>\n      <element name = \"WarehouseId\"   type = \"positiveInteger\"/>\n      <element name = \"WarehouseName\" type = \"string\"/>\n      <element name = \"Building\"      type = \"who:RentalType\"/>\n      <element name = \"Area\"          type = \"positiveInteger\"/>\n      <element name = \"Docks\"         type = \"positiveInteger\"/>\n      <element name = \"DockType\"      type = \"string\"/>\n      <element name = \"WaterAccess\"   type = \"boolean\"/>\n      <element name = \"RailAccess\"    type = \"boolean\"/>\n      <element name = \"Parking\"       type = \"who:ParkingType\"/>\n      <element name = \"VClearance\"    type = \"positiveInteger\"/>\n     </sequence>\n    </complexType>\n  </element>\n</schema>',\n   TRUE, TRUE, FALSE, FALSE);\nend;\n/"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Using-XML-in-SQL-Statements-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Using-XML-in-SQL-Statements.html\nCREATE TABLE xwarehouses OF XMLTYPE\n   XMLSCHEMA \"http://www.example.com/xwarehouses.xsd\"\n   ELEMENT \"Warehouse\";"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Using-XML-in-SQL-Statements-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Using-XML-in-SQL-Statements.html\nINSERT INTO xwarehouses VALUES(   xmltype.createxml('<?xml version=\"1.0\"?>\n   <who:Warehouse xmlns:who=\"http://www.example.com/xwarehouses.xsd\" \n   xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" \n   xsi:schemaLocation=\"http://www.example.com/xwarehouses.xsd\n   http://www.example.com/xwarehouses.xsd\">\n      <WarehouseId>1</WarehouseId>\n      <WarehouseName>Southlake, Texas</WarehouseName>\n      <Building>Owned</Building>\n      <Area>25000</Area>\n      <Docks>2</Docks>\n      <DockType>Rear load</DockType>\n      <WaterAccess>true</WaterAccess>\n      <RailAccess>false</RailAccess>\n      <Parking>Street</Parking>\n      <VClearance>10</VClearance>\n      </who:Warehouse>'));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Using-XML-in-SQL-Statements-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Using-XML-in-SQL-Statements.html\nALTER TABLE xwarehouses ADD (PRIMARY KEY(XMLDATA.\"WarehouseId\"));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Using-XML-in-SQL-Statements-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Using-XML-in-SQL-Statements.html\nSELECT * FROM xwarehouses x \n   WHERE EXISTSNODE(VALUE(x), '/Warehouse[WarehouseId=\"1\"]',\n   'xmlns:who=\"http://www.example.com/xwarehouses.xsd\"') = 1;\nSELECT * FROM xwarehouses x\n   WHERE EXTRACTVALUE(VALUE(x), '/Warehouse/WarehouseId',\n   'xmlns:who=\"http://www.example.com/xwarehouses.xsd\"') = 1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Using-XML-in-SQL-Statements-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Using-XML-in-SQL-Statements.html\nCREATE TABLE xwarehouses (\n   warehouse_id        NUMBER,\n   warehouse_spec      XMLTYPE)\n   XMLTYPE warehouse_spec STORE AS CLOB\n   (TABLESPACE example\n    STORAGE (INITIAL 6144)\n    CHUNK 4000\n    NOCACHE LOGGING);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/Using-XML-in-SQL-Statements-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Using-XML-in-SQL-Statements.html\nCREATE TABLE xwarehouses (\n   warehouse_id    NUMBER,\n   warehouse_spec  XMLTYPE)\n   XMLTYPE warehouse_spec STORE AS OBJECT RELATIONAL\n      XMLSCHEMA \"http://www.example.com/xwarehouses.xsd\"\n      ELEMENT \"Warehouse\";"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/VALIDATE_CONVERSION-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/VALIDATE_CONVERSION.html\nSELECT VALIDATE_CONVERSION(1000 AS BINARY_DOUBLE)\n  FROM DUAL;\nSELECT VALIDATE_CONVERSION('1234.56' AS BINARY_FLOAT)\n  FROM DUAL;\nSELECT VALIDATE_CONVERSION('July 20, 1969, 20:18' AS DATE,\n    'Month dd, YYYY, HH24:MI', 'NLS_DATE_LANGUAGE = American')\n  FROM DUAL;\nSELECT VALIDATE_CONVERSION('200 00:00:00' AS INTERVAL DAY TO SECOND)\n  FROM DUAL;\nSELECT VALIDATE_CONVERSION('P1Y2M' AS INTERVAL YEAR TO MONTH)\n  FROM DUAL;\nSELECT VALIDATE_CONVERSION('$100,00' AS NUMBER,\n    '$999D99', 'NLS_NUMERIC_CHARACTERS = '',.''')\n  FROM DUAL;\nSELECT VALIDATE_CONVERSION('29-Jan-02 17:24:00' AS TIMESTAMP,\n    'DD-MON-YY HH24:MI:SS')\n  FROM DUAL;\nSELECT VALIDATE_CONVERSION('1999-12-01 11:00:00 -8:00'\n    AS TIMESTAMP WITH TIME ZONE, 'YYYY-MM-DD HH:MI:SS TZH:TZM')\n  FROM DUAL;\nSELECT VALIDATE_CONVERSION('11-May-16 17:30:00'\n    AS TIMESTAMP WITH LOCAL TIME ZONE, 'DD-MON-YY HH24:MI:SS')\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/VALIDATE_CONVERSION-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/VALIDATE_CONVERSION.html\nSELECT VALIDATE_CONVERSION('$29.99' AS BINARY_FLOAT)\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/VALIDATE_CONVERSION-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/VALIDATE_CONVERSION.html\nSELECT VALIDATE_CONVERSION('$29.99' AS BINARY_FLOAT, '$99D99')\n  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/VALUE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/VALUE.html\nSELECT VALUE(p) FROM persons p;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/VARIANCE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/VARIANCE.html\nSELECT VARIANCE(salary) \"Variance\"\n   FROM employees;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/VARIANCE-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/VARIANCE.html\nSELECT last_name, salary, VARIANCE(salary) \n      OVER (ORDER BY hire_date) \"Variance\"\n   FROM employees \n   WHERE department_id = 30\n   ORDER BY last_name, salary, \"Variance\";"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/VAR_POP-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/VAR_POP.html\nSELECT VAR_POP(salary) FROM employees;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/VAR_POP-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/VAR_POP.html\nSELECT t.calendar_month_desc,\n   VAR_POP(SUM(s.amount_sold)) \n      OVER (ORDER BY t.calendar_month_desc) \"Var_Pop\",\n   VAR_SAMP(SUM(s.amount_sold)) \n      OVER (ORDER BY t.calendar_month_desc) \"Var_Samp\" \n  FROM sales s, times t\n  WHERE s.time_id = t.time_id AND t.calendar_year = 1998\n  GROUP BY t.calendar_month_desc\n  ORDER BY t.calendar_month_desc, \"Var_Pop\", \"Var_Samp\";"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/VAR_SAMP-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/VAR_SAMP.html\nSELECT VAR_SAMP(salary) FROM employees;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/VSIZE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/VSIZE.html\nSELECT last_name, VSIZE (last_name) \"BYTES\"      \n  FROM employees\n  WHERE department_id = 10\n  ORDER BY employee_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/WIDTH_BUCKET-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/WIDTH_BUCKET.html\nSELECT customer_id, cust_last_name, credit_limit, \n   WIDTH_BUCKET(credit_limit, 100, 5000, 10) \"Credit Group\"\n   FROM customers WHERE nls_territory = 'SWITZERLAND'\n   ORDER BY \"Credit Group\", customer_id, cust_last_name, credit_limit;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/XML-Conditions-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/XML-Conditions.html\nSELECT ANY_PATH FROM RESOURCE_VIEW\n   WHERE EQUALS_PATH(res, '/sys/schemas/OE/www.example.com')=1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/XML-Conditions-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/XML-Conditions.html\nSELECT ANY_PATH FROM RESOURCE_VIEW\n   WHERE UNDER_PATH(res, '/sys/schemas/OE/www.example.com')=1;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/XMLAGG-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/XMLAGG.html\nSELECT XMLELEMENT(\"Department\",\n   XMLAGG(XMLELEMENT(\"Employee\", \n   e.job_id||' '||e.last_name)\n   ORDER BY last_name))\n   as \"Dept_list\"     \n   FROM employees e\n   WHERE e.department_id = 30;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/XMLAGG-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/XMLAGG.html\nSELECT XMLELEMENT(\"Department\",\n      XMLAGG(XMLELEMENT(\"Employee\", e.job_id||' '||e.last_name)))\n   AS \"Dept_list\"\n   FROM employees e\n   GROUP BY e.department_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/XMLCDATA-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/XMLCDATA.html\nSELECT XMLELEMENT(\"PurchaseOrder\",\n   XMLAttributes(dummy as \"pono\"),\n   XMLCdata('<!DOCTYPE po_dom_group [\n   <!ELEMENT po_dom_group(student_name)*>\n   <!ELEMENT po_purch_name (#PCDATA)>\n   <!ATTLIST po_name po_no ID #REQUIRED>\n   <!ATTLIST po_name trust_1 IDREF #IMPLIED>\n   <!ATTLIST po_name trust_2 IDREF #IMPLIED>\n   ]>')) \"XMLCData\" FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/XMLCOLATTVAL-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/XMLCOLATTVAL.html\nSELECT XMLELEMENT(\"Emp\",\n   XMLCOLATTVAL(e.employee_id, e.last_name, e.salary)) \"Emp Element\"\n   FROM employees e\n   WHERE employee_id = 204;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/XMLCOMMENT-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/XMLCOMMENT.html\nSELECT XMLCOMMENT('OrderAnalysisComp imported, reconfigured, disassembled')\n   AS \"XMLCOMMENT\" FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/XMLCONCAT-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/XMLCONCAT.html\nSELECT XMLCONCAT(XMLELEMENT(\"First\", e.first_name),\n   XMLELEMENT(\"Last\", e.last_name)) AS \"Result\"\n   FROM employees e\n   WHERE e.employee_id > 202;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/XMLDATA-Pseudocolumn-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/XMLDATA-Pseudocolumn.html\nCREATE TABLE xml_lob_tab of XMLTYPE\n  XMLTYPE STORE AS CLOB;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/XMLDATA-Pseudocolumn-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/XMLDATA-Pseudocolumn.html\nALTER TABLE xml_lob_tab\n  MODIFY LOB (XMLDATA) (STORAGE (MAXSIZE 2G) CACHE);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/XMLDATA-Pseudocolumn-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/XMLDATA-Pseudocolumn.html\nALTER TABLE xwarehouses\n  ADD (UNIQUE(XMLDATA.\"WarehouseId\"));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/XMLDIFF-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/XMLDIFF.html\nSELECT XMLDIFF(\nXMLTYPE('<?xml version=\"1.0\"?>\n<bk:book xmlns:bk=\"http://example.com\">\n   <bk:tr>\n        <bk:td>\n                <bk:chapter>\n                        Chapter 1.\n                </bk:chapter>\n        </bk:td>\n        <bk:td>\n                 <bk:chapter>\n                        Chapter 2.\n                </bk:chapter>\n        </bk:td>\n   </bk:tr>\n</bk:book>'),\nXMLTYPE('<?xml version=\"1.0\"?>\n<bk:book xmlns:bk=\"http://example.com\">\n   <bk:tr>\n        <bk:td>\n                <bk:chapter>\n                        Chapter 1.\n                </bk:chapter>\n        </bk:td>\n        <bk:td/>\n   </bk:tr>\n</bk:book>')\n)\nFROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/XMLELEMENT-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/XMLELEMENT.html\nSELECT XMLELEMENT(\"Emp\", XMLELEMENT(\"Name\", \n   e.job_id||' '||e.last_name),\n   XMLELEMENT(\"Hiredate\", e.hire_date)) as \"Result\"\n   FROM employees e WHERE employee_id > 200;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/XMLELEMENT-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/XMLELEMENT.html\nSELECT XMLELEMENT(\"Emp\",\n      XMLATTRIBUTES(e.employee_id AS \"ID\", e.last_name),\n      XMLELEMENT(\"Dept\", e.department_id),\n      XMLELEMENT(\"Salary\", e.salary)) AS \"Emp Element\"\n   FROM employees e\n   WHERE e.employee_id = 206;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/XMLELEMENT-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/XMLELEMENT.html\nSELECT XMLELEMENT(\"Emp\", XMLATTRIBUTES(e.employee_id, e.last_name),\n   XMLELEMENT(\"Dept\", XMLATTRIBUTES(e.department_id,\n   (SELECT d.department_name FROM departments d\n   WHERE d.department_id = e.department_id) as \"Dept_name\")),\n   XMLELEMENT(\"salary\", e.salary),\n   XMLELEMENT(\"Hiredate\", e.hire_date)) AS \"Emp Element\"\n   FROM employees e\n   WHERE employee_id = 205;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/XMLFOREST-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/XMLFOREST.html\nSELECT XMLELEMENT(\"Emp\", \n   XMLFOREST(e.employee_id, e.last_name, e.salary))\n   \"Emp Element\"\n   FROM employees e WHERE employee_id = 204;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/XMLPARSE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/XMLPARSE.html\nSELECT XMLPARSE(CONTENT '124 <purchaseOrder poNo=\"12435\"> \n   <customerName> Acme Enterprises</customerName>\n   <itemNo>32987457</itemNo>\n   </purchaseOrder>' \nWELLFORMED) AS PO FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/XMLPATCH-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/XMLPATCH.html\nSELECT XMLPATCH(\nXMLTYPE('<?xml version=\"1.0\"?>\n<bk:book xmlns:bk=\"http://example.com\">\n   <bk:tr>\n        <bk:td>\n                <bk:chapter>\n                        Chapter 1.\n                </bk:chapter>\n        </bk:td>\n        <bk:td>\n                 <bk:chapter>\n                        Chapter 2.\n                </bk:chapter>\n        </bk:td>\n   </bk:tr>\n</bk:book>'),\nXMLTYPE('<?xml version=\"1.0\"?>\n<xd:xdiff xsi:schemaLocation=\"http://xmlns.oracle.com/xdb/xdiff.xsd\n  http://xmlns.oracle.com/xdb/xdiff.xsd\"\n  xmlns:xd=\"http://xmlns.oracle.com/xdb/xdiff.xsd\"\n  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n  xmlns:bk=\"http://example.com\">\n  <?oracle-xmldiff operations-in-docorder=\"true\" output-model=\"snapshot\"\n    diff-algorithm=\"global\"?>\n  <xd:delete-node xd:node-type=\"element\"\n   xd:xpath=\"/bk:book[1]/bk:tr[1]/bk:td[2]/bk:chapter[1]\"/>\n</xd:xdiff>')\n)\nFROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/XMLPI-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/XMLPI.html\nSELECT XMLPI(NAME \"Order analysisComp\", 'imported, reconfigured, disassembled')\n   AS \"XMLPI\" FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/XMLQUERY-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/XMLQUERY.html\nSELECT warehouse_name,\nEXTRACTVALUE(warehouse_spec, '/Warehouse/Area'),\nXMLQuery(\n   'for $i in /Warehouse\n   where $i/Area > 50000\n   return <Details>\n             <Docks num=\"{$i/Docks}\"/>\n             <Rail>\n               {\n               if ($i/RailAccess = \"Y\") then \"true\" else \"false\"\n               }\n             </Rail>\n          </Details>' PASSING warehouse_spec RETURNING CONTENT) \"Big_warehouses\"\n   FROM warehouses;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/XMLSEQUENCE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/XMLSEQUENCE.html\nSELECT EXTRACT(warehouse_spec, '/Warehouse') as \"Warehouse\"\n   FROM warehouses WHERE warehouse_name = 'San Francisco';\nSELECT VALUE(p)\n   FROM warehouses w, \n   TABLE(XMLSEQUENCE(EXTRACT(warehouse_spec, '/Warehouse/*'))) p\n   WHERE w.warehouse_name = 'San Francisco';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/XMLSERIALIZE-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/XMLSERIALIZE.html\nSELECT XMLSERIALIZE(CONTENT XMLTYPE('<Owner>Grandco</Owner>')) AS xmlserialize_doc\n   FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/XMLTABLE-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/XMLTABLE.html\nSELECT warehouse_name warehouse,\n   warehouse2.\"Water\", warehouse2.\"Rail\"\n   FROM warehouses,\n   XMLTABLE('/Warehouse'\n      PASSING warehouses.warehouse_spec\n      COLUMNS \n         \"Water\" varchar2(6) PATH 'WaterAccess',\n         \"Rail\" varchar2(6) PATH 'RailAccess') \n      warehouse2;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/XMLTRANSFORM-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/XMLTRANSFORM.html\nCREATE TABLE xsl_tab (col1 XMLTYPE);\nINSERT INTO xsl_tab VALUES (\n   XMLTYPE.createxml(\n   '<?xml version=\"1.0\"?> \n    <xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" >\n      <xsl:output encoding=\"utf-8\"/>\n      <!-- alphabetizes an xml tree -->  \n      <xsl:template match=\"*\">  \n        <xsl:copy>\n          <xsl:apply-templates select=\"*|text()\">\n            <xsl:sort select=\"name(.)\" data-type=\"text\" order=\"ascending\"/>\n          </xsl:apply-templates> \n        </xsl:copy> \n      </xsl:template>\n      <xsl:template match=\"text()\"> \n        <xsl:value-of select=\"normalize-space(.)\"/>\n      </xsl:template>\n    </xsl:stylesheet>  '));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/XMLTRANSFORM-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/XMLTRANSFORM.html\nSELECT XMLTRANSFORM(w.warehouse_spec, x.col1).GetClobVal()\n   FROM warehouses w, xsl_tab x\n   WHERE w.warehouse_name = 'San Francisco';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/alter-domain-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/alter-domain.html\nALTER DOMAIN day_of_week\n      MODIFY DISPLAY LOWER(day_of_week);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/alter-domain-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/alter-domain.html\nALTER DOMAIN day_of_week\n      DROP DISPLAY;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/alter-domain-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/alter-domain.html\nALTER DOMAIN day_of_week\n      ADD DISPLAY INITCAP(day_of_week);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/alter-domain-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/alter-domain.html\nALTER DOMAIN year_of_birth\n      MODIFY ORDER MOD(year_of_birth,100);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/alter-domain-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/alter-domain.html\nALTER DOMAIN year_of_birth\n      DROP ORDER;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/alter-domain-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/alter-domain.html\nALTER DOMAIN year_of_birth\n      ADD ORDER FLOOR(year_of_birth/100);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/alter-domain-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/alter-domain.html\nALTER DOMAIN day_of_week\n      ANNOTATIONS(Display 'Day of week');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/alter-mle-env-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/alter-mle-env.html\nALTER MLE ENV scott.\"myenv\" SET LANGUAGE OPTIONS 'js.strict=\ntrue ';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/alter-mle-module-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/alter-mle-module.html\nALTER MLE MODULE myMLEModule \nSET METADATA USING CLOB (\nSELECT JSON(\n  '{\n       \"name\": \"value\",\n       \"version\": \"1.2.0\",\n       \"commitHash\": \"23fas4h\",\n       \"projectName\": \"Database Backend\"\n  }')\n)"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/analytic-view-measure-expressions-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/analytic-view-measure-expressions.html\nSELECT geography_hier.member_name AS \"Region\", \n       units AS \"Units\", \n       units_geog_rank_level AS \"Rank\"\n  FROM ANALYTIC VIEW (\n    USING sales_av HIERARCHIES (geography_hier)\n    ADD MEASURES (\n      units_geog_rank_level AS (\n        RANK() OVER (\n          HIERARCHY geography_hier\n          ORDER BY units desc nulls last\n          WITHIN LEVEL))\n    )\n  )\n  WHERE geography_hier.level_name IN ('REGION')\n  ORDER BY units_geog_rank_level;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/annotations_clause-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/annotations_clause.html\nCREATE TABLE t1 (T NUMBER) ANNOTATIONS(Operations '[\"Sort\", \"Group\"]', Hidden);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/annotations_clause-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/annotations_clause.html\nCREATE TABLE t1 (T NUMBER) ANNOTATIONS (ADD Hidden);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/annotations_clause-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/annotations_clause.html\nALTER TABLE t1 ANNOTATIONS(DROP Operations, DROP Hidden);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/annotations_clause-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/annotations_clause.html\nCREATE TABLE t1 (T NUMBER ANNOTATIONS(Operations 'Sort' , Hidden) );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/annotations_clause-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/annotations_clause.html\nCREATE TABLE employee (\n  id NUMBER(5)\n    ANNOTATIONS(Identity, Display 'Employee ID', \"Group\" 'Emp_Info'),\n  ename VARCHAR2(50)\n    ANNOTATIONS(Display 'Employee Name', \"Group\" 'Emp_Info'),\n  sal NUMBER\n    ANNOTATIONS(Display 'Employee Salary', UI_Hidden)\n) ANNOTATIONS (Display 'Employee Table');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/annotations_clause-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/annotations_clause.html\nALTER TABLE employee\n  MODIFY ename ANNOTATIONS (\n    DROP \"Group\",\n    DROP IF EXISTS missing_annotation,\n    REPLACE Display 'Emp name'\n  );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/boolean_and_agg-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/boolean_and_agg.html\nSELECT BOOLEAN_AND_AGG(c2)\n    FROM t;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/boolean_and_agg-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/boolean_and_agg.html\nSELECT BOOLEAN_AND_AGG(c2)\n    FROM t\n    WHERE c1 = 0;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/boolean_and_agg-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/boolean_and_agg.html\nSELECT BOOLEAN_AND_AGG(c2)\n    FROM t\n    WHERE c2 IS FALSE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/boolean_and_agg-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/boolean_and_agg.html\nSELECT BOOLEAN_AND_AGG(c2)\n    FROM t\n    WHERE c2 IS FALSE OR c2 IS NULL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/boolean_and_agg-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/boolean_and_agg.html\nSELECT BOOLEAN_AND_AGG(c2)\n    FROM t\n    WHERE c2 IS NOT TRUE OR c2 IS NULL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/boolean_and_agg-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/boolean_and_agg.html\nSELECT BOOLEAN_AND_AGG(c2)\n    FROM t\n    WHERE c2 IS NOT FALSE OR c2 IS NULL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/boolean_and_agg-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/boolean_and_agg.html\nSELECT BOOLEAN_AND_AGG(c2 OR c2 OR (c2))\n    FROM t\n    WHERE c2 IS NOT FALSE OR c2 IS NULL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/boolean_or_agg-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/boolean_or_agg.html\nSELECT BOOLEAN_OR_AGG(c2)\n    FROM t;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/boolean_or_agg-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/boolean_or_agg.html\nSELECT BOOLEAN_OR_AGG(c2)\n    FROM t\n    WHERE c1 = 0;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/boolean_or_agg-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/boolean_or_agg.html\nSELECT BOOLEAN_OR_AGG(c2)\n    FROM t\n    WHERE c2 IS TRUE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/boolean_or_agg-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/boolean_or_agg.html\nSELECT BOOLEAN_OR_AGG(c2)\n    FROM t\n    WHERE c2 IS TRUE OR c2 IS NULL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/boolean_or_agg-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/boolean_or_agg.html\nSELECT BOOLEAN_OR_AGG(c2)\n    FROM t\n    WHERE c2 IS NOT FALSE OR c2 IS NULL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/boolean_or_agg-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/boolean_or_agg.html\nSELECT BOOLEAN_OR_AGG(c2)\n    FROM t\n    WHERE c2 IS NOT TRUE OR c2 IS NULL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/boolean_or_agg-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/boolean_or_agg.html\nSELECT BOOLEAN_OR_AGG(c2 OR c2)\n    FROM t\n    WHERE c2 IS NOT TRUE OR c2 IS NULL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ceil-datetime-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ceil-datetime.html\nALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ceil-datetime-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ceil-datetime.html\nSELECT CEIL(TO_DATE ('28-FEB-2023','DD-MON-YYYY'), 'MM') AS month_ceiling;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ceil-datetime-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ceil-datetime.html\nSELECT CEIL(TO_TIMESTAMP ('28-FEB-2023 14:10:10','DD-MON-YYYY HH24:MI:SS'),'HH24') AS hour_ceiling;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ceil-interval-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ceil-interval.html\nSELECT CEIL(INTERVAL '+123-5' YEAR(3) TO MONTH) AS year_ceil;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ceil-interval-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ceil-interval.html\nSELECT CEIL(INTERVAL '+99-11' YEAR(2) TO MONTH, 'YEAR');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ceil-interval-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ceil-interval.html\nSELECT CEIL(INTERVAL '+999999999-11' YEAR(9) TO MONTH, 'YEAR') AS year_ceil;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ceil-interval-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ceil-interval.html\nSELECT CEIL(INTERVAL '+4 12:42:10.222' DAY(2) TO SECOND(3), 'DD') AS day_ceil;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/con_id_to_con_name-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/con_id_to_con_name.html\nSELECT CON_ID, NAME FROM V$CONTAINERS;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/con_id_to_con_name-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/con_id_to_con_name.html\nSELECT CON_ID_TO_CON_NAME(4) \"CON_NAME\" FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/con_id_to_dbid-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/con_id_to_dbid.html\nSELECT CON_ID, NAME, DBID FROM V$CONTAINERS;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/con_id_to_dbid-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/con_id_to_dbid.html\nSELECT CON_ID_TO_DBID(4) FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/con_id_to_guid-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/con_id_to_guid.html\nSELECT CON_ID, NAME, GUID FROM V$CONTAINERS;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/con_id_to_guid-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/con_id_to_guid.html\nSELECT CON_ID_TO_GUID(4) \"CON_GUID\" FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/con_id_to_uid-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/con_id_to_uid.html\nSELECT CON_ID, NAME, CON_UID FROM V$CONTAINERS;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/con_id_to_uid-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/con_id_to_uid.html\nSELECT CON_ID_TO_UID(4) \"PDB_UID\" FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/constraint-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/constraint.html\nCREATE TABLE promotions_var1\n    ( promo_id         NUMBER(6)\n                       CONSTRAINT promo_id_u  UNIQUE\n    , promo_name       VARCHAR2(20)\n    , promo_category   VARCHAR2(15)\n    , promo_cost       NUMBER(10,2)\n    , promo_begin_date DATE\n    , promo_end_date   DATE\n    ) ;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/constraint-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/constraint.html\nCREATE TABLE promotions_var2\n    ( promo_id         NUMBER(6)\n    , promo_name       VARCHAR2(20)\n    , promo_category   VARCHAR2(15)\n    , promo_cost       NUMBER(10,2)\n    , promo_begin_date DATE\n    , promo_end_date   DATE\n    , CONSTRAINT promo_id_u UNIQUE (promo_id)\n   USING INDEX PCTFREE 20\n      TABLESPACE stocks\n      STORAGE (INITIAL 8M) );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/constraint-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/constraint.html\nALTER TABLE dept_20\n   ADD CONSTRAINT fk_empid_hiredate\n   FOREIGN KEY (employee_id, hire_date)\n   REFERENCES hr.job_history(employee_id, start_date)\n   EXCEPTIONS INTO wrong_emp;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/constraint-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/constraint.html\nCREATE TABLE divisions  \n   (div_no    NUMBER  CONSTRAINT check_divno\n              CHECK (div_no BETWEEN 10 AND 99) \n              DISABLE, \n    div_name  VARCHAR2(9)  CONSTRAINT check_divname\n              CHECK (div_name = UPPER(div_name)) \n              DISABLE, \n    office    VARCHAR2(10)  CONSTRAINT check_office\n              CHECK (office IN ('DALLAS','BOSTON',\n              'PARIS','TOKYO')) \n              DISABLE);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/constraint-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/constraint.html\nCREATE TABLE dept_20\n   (employee_id     NUMBER(4) PRIMARY KEY, \n    last_name       VARCHAR2(10), \n    job_id          VARCHAR2(9), \n    manager_id      NUMBER(4), \n    salary          NUMBER(7,2), \n    commission_pct  NUMBER(7,2), \n    department_id   NUMBER(2),\n    CONSTRAINT check_sal CHECK (salary * commission_pct <= 5000));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/constraint-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/constraint.html\nCREATE TABLE order_detail \n  (CONSTRAINT pk_od PRIMARY KEY (order_id, part_no), \n   order_id    NUMBER \n      CONSTRAINT fk_oid \n         REFERENCES oe.orders(order_id), \n   part_no     NUMBER \n      CONSTRAINT fk_pno \n         REFERENCES oe.product_information(product_id), \n   quantity    NUMBER \n      CONSTRAINT nn_qty NOT NULL \n      CONSTRAINT check_qty CHECK (quantity > 0), \n   cost        NUMBER \n      CONSTRAINT check_cost CHECK (cost > 0) );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/constraint-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/constraint.html\nCREATE TABLE Product(\n  Id NUMBER NOT NULL PRIMARY KEY,\n  Name VARCHAR2(50),\n  Price NUMBER CHECK (mod(price,4) = 0 and 10 <> price) PRECHECK,\n  Color NUMBER CHECK (Color >= 10 and Color <=50 and mod(color,2) = 0)\n    PRECHECK,\n  Description VARCHAR2(50) CHECK (Length(Description) <= 40) PRECHECK,\n  Constant NUMBER CHECK (Constant=10) PRECHECK,\n  CONSTRAINT TC1 CHECK (Color > 0 AND Price > 10) PRECHECK,\n  CONSTRAINT TC2 CHECK (CATEGORY IN ('Home', 'Apparel') AND Price > 10)\n);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/constraint-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/constraint.html\nALTER TABLE Product MODIFY (Name VARCHAR2(50) CHECK \n  (regexp_like(Name, '^Product')) PRECHECK);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/constraint-16.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/constraint.html\nALTER TABLE Product MODIFY CONSTRAINT TC2 PRECHECK;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/constraint-17.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/constraint.html\nALTER TABLE Product MODIFY CONSTRAINT TC1 NOPRECHECK;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/constraint-19.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/constraint.html\nSELECT CONSTRAINT_NAME, SEARCH_CONDITION, PRECHECK \n  FROM USER_CONSTRAINTS \n  WHERE table_name='PRODUCT' and constraint_type='C';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/constraint-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/constraint.html\nALTER TABLE warehouses\n   ADD CONSTRAINT wh_unq UNIQUE (warehouse_id, warehouse_name)\n   USING INDEX PCTFREE 5\n   EXCEPTIONS INTO wrong_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/constraint-21.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/constraint.html\nCREATE TABLE products\n    ( product_id VARCHAR2(20) COLLATE BINARY_CI\n           CONSTRAINT product_pk PRIMARY KEY\n    , description VARCHAR2(1000) COLLATE BINARY_CI\n           CONSTRAINT product_description_unq UNIQUE\n    );\nCREATE TABLE product_components\n    ( component_id VARCHAR2(40) COLLATE BINARY_CI\n           CONSTRAINT product_component_pk PRIMARY KEY\n    , product_id CONSTRAINT product_component_fk REFERENCES products(product_id)\n    , description VARCHAR2(1000) COLLATE BINARY_CI\n           CONSTRAINT product_component_descr_unq UNIQUE\n    );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/constraint-22.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/constraint.html\nINSERT INTO products(product_id, description)\n            VALUES('BICY0001', 'Men''s bicycle, fr 21\", wh 24\", gear 3x7');\nINSERT INTO product_components(component_id, product_id, description)\n            VALUES('BICY0001_FRAME01', 'BICY0001', 'Aluminium frame 21\"');\nINSERT INTO product_components(component_id, product_id, description)\n            VALUES('BICY0001_WHEEL01', 'bicy0001', 'Wheels 24\"');\nINSERT INTO product_components(component_id, product_id, description)\n            VALUES('BICY0001_GEAR01', 'Bicy0001', 'Front derailleur 3 chainrings');\nINSERT INTO product_components(component_id, product_id, description)\n            VALUES('BICY0001_gear02', 'BiCy0001', 'Rear derailleur 7 chainrings');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/constraint-23.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/constraint.html\nINSERT INTO products(product_id, description)\n            VALUES('BICY0002', 'MEN''S BICYCLE, fr 21\", wh 24\", gear 3x7');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/constraint-24.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/constraint.html\nINSERT INTO products(component_id, product_id, description)\n            VALUES('bicy0001', 'Women''s bicycle, fr 21\", wh 24\", gear 2x6');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/constraint-25.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/constraint.html\nINSERT INTO product_components(component_id, product_id, description)\n            VALUES('BICY0001_gear03', 'BiCy0001', 'REAR DERAILLEUR 7 CHAINRINGS');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/constraint-26.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/constraint.html\nCREATE TYPE person_name AS OBJECT\n   (first_name VARCHAR2(30), last_name VARCHAR2(30));\n/\nCREATE TABLE students (name person_name, age INTEGER,\n   CHECK (name.first_name IS NOT NULL AND \n          name.last_name IS NOT NULL));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/constraint-27.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/constraint.html\nCREATE TYPE cust_address_typ_new AS OBJECT\n    ( street_address     VARCHAR2(40)\n    , postal_code        VARCHAR2(10)\n    , city               VARCHAR2(30)\n    , state_province     VARCHAR2(10)\n    , country_id         CHAR(2)\n    );\n/\nCREATE TABLE address_table OF cust_address_typ_new;\nCREATE TABLE customer_addresses (\n   add_id NUMBER, \n   address REF cust_address_typ_new\n   SCOPE IS address_table);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/constraint-28.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/constraint.html\nCREATE TABLE customer_addresses (\n   add_id NUMBER,\n   address REF cust_address_typ REFERENCES address_table);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/constraint-29.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/constraint.html\nCREATE TABLE employees_obj\n   ( e_name   VARCHAR2(100),\n     e_number NUMBER,\n     e_dept   REF department_typ SCOPE IS departments_obj_t );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/constraint-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/constraint.html\nCREATE TABLE locations_demo\n    ( location_id    NUMBER(4) CONSTRAINT loc_id_pk PRIMARY KEY\n    , street_address VARCHAR2(40)\n    , postal_code    VARCHAR2(12)\n    , city           VARCHAR2(30)\n    , state_province VARCHAR2(25)\n    , country_id     CHAR(2)\n    ) ;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/constraint-30.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/constraint.html\nCREATE TABLE employees_obj\n   ( e_name   VARCHAR2(100),\n     e_number NUMBER,\n     e_dept   REF department_typ REFERENCES departments_obj_t);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/constraint-31.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/constraint.html\nCREATE TABLE promotions_var3\n    ( promo_id         NUMBER(6)\n    , promo_name       VARCHAR2(20)\n    , promo_category   VARCHAR2(15)\n    , promo_cost       NUMBER(10,2)\n    , promo_begin_date DATE\n    , promo_end_date   DATE\n    , CONSTRAINT promo_id_u UNIQUE (promo_id, promo_cost)\n         USING INDEX (CREATE UNIQUE INDEX promo_ix1\n            ON promotions_var3 (promo_id, promo_cost))\n    , CONSTRAINT promo_id_u2 UNIQUE (promo_cost, promo_id) \n         USING INDEX promo_ix1);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/constraint-32.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/constraint.html\nCREATE TABLE games (scores NUMBER CHECK (scores >= 0));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/constraint-33.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/constraint.html\nCREATE TABLE games\n  (scores NUMBER, CONSTRAINT unq_num UNIQUE (scores)\n   INITIALLY DEFERRED DEFERRABLE);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/constraint-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/constraint.html\nCREATE TABLE locations_demo\n    ( location_id    NUMBER(4) \n    , street_address VARCHAR2(40)\n    , postal_code    VARCHAR2(12)\n    , city           VARCHAR2(30)\n    , state_province VARCHAR2(25)\n    , country_id     CHAR(2)\n    , CONSTRAINT loc_id_pk PRIMARY KEY (location_id));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/constraint-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/constraint.html\nALTER TABLE locations_demo\n   MODIFY (country_id CONSTRAINT country_nn NOT NULL);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/constraint-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/constraint.html\nALTER TABLE sales \n    ADD CONSTRAINT sales_pk PRIMARY KEY (prod_id, cust_id) DISABLE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/constraint-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/constraint.html\nCREATE TABLE dept_20 \n   (employee_id     NUMBER(4), \n    last_name       VARCHAR2(10), \n    job_id          VARCHAR2(9), \n    manager_id      NUMBER(4), \n    hire_date       DATE, \n    salary          NUMBER(7,2), \n    commission_pct  NUMBER(7,2), \n    department_id   CONSTRAINT fk_deptno \n                    REFERENCES departments(department_id) );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/constraint-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/constraint.html\nCREATE TABLE dept_20 \n   (employee_id     NUMBER(4), \n    last_name       VARCHAR2(10), \n    job_id          VARCHAR2(9), \n    manager_id      NUMBER(4), \n    hire_date       DATE, \n    salary          NUMBER(7,2), \n    commission_pct  NUMBER(7,2), \n    department_id, \n   CONSTRAINT fk_deptno \n      FOREIGN  KEY (department_id) \n      REFERENCES  departments(department_id) );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/constraint-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/constraint.html\nCREATE TABLE dept_20 \n   (employee_id     NUMBER(4) PRIMARY KEY, \n    last_name       VARCHAR2(10), \n    job_id          VARCHAR2(9), \n    manager_id      NUMBER(4) CONSTRAINT fk_mgr\n                    REFERENCES employees ON DELETE SET NULL, \n    hire_date       DATE, \n    salary          NUMBER(7,2), \n    commission_pct  NUMBER(7,2), \n    department_id   NUMBER(2)   CONSTRAINT fk_deptno \n                    REFERENCES departments(department_id) \n                    ON DELETE CASCADE );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-domain-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-domain.html\nCREATE DOMAIN US_city AS\n  (\n    name  AS VARCHAR2(30) ANNOTATIONS (Address),\n    state AS VARCHAR2(2) ANNOTATIONS (Address),\n    zip AS NUMBER ANNOTATIONS (Address)\n  )\n  CONSTRAINT City_CK CHECK(state in ('CA','AZ','TX') and zip < 100000)\n  DISPLAY name||', '|| state ||', '||TO_CHAR(zip)\n  ORDER state||', '||TO_CHAR(zip)||', '||name\n  ANNOTATIONS (Title 'Domain Annotation');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-domain-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-domain.html\nCREATE DOMAIN flight_details AS\n  (\n   flight_num AS VARCHAR2(100) NOT NULL,\n   origin AS VARCHAR2(200)\n     CONSTRAINT origin_3_char_c CHECK (LENGTH(origin) = 3),\n   destination AS VARCHAR2(200)\n     CONSTRAINT dest_3_char_c CHECK (LENGTH(destination) = 3)\n  )\n  CONSTRAINT flight_c\n    CHECK\n      (\n        flight_num LIKE '%-%' AND\n        origin IS NOT NULL AND\n        destination IS NOT NULL\n      )\n  CONSTRAINT origin_dest_different_c\n    CHECK (origin <> destination)\n  DISPLAY flight_num||', '||origin||', '||destination\n  ORDER flight_num||destination;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-domain-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-domain.html\nCREATE DOMAIN meals_details AS\n    (\n       restaurant AS VARCHAR2(100) NOT NULL,\n       meal_type AS VARCHAR2(200),\n       diner_count AS NUMBER\n    )\n    CONSTRAINT meals_c\n      CHECK\n       (\n         restaurant IS NOT NULL AND\n         meal_type IN ('Breakfast', 'Lunch', 'Dinner') AND\n         diner_count IS NOT NULL\n       )\n    DISPLAY meal_type||', '||restaurant||', '||diner_count;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-domain-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-domain.html\nCREATE DOMAIN lodging_details AS\n    (\n      hotel AS VARCHAR2(100) NOT NULL,\n      nights_count AS NUMBER\n    )\n    CONSTRAINT lodging_c\n     CHECK (hotel IS NOT NULL AND nights_count > 0)\n    DISPLAY hotel||', '||nights_count;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-domain-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-domain.html\nCREATE FLEXIBLE DOMAIN expense_details (val1, val2, val3, val4)\n    CHOOSE DOMAIN USING (typ VARCHAR2(10))\n    FROM DECODE(typ,\n              'Flight', flight_details(val1, val2, val3),\n              'Meals', meals_details(val1, val2, val4),\n              'Lodging', lodging_details(val1, val4));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-domain-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-domain.html\nCREATE FLEXIBLE DOMAIN expense_details (val1, val2, val3, val4)\n    CHOOSE DOMAIN USING(typ VARCHAR2(10))\n    FROM CASE\n        WHEN typ BETWEEN 'A' AND 'G' THEN flight_details(val1, val2, val3)\n        WHEN typ = 'Meals' THEN meals_details(val1, val2, val4)\n        WHEN typ LIKE 'Lodg%' THEN lodging_details(val1, val4)\n      END;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-domain-16.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-domain.html\nCREATE DOMAIN w2_form AS JSON \n  CONSTRAINT CHECK (VALUE IS JSON VALIDATE USING '{ \n    \"title\": \"W2_form\",\n    \"type\": \"object\",\n    \"properties\": {\n    \"social_security_number\": {\n    \"type\": \"string\",\n    \"description\": \"The person social security number.\"\n   },\n   \"wages\": {\n     \"description\": \"total wages\",\n     \"type\": \"number\",\n     \"minimum\": 0\n   },\n   \"social_security_wages\": {\n     \"type\": \"number\",\n     \"description\": \"wages subject to social security tax\" \n   },\n   \"Federal Income Tax Withheld\": {\n     \"type\": \"number\",\n     \"description\": \"withheld of tax to federal income tax\"\n   },\n   \"Social Security Tax Withheld\": {\n     \"type\": \"number\",\n     \"description\": \"withheld of social security tax\"\n   }\n   },\n   \"required\": [\n     \"social_security_number\", \n     \"wages\", \n     \"Federal Income Tax Withheld\" \n    ]\n   }'\n );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-domain-17.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-domain.html\nCREATE TABLE tax_report(id NUMBER, income JSON DOMAIN w2_form);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-domain-18.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-domain.html\nINSERT INTO tax_report VALUES \n  (1, '{\"wages\": 100, \"social_security_number\": \"111\", \"Federal Income Tax Withheld\":10}'\n   );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-domain-19.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-domain.html\nINSERT INTO tax_report VALUES \n  (2, '{\"wages\": 100}'\n   );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-domain-20.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-domain.html\nCREATE DOMAIN w2_form AS JSON VALIDATE USING '{\n  \"title\": \"W2_form\",\n  \"type\": \"object\",\n  \"properties\": {\n    \"social_security_number\": {\n    \"type\": \"string\",\n    \"description\": \"The person social security number.\"\n  },\n  \"wages\": {\n    \"description\": \"total wages\",\n    \"type\": \"number\",\n    \"minimum\": 0\n  },\n  \"social_security_wages\": {\n    \"type\": \"number\",\n    \"description\": \"wages subject to social security tax\"\n  },\n  \"Federal Income Tax Withheld\": {\n    \"type\": \"number\",\n    \"description\": \"withheld of tax to federal income tax\"\n  },\n  \"Social Security Tax Withheld\": {\n    \"type\": \"number\",\n    \"description\": \"withheld of social security tax\"\n  }\n },\n \"required\": [ \n   \"social_security_number\", \n   \"wages\", \n   \"Federal Income Tax Withheld\"\n  ]\n }';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-domain-21.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-domain.html\nCREATE DOMAIN email AS VARCHAR2(30)  \n    CONSTRAINT EMAIL_C CHECK (REGEXP_LIKE (email, '^(\\S+)\\@(\\S+)\\.(\\S+)$'))\n    DISPLAY '---' || SUBSTR(email, INSTR(email, '@') + 1)\n    ANNOTATIONS(allowed_operations \n'{\n    \"allowed_operations\": {\n        \"title\": \"Allowed operations\",\n        \"operations\": [\n            \"Sort\",\n            \"Group By\",\n            \"Picklist\"\n        ]\n    }\n}');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-domain-22.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-domain.html\nSELECT jt.* FROM user_annotations_usage a,\n  JSON_TABLE (annotation_value,\n    '$.allowed_operations.operations[*]'\n    COLUMNS (value VARCHAR2(50 CHAR) PATH '$')) jt\n  WHERE annotation_name = 'ALLOWED_OPERATIONS'\n  AND object_name = 'EMAIL' ;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-domain-24.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-domain.html\nCREATE DOMAIN temperature AS NUMBER(3)\nANNOTATIONS (display_units '{ \"units\": [\"celsius\", \"fahrenheit\"] }');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-domain-25.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-domain.html\nSELECT jt.* FROM user_annotations_usage,\n  JSON_TABLE(annotation_value, '$.units[*]'\n    COLUMNS (value VARCHAR2(30 CHAR) PATH '$')) jt\n  WHERE annotation_name = 'DISPLAY_UNITS'\n  AND object_name = 'TEMPERATURE';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-domain-27.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-domain.html\nCREATE DOMAIN dj5 AS JSON CONSTRAINT dj5chk\n    CHECK (dj5 IS JSON validate\n          '{\n           \"type\": \"object\",\n           \"properties\": {\n             \"a\": {\n               \"type\": \"number\"\n              }\n           }\n         }'\n    );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-domain-28.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-domain.html\nCREATE TABLE jtab(\n      id   NUMBER PRIMARY KEY,\n     jcol JSON DOMAIN dj5\n    );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-domain-29.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-domain.html\nCREATE DOMAIN order_status AS\n  ENUM (\n    New ,     \n    Open ,\n    Shipped ,\n    Closed ,\n    Cancelled\n  );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-domain-30.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-domain.html\nSELECT * FROM order_status;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-domain-32.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-domain.html\nCREATE TABLE orders ( \n     id      NUMBER,\n     cust    VARCHAR2(100),\n     status  ORDER_STATUS\n);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-domain-33.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-domain.html\nDESCRIBE orders;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-domain-35.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-domain.html\nINSERT INTO orders VALUES\n  (1, 'Costco', order_status.open ),\n  (2, 'BMW', order_status.closed ),\n  (3, 'Nestle', order_status.shipped );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-domain-36.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-domain.html\nSELECT ID, DOMAIN_DISPLAY(STATUS) FROM orders;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-domain-38.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-domain.html\nSELECT ID, STATUS FROM orders;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-domain-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-domain.html\nCREATE DOMAIN day_of_week AS CHAR(3 CHAR)\n   CONSTRAINT day_of_week_c\n     CHECK (UPPER(VALUE) IN ('MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN'))\n   DEFERRABLE INITIALLY DEFERRED\n   DISPLAY SUBSTR(VALUE, 1, 2);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-domain-40.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-domain.html\nUPDATE orders SET STATUS = 2 WHERE STATUS = 5;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-domain-41.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-domain.html\nSELECT 2 * ORDER_STATUS.CANCELLED;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-domain-43.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-domain.html\nCREATE DOMAIN days_of_week AS\n  ENUM (\n    Sunday     = Su  = 0,     \n    Monday     = Mo,\n    Tuesday    = Tu,\n    Wednesday  = We,\n    Thursday   = Th,\n    Friday     = Fr,\n    Saturday   = Sa\n  );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-domain-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-domain.html\nCREATE DOMAIN year_of_birth AS NUMBER(4)\n      CONSTRAINT CHECK ( (trunc(year_of_birth) = year_of_birth) and (year_of_birth >= 1900) ) \n      DISPLAY (CASE WHEN year_of_birth < 2000 THEN '19-' ELSE '20-' END) || MOD(year_of_birth, 100)\n      ORDER year_of_birth-1900 ;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-domain-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-domain.html\nCREATE DOMAIN day_of_week AS CHAR(3 CHAR)\n   CONSTRAINT day_of_week_c\n     CHECK (day_of_week IN ('MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN'))   \n   INITIALLY DEFERRED\n   ORDER CASE day_of_week\n      WHEN 'MON' THEN 0\n      WHEN 'TUE' THEN 1\n      WHEN 'WED' THEN 2\n      WHEN 'THU' THEN 3\n      WHEN 'FRI' THEN 4\n      WHEN 'SAT' THEN 5\n      WHEN 'SUN' THEN 6\n      ELSE 7\n  END;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-domain-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-domain.html\nCREATE SEQUENCE IF NOT EXISTS email_seq;\nCREATE DOMAIN email AS VARCHAR2(30)  \n    DEFAULT ON NULL email_seq.NEXTVAL || '@domain.com'\n    CONSTRAINT EMAIL_C CHECK (REGEXP_LIKE (email, '^(\\S+)\\@(\\S+)\\.(\\S+)$'))\n    DISPLAY '---' || SUBSTR(email, INSTR(email, '@') + 1);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-domain-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-domain.html\nCREATE DOMAIN dept_codes AS NUMBER(3) STRICT\n      CONSTRAINT dept_chk CHECK (dept_codes > 99 AND dept_codes != 200) \n      ANNOTATIONS (Title 'Domain Annotation');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-domain-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-domain.html\nCREATE DOMAIN hourly_wages AS NUMBER(10)\n       DEFAULT ON NULL 15\n       CONSTRAINT minimal_wage_c\n         CHECK (hourly_wages >= 7 and hourly_wages <=1000) ENABLE\n       DISPLAY TO_CHAR(hourly_wages, '$999.99')\n       ORDER ( -1*hourly_wages )\n       ANNOTATIONS (Title 'Domain Annotation');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-mle-env-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-mle-env.html\nCREATE MLE ENV scott.\"myenv\";"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-mle-env-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-mle-env.html\nCREATE MLE ENV scott.\"myenv\" CLONE \"other_env\";"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-property-graph-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-property-graph.html\nCREATE PROPERTY GRAPH “myGraph” VERTEX TABLES (my_table_1);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-property-graph-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-property-graph.html\nCREATE PROPERTY GRAPH “myGraph” VERTEX TABLES (other_schema.my_table_1);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-property-graph-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-property-graph.html\nALTER TABLE t DROP CONSTRAINT fkc;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-property-graph-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-property-graph.html\nALTER TABLE t DISABLE CONSTRAINT fkc;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-property-graph-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-property-graph.html\nALTER TABLE t ENABLE NOVALIDATE CONSTRAINT fkc;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-property-graph-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-property-graph.html\nDROP TABLE t ;\nDROP MATERIALIZED VIEW t;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-property-graph-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-property-graph.html\nRENAME t TO t2;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-property-graph-16.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-property-graph.html\nALTER TABLE t RENAME C TO C2;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-property-graph-17.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-property-graph.html\nCREATE PROPERTY GRAPH “myGraph” \n      VERTEX TABLES (“myschema”. “mytable”, “mytable2” AS T2);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-property-graph-18.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-property-graph.html\nCREATE PROPERTY GRAPH “myGraph”\n     VERTEX TABLES (“myschema”. “mytable” LABEL “person”);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-property-graph-19.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-property-graph.html\nCREATE PROPERTY GRAPH “myGraph”\n  VERTEX TABLES (“myschema”. “mytable” LABEL “mytable”);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-property-graph-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-property-graph.html\nCREATE PROPERTY GRAPH “myGraph” \n     VERTEX TABLES (\n       VT1,\n       VT2 KEY(PK2),\n       VT3 KEY(PK31, PK32),\n       VT2 AS ALTVT2 KEY(PK4)\n     );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-property-graph-23.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-property-graph.html\nCREATE PROPERTY GRAPH “myGraph”\n  VERTEX TABLES (“myschema”. “mytable” LABEL “foo” LABEL “bar”);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-property-graph-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-property-graph.html\nCREATE PROPERTY GRAPH “myGraph” VERTEX TABLES (my_table_1, other_schema.my_table_1 AS my_table2);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-property-graph-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-property-graph.html\nCREATE PROPERTY GRAPH “myGraph” \n     VERTEX TABLES (\n       VT1,\n       VT2 KEY(PK2),\n       VT3 KEY(PK31, PK32),\n       VT2 AS ALTVT2 KEY(PK4)\n     )\n     EDGE TABLES (\n       E1 SOURCE VT1  \n          DESTINATION VT2,\n       E2 SOURCE      KEY(FK1) REFERENCES VT1 (PK1) \n          DESTINATION KEY(FK2) REFERENCES VT2 (PK2),\n       E3 SOURCE      KEY(FK1) REFERENCES VT1 (PK1) \n          DESTINATION VT2,\n       E4 SOURCE VT1  \n          DESTINATION KEY(FK5) REFERENCES VT2(RK5))\n;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-property-graph-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-property-graph.html\nALTER TABLE t DROP CONSTRAINT pkc;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-property-graph-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-property-graph.html\nALTER TABLE t DISABLE CONSTRAINT pkc;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-property-graph-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-property-graph.html\nALTER TABLE t ENABLE NOVALIDATE CONSTRAINT pkc;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-vector-index-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-vector-index.html\nCREATE VECTOR INDEX galaxies_hnsw_idx ON galaxies (embedding) ORGANIZATION INMEMORY NEIGHBOR GRAPH\nDISTANCE COSINE\nWITH TARGET ACCURACY 95;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-vector-index-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-vector-index.html\nCREATE VECTOR INDEX galaxies_hnsw_idx ON galaxies (embedding) ORGANIZATION INMEMORY NEIGHBOR GRAPH\nDISTANCE COSINE\nWITH TARGET ACCURACY 90 PARAMETERS (type HNSW, neighbors 40, efconstruction 500);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-vector-index-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-vector-index.html\nCREATE VECTOR INDEX galaxies_ivf_idx ON galaxies (embedding) ORGANIZATION NEIGHBOR PARTITIONS\nDISTANCE COSINE\nWITH TARGET ACCURACY 95;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/create-vector-index-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/create-vector-index.html\nCREATE VECTOR INDEX galaxies_ivf_idx ON galaxies (embedding) ORGANIZATION NEIGHBOR PARTITIONS\nDISTANCE COSINE\nWITH TARGET ACCURACY 90 PARAMETERS (type IVF, neighbor partitions 10);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/domain_check-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain_check.html\nCREATE DOMAIN dgreater AS (c1 AS NUMBER, c2 AS NUMBER ) CHECK (c1 > c2);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/domain_check-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain_check.html\nCREATE DOMAIN three_chars AS CHAR(3 CHAR) STRICT;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/domain_check-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain_check.html\nSELECT order_id,\n       product_id,\n       amount,\n       currency_code,\n       DOMAIN_CHECK(currency, order_id, product_id) order_product,\n       DOMAIN_CHECK(currency, amount, currency_code) amount_currency,\n       DOMAIN_CHECK(currency, currency_code, amount) currency_amount,\n       DOMAIN_CHECK(currency, order_id, currency_code) order_currency\n  FROM order_items;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/domain_check-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain_check.html\nSELECT DOMAIN_CHECK(not_a_domain, 'raises an error');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/domain_check-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain_check.html\nSELECT DOMAIN_CHECK (three_chars, 'ab') two_chars,\n       DOMAIN_CHECK (three_chars, 'abc') three_chars,\n       DOMAIN_CHECK (three_chars, 'abcd') four_chars;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/domain_check-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain_check.html\nCREATE DOMAIN dgreater AS (\n  c1 AS NUMBER, c2 AS NUMBER \n) \n  CHECK (c1 > c2);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/domain_check-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain_check.html\nSELECT DOMAIN_CHECK (dgreater, 1) one_expr;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/domain_check-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain_check.html\nSELECT DOMAIN_CHECK (dgreater, 1, 2) first_lower, \n       DOMAIN_CHECK (dgreater, 2, 1) first_higher,\n       DOMAIN_CHECK (dgreater, 'b', 'a') letters;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/domain_check-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain_check.html\nCREATE DOMAIN day_of_week AS CHAR(3 CHAR);\nCREATE TABLE calendar_dates (\n  calendar_date    DATE,\n  day_of_week_abbr day_of_week\n);\nINSERT INTO calendar_dates \nVALUES(DATE'2023-05-01', 'MON'), \n      (DATE'2023-05-02', 'tue'), \n      (DATE'2023-05-05', 'fRI');\nSELECT day_of_week_abbr, \n       DOMAIN_CHECK(day_of_week, day_of_week_abbr) domain_column, \n       DOMAIN_CHECK(day_of_week, calendar_date) nondomain_column, \n       DOMAIN_CHECK(day_of_week, CAST('MON' AS day_of_week)) domain_value, \n       DOMAIN_CHECK(day_of_week, 'mon') nondomain_value\n  FROM calendar_dates;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/domain_check-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain_check.html\nCREATE DOMAIN day_of_week AS CHAR(3 CHAR)\n  CONSTRAINT CHECK(day_of_week IN ('MON','TUE','WED','THU','FRI','SAT','SUN'))\n  INITIALLY DEFERRED;\nCREATE TABLE calendar_dates (\n  calendar_date    DATE,\n  day_of_week_abbr day_of_week\n);\nINSERT INTO calendar_dates \nVALUES(DATE'2023-05-01', 'MON'), \n      (DATE'2023-05-02', 'tue'), \n      (DATE'2023-05-05', 'fRI');\nSELECT day_of_week_abbr, \n       DOMAIN_CHECK(day_of_week, day_of_week_abbr) domain_column, \n       DOMAIN_CHECK(day_of_week, calendar_date) nondomain_column, \n       DOMAIN_CHECK(day_of_week, CAST('MON' AS day_of_week)) domain_value, \n       DOMAIN_CHECK(day_of_week, 'mon') nondomain_value\n  FROM calendar_dates;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/domain_check-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain_check.html\nCREATE TABLE order_items (\n  order_id      INTEGER,\n  product_id    INTEGER,\n  amount        NUMBER(10, 2),\n  currency_code CHAR(3 CHAR),\n  DOMAIN currency(amount, currency_code)\n);\nINSERT INTO order_items\nVALUES (1, 1,    9.99, 'USD'),\n       (2, 2, 1234.56, 'GBP'),\n       (3, 3, -999999, 'JPY'),\n       (4, 4, 3141592, 'XXX') ,\n       (5, 5, 2718281, '123');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/domain_check_type-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain_check_type.html\nCREATE DOMAIN three_chars AS CHAR(3 CHAR) STRICT;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/domain_check_type-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain_check_type.html\nSELECT DOMAIN_CHECK_TYPE (three_chars, 'ab') two_chars,\n       DOMAIN_CHECK_TYPE (three_chars, 'abc') three_chars,\n       DOMAIN_CHECK_TYPE (three_chars, 'abcd') four_chars;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/domain_check_type-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain_check_type.html\nSELECT DOMAIN_CHECK_TYPE(not_a_domain, 'raises an error');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/domain_check_type-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain_check_type.html\nCREATE DOMAIN dgreater AS (\n  c1 AS NUMBER, c2 AS NUMBER \n) \n  CHECK (c1 > c2);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/domain_check_type-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain_check_type.html\nSELECT DOMAIN_CHECK_TYPE (dgreater, 1) one_expr;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/domain_check_type-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain_check_type.html\nSELECT DOMAIN_CHECK_TYPE (dgreater, 1, 2) first_lower, \n       DOMAIN_CHECK_TYPE (dgreater, 2, 1) first_higher,\n       DOMAIN_CHECK_TYPE (dgreater, 'b', 'a') letters;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/domain_check_type-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain_check_type.html\nCREATE DOMAIN day_of_week AS CHAR(3 CHAR);\nCREATE TABLE calendar_dates (\n  calendar_date    DATE,\n  day_of_week_abbr day_of_week\n);\nINSERT INTO calendar_dates \nVALUES(DATE'2023-05-01', 'MON'), \n      (DATE'2023-05-02', 'tue'), \n      (DATE'2023-05-05', 'fRI');\nSELECT day_of_week_abbr, \n       DOMAIN_CHECK_TYPE(day_of_week, day_of_week_abbr) domain_column, \n       DOMAIN_CHECK_TYPE(day_of_week, calendar_date) nondomain_column, \n       DOMAIN_CHECK_TYPE(day_of_week, CAST('MON' AS day_of_week)) domain_value, \n       DOMAIN_CHECK_TYPE(day_of_week, 'mon') nondomain_value\n  FROM calendar_dates;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/domain_check_type-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain_check_type.html\nCREATE DOMAIN day_of_week AS CHAR(3 CHAR)\n  CONSTRAINT CHECK(day_of_week IN ('MON','TUE','WED','THU','FRI','SAT','SUN'))\n  INITIALLY DEFERRED;\nCREATE TABLE calendar_dates (\n  calendar_date    DATE,\n  day_of_week_abbr day_of_week\n);\nINSERT INTO calendar_dates \nVALUES(DATE'2023-05-01', 'MON'), \n      (DATE'2023-05-02', 'tue'), \n      (DATE'2023-05-05', 'fRI');\nSELECT day_of_week_abbr, \n       DOMAIN_CHECK_TYPE(day_of_week, day_of_week_abbr) domain_column, \n       DOMAIN_CHECK_TYPE(day_of_week, calendar_date) nondomain_column, \n       DOMAIN_CHECK_TYPE(day_of_week, CAST('MON' AS day_of_week)) domain_value, \n       DOMAIN_CHECK_TYPE(day_of_week, 'mon') nondomain_value\n  FROM calendar_dates;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/domain_check_type-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain_check_type.html\nCREATE TABLE order_items (\n  order_id      INTEGER,\n  product_id    INTEGER,\n  amount        NUMBER(10, 2),\n  currency_code CHAR(3 CHAR),\n  DOMAIN currency(amount, currency_code)\n);\nINSERT INTO order_items\nVALUES (1, 1,    9.99, 'USD'),\n       (2, 2, 1234.56, 'GBP'),\n       (3, 3, -999999, 'JPY'),\n       (4, 4, 3141592, 'XXX') ,\n       (5, 5, 2718281, '123');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/domain_check_type-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain_check_type.html\nSELECT order_id,\n       product_id,\n       amount,\n       currency_code,\n       DOMAIN_CHECK_TYPE(currency, order_id, product_id) order_product,\n       DOMAIN_CHECK_TYPE(currency, amount, currency_code) amount_currency,\n       DOMAIN_CHECK_TYPE(currency, currency_code, amount) currency_amount,\n       DOMAIN_CHECK_TYPE(currency, order_id, currency_code) order_currency\n  FROM order_items;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/domain_display-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain_display.html\nCREATE DOMAIN day_of_week AS CHAR(3 CHAR)\n  DISPLAY INITCAP(day_of_week);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/domain_display-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain_display.html\nCREATE TABLE calendar_dates (\n  calendar_date DATE,\n  day_of_week_abbr day_of_week\n);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/domain_display-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain_display.html\nINSERT INTO calendar_dates \nVALUES(DATE'2023-05-01', 'MON'), \n      (DATE'2023-05-02', 'tue'), \n      (DATE'2023-05-05', 'fRI');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/domain_display-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain_display.html\nSELECT day_of_week_abbr, \n       DOMAIN_DISPLAY(day_of_week_abbr) domain_column, \n       DOMAIN_DISPLAY(calendar_date) nondomain_column,\n       DOMAIN_DISPLAY(CAST('MON' AS day_of_week)) domain_value, \n       DOMAIN_DISPLAY('MON') nondomain_value\n  FROM calendar_dates;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/domain_display-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain_display.html\nCREATE TABLE order_items (\n  order_id      INTEGER,\n  product_id    INTEGER,\n  amount        NUMBER(10, 2),\n  currency_code CHAR(3 CHAR),\n  DOMAIN currency(amount, currency_code)\n);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/domain_display-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain_display.html\nINSERT INTO order_items\nVALUES (1, 1,    9.99, 'USD'),\n       (2, 2, 1234.56, 'GBP'),\n       (3, 3, 4321,    'EUR'),\n       (4, 4, 3141592, 'JPY');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/domain_display-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain_display.html\nSELECT order_id,\n       product_id,\n       DOMAIN_DISPLAY(amount, currency_code) domain_cols,\n       DOMAIN_DISPLAY(currency_code, amount) domain_cols_wrong_order,\n       DOMAIN_DISPLAY(order_id, product_id) nondomain_cols,\n       DOMAIN_DISPLAY(amount) domain_cols_subset\n  FROM order_items;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/domain_name-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain_name.html\nCREATE DOMAIN hr.day_of_week AS CHAR(3 CHAR);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/domain_name-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain_name.html\nCREATE TABLE hr.calendar_dates (\n  calendar_date    DATE,\n  day_of_week_abbr hr.day_of_week\n);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/domain_name-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain_name.html\nINSERT INTO hr.calendar_dates \nVALUES(DATE'2023-05-01', 'MON');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/domain_name-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain_name.html\nSELECT day_of_week_abbr, \n       DOMAIN_NAME(day_of_week_abbr) domain_column, \n       DOMAIN_NAME(calendar_date) nondomain_column, \n       DOMAIN_NAME(CAST('MON' AS hr.day_of_week)) domain_value,\n       DOMAIN_NAME('MON') nondomain_value\n  FROM hr.calendar_dates;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/domain_name-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain_name.html\nCREATE TABLE co.order_items (\n  order_id      INTEGER,\n  product_id    INTEGER,\n  amount        NUMBER(10, 2),\n  currency_code CHAR(3 CHAR),\n  DOMAIN co.currency(amount, currency_code)\n);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/domain_name-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain_name.html\nINSERT INTO co.order_items\nVALUES (1, 1, 9.99, 'USD');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/domain_name-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain_name.html\nSELECT order_id,\n       product_id,\n       DOMAIN_NAME(amount, currency_code) domain_cols,\n       DOMAIN_NAME(currency_code, amount) domain_cols_wrong_order,\n       DOMAIN_NAME(order_id, product_id) nondomain_cols,\n       DOMAIN_NAME(amount) domain_cols_subset\n  FROM co.order_items\n  ORDER BY domain_cols;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/domain_order-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain_order.html\nCREATE DOMAIN day_of_week AS CHAR(3 CHAR)\n  ORDER CASE UPPER(day_of_week)\n     WHEN 'MON' THEN 0\n     WHEN 'TUE' THEN 1\n     WHEN 'WED' THEN 2\n     WHEN 'THU' THEN 3\n     WHEN 'FRI' THEN 4\n     WHEN 'SAT' THEN 5\n     WHEN 'SUN' THEN 6\n     ELSE 7\n  END;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/domain_order-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain_order.html\nCREATE TABLE calendar_dates (\n  calendar_date    DATE,\n  day_of_week_abbr day_of_week\n);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/domain_order-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain_order.html\nINSERT INTO calendar_dates \nVALUES(DATE'2023-05-01', 'MON'), \n      (DATE'2023-05-02', 'TUE'), \n      (DATE'2023-05-05', 'FRI'), \n      (DATE'2023-05-08', 'mon');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/domain_order-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain_order.html\nSELECT day_of_week_abbr, \n       DOMAIN_ORDER(day_of_week_abbr) domain_column, \n       DOMAIN_ORDER(calendar_date) nondomain_column, \n       DOMAIN_ORDER(CAST('MON' AS day_of_week)) domain_value, \n       DOMAIN_ORDER('MON') nondomain_value\n  FROM calendar_dates\n  ORDER BY DOMAIN_ORDER(day_of_week_abbr);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/domain_order-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain_order.html\nCREATE TABLE order_items (\n  order_id      INTEGER,\n  product_id    INTEGER,\n  amount        NUMBER(10, 2),\n  currency_code CHAR(3 CHAR),\n  DOMAIN currency(amount, currency_code)\n);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/domain_order-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain_order.html\nINSERT INTO order_items\nVALUES (1, 1,    9.99, 'USD'),\n       (2, 2, 1234.56, 'USD'),\n       (3, 3, 4321,    'EUR'),\n       (4, 4, 3141592, 'JPY'),\n       (5, 5, 2718281, 'JPY');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/domain_order-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/domain_order.html\nSELECT order_id,\n       product_id,\n       DOMAIN_ORDER(amount, currency_code) domain_cols,\n       DOMAIN_ORDER(currency_code, amount) domain_cols_wrong_order,\n       DOMAIN_ORDER(order_id, product_id) nondomain_cols,\n       DOMAIN_ORDER(amount) domain_cols_subset\n  FROM order_items\n  ORDER BY domain_cols;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/drop-domain-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/drop-domain.html\nDROP DOMAIN email;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/drop-domain-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/drop-domain.html\nDROP DOMAIN day_of_week;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/drop-domain-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/drop-domain.html\nDROP DOMAIN day_of_week FORCE PRESERVE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/drop-pmem-filestore-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/drop-pmem-filestore.html\nDROP PMEM FILESTORE cloud_db_1 EXCLUDING CONTENTS"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/file_specification-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/file_specification.html\nCREATE DATABASE payable \n   LOGFILE GROUP 1 ('diska:log1.log', 'diskb:log1.log') SIZE 50K, \n           GROUP 2 ('diska:log2.log', 'diskb:log2.log') SIZE 50K \n   DATAFILE 'diskc:dbone.dbf' SIZE 30M;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/file_specification-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/file_specification.html\nALTER DATABASE payable \n   ADD LOGFILE GROUP 3 ('diska:log3.log', 'diskb:log3.log') \n   SIZE 50K REUSE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/file_specification-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/file_specification.html\nALTER DATABASE ADD LOGFILE GROUP 5\n     ('4k_disk_a:log5.log', '4k_disk_b:log5.log')\n     SIZE 100M BLOCKSIZE 4096 REUSE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/file_specification-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/file_specification.html\nCREATE TABLESPACE stocks \n   DATAFILE 'stock1.dbf' SIZE 10M, \n            'stock2.dbf' SIZE 10M,\n            'stock3.dbf' SIZE 10M;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/file_specification-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/file_specification.html\nALTER TABLESPACE stocks \n   ADD DATAFILE 'stock4.dbf' SIZE 10M REUSE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/file_specification-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/file_specification.html\nALTER DATABASE testdb \n   DATAFILE '+dgroup_01/testdb/datafile/system.261.1' ONLINE;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/floor-datetime-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/floor-datetime.html\nALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/floor-datetime-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/floor-datetime.html\nSELECT FLOOR(TO_DATE ('28-FEB-2023','DD-MON-YYYY'), 'MM') AS month_floor;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/floor-datetime-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/floor-datetime.html\nSELECT FLOOR(TO_TIMESTAMP ('28-FEB-2023 14:10:10','DD-MON-YYYY HH24:MI:SS'),'HH24') AS hour_floor;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/floor-interval-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/floor-interval.html\nSELECT FLOOR(INTERVAL '+123-5' YEAR(3) TO MONTH) as year_floor;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/floor-interval-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/floor-interval.html\nSELECT FLOOR(INTERVAL '+99-11' YEAR(2) TO MONTH, 'YEAR') as year_floor;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/floor-interval-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/floor-interval.html\nSELECT FLOOR(INTERVAL '+4 12:42:10.222' DAY(2) TO SECOND(3), 'DD') as year_floor;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/from_vector-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/from_vector.html\nSELECT FROM_VECTOR(TO_VECTOR('[1, 2, 3]') );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/from_vector-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/from_vector.html\nSELECT FROM_VECTOR(TO_VECTOR('[1.1, 2.2, 3.3]', 3, FLOAT32) );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/from_vector-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/from_vector.html\nSELECT FROM_VECTOR( TO_VECTOR('[1.1, 2.2, 3.3]', 3, FLOAT32) RETURNING VARCHAR2(1000));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/from_vector-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/from_vector.html\nSELECT FROM_VECTOR(TO_VECTOR('[1.1, 2.2, 3.3]', 3, FLOAT32) RETURNING CLOB );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/from_vector-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/from_vector.html\nSELECT FROM_VECTOR(TO_VECTOR('[5,[2,4],[1.0,2.0]]', 5, FLOAT64, SPARSE) RETURNING CLOB FORMAT SPARSE);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/from_vector-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/from_vector.html\nSELECT FROM_VECTOR(TO_VECTOR('[5,[2,4],[1.0,2.0]]', 5, FLOAT64, SPARSE) RETURNING CLOB FORMAT DENSE);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/from_vector-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/from_vector.html\nSELECT dataVec FROM vecTab;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/from_vector-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/from_vector.html\nSELECT FROM_VECTOR(dataVec) FROM vecTab;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/graph-pattern-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/graph-pattern.html\nSELECT *\nFROM GRAPH_TABLE ( students_graph\n  MATCH (a IS person) <-[e1 IS friends]- (b IS person)\n           <-[e2 IS friends]- (c IS person)\n              <-[e3 is friends]- (a IS person)\n  WHERE a.name= 'Mary'\n  COLUMNS (a.name AS person_a, b.name AS person_b, c.name AS person_c)\n);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/graph-pattern-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/graph-pattern.html\nSELECT *\nFROM GRAPH_TABLE ( students_graph\n  MATCH (n IS person) -[IS friends]-{2}(m IS person)\n  WHERE n.name = 'Mary' AND m.name <> n.name\n  COLUMNS (m.name AS fof)\n);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/graph-pattern-11.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/graph-pattern.html\nSELECT *\nFROM GRAPH_TABLE ( students_graph\n  MATCH (n IS person) (-[IS friends]-){2}(m IS person)\n  WHERE n.name = 'Mary' AND m.name <> n.name\n  COLUMNS (m.name AS fof)\n);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/graph-pattern-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/graph-pattern.html\nSELECT COUNT(*)\nFROM GRAPH_TABLE ( students_graph\n  MATCH (v)\n  COLUMNS (1 AS dummy)\n);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/graph-pattern-15.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/graph-pattern.html\nSELECT name, birthday\nFROM GRAPH_TABLE ( students_graph\n  MATCH (p IS person WHERE p.dob > DATE '1980-01-01')\n  COLUMNS (p.name, p.dob AS birthday)\n)\nORDER BY birthday;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/graph-pattern-17.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/graph-pattern.html\nSELECT COUNT(*)\nFROM GRAPH_TABLE ( students_graph\n  MATCH ->\n  COLUMNS (1 AS dummy)\n);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/graph-pattern-19.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/graph-pattern.html\nSELECT *\nFROM GRAPH_TABLE ( students_graph\n  MATCH -[e IS friends WHERE e.meeting_date > DATE '2001-01-01']->\n  COLUMNS (e.meeting_date)\n);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/graph-pattern-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/graph-pattern.html\nSELECT *\nFROM GRAPH_TABLE ( students_graph\n  MATCH (a IS person) <-[e1 IS friends]- (b IS person),\n        (b) <-[e2 IS friends]- (c IS person),\n        (c) <-[e3 is friends]- (a IS person)\n  WHERE a.name= 'Mary'\n  COLUMNS (a.name AS person_a, b.name AS person_b, c.name AS person_c)\n);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/graph-pattern-21.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/graph-pattern.html\nSELECT *\nFROM GRAPH_TABLE ( students_graph\n  MATCH (n IS person WHERE n.name = 'Mary')\n          -[e IS friends WHERE e.meeting_date > DATE '2001-01-01']-\n            () -[IS friends]- (m IS person)\n  WHERE m.name <> n.name\n  COLUMNS (m.name, e.meeting_date)\n);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/graph-pattern-23.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/graph-pattern.html\nSELECT DISTINCT name\nFROM GRAPH_TABLE ( students_graph\n  MATCH (a IS person) -[e IS friends WHERE e.meeting_date > DATE '2000-09-15']-{2} (\"b\" IS person)\n  WHERE a.name = 'John' AND a.name <> \"b\".name\n  COLUMNS (\"b\".name)\n);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/graph-pattern-25.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/graph-pattern.html\nSELECT *\nFROM GRAPH_TABLE ( students_graph\n  MATCH (p1 IS person) -[e1 IS friends]- (p2 IS person)\n      , (p1) -[IS student_of]-> (u1 IS university)\n      , (p2) -[IS student_of]-> (u2 IS university)\n  WHERE p1.name = 'Mary'\n  COLUMNS (p1.name, p2.name AS friend, e1.meeting_date, u1.name AS univ_1, u2.name AS univ_2)\n);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/graph-pattern-27.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/graph-pattern.html\nSELECT *\nFROM GRAPH_TABLE ( students_graph\n       MATCH (p IS person) -[e IS friends]-{2,5} (friend IS person)\n       WHERE p.name = 'Alice' AND\n             COUNT(e.friendship_id) = COUNT(DISTINCT e.friendship_id)\n       COLUMNS (LISTAGG(e.friendship_id, ', ') AS friendship_ids,\n                COUNT(e.friendship_id) AS path_length));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/graph-pattern-29.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/graph-pattern.html\nSELECT *\nFROM GRAPH_TABLE ( students_graph\n  MATCH (x IS person|university)\n  COLUMNS (x.name, x.dob)\n)\nORDER BY name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/graph-pattern-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/graph-pattern.html\nSELECT COUNT(*)\nFROM GRAPH_TABLE ( students_graph\n  MATCH (v)\n  COLUMNS (1 AS dummy)\n);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/graph-pattern-31.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/graph-pattern.html\nSELECT *\nFROM GRAPH_TABLE ( students_graph\n  MATCH (n IS person) -[e IS student_of|friends]-> (m IS university|\"PERSON\")\n  WHERE n.name = 'Mary'\n  COLUMNS (e.subject, e.meeting_date, m.name)\n)\nORDER BY subject, meeting_date, name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/graph-pattern-33.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/graph-pattern.html\nSELECT Gt.name\nFROM GRAPH_TABLE ( students_graph\n  MATCH (a IS person WHERE a.name = 'John')\n          -[e IS friends WHERE e.meeting_date > DATE '2000-09-15']-\n            (b IS person)\n  COLUMNS (b.name)\n) GT;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/graph-pattern-35.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/graph-pattern.html\nSELECT DISTINCT name\nFROM GRAPH_TABLE ( students_graph\n  MATCH (a IS person)\n          -[e IS friends WHERE e.meeting_date > DATE '2000-09-15']-{2}\n            (b IS person)\n  WHERE a.name = 'John' AND a.name <> b.name\n  COLUMNS (b.name)\n);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/graph-pattern-37.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/graph-pattern.html\nSELECT DISTINCT name, height\nFROM GRAPH_TABLE ( students_graph\n  MATCH (a IS person|person_ht)\n           (-[e IS friends]- (x IS person_ht) WHERE x.height > a.height) {,3}\n             (b IS person|person_ht)\n  WHERE a.name = 'Mary'\n  COLUMNS (b.name, b.height)\n)\nORDER BY height;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/graph-pattern-38.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/graph-pattern.html\nSELECT *\nFROM GRAPH_TABLE ( students_graph\n       MATCH (u1 IS university) -[e]-{,3} (u2 IS university)\n       WHERE u1.name = 'ABC' AND u2.name = 'XYZ'\n       COLUMNS (JSON_ARRAYAGG(CASE WHEN e.subject IS NOT NULL THEN e.subject\n                              ELSE CAST(e.friendship_id AS VARCHAR(100)) END) AS path));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/graph-pattern-40.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/graph-pattern.html\nSELECT DISTINCT name, birthday\nFROM GRAPH_TABLE ( students_graph\n  MATCH\n   (a IS person)\n     ( (x) -[e IS friends]- (y IS person) \n       WHERE x.dob < y.dob ){1,3}\n         (b IS person)\n  WHERE a.name = 'Bob'\n  COLUMNS (b.name, b.dob AS birthday)\n)\nORDER BY birthday;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/graph-pattern-42.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/graph-pattern.html\nSELECT *\nFROM GRAPH_TABLE ( students_graph\n       MATCH (p IS person) ( -[e IS friends]-> (friend IS person)\n                             WHERE p.person_id <> friend.person_id){2,3}\n       WHERE p.name = 'John'\n       COLUMNS (COUNT(e.friendship_id) AS path_length,\n                LISTAGG(friend.name, ', ') AS names,\n                LISTAGG(e.meeting_date, ', ') AS meeting_dates ));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/graph-pattern-44.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/graph-pattern.html\nSELECT Gt.name\nFROM GRAPH_TABLE ( students_graph\n  MATCH (a IS person) -[e IS friends]- (b IS person)\n  WHERE a.name = 'John' AND e.meeting_date > DATE '2000-09-15'\n  COLUMNS (b.name)\n) GT;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/graph-pattern-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/graph-pattern.html\nSELECT COUNT(*)\nFROM GRAPH_TABLE ( students_graph\n  MATCH -[e]->\n  COLUMNS (1 AS dummy)\n);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/graph-pattern-7.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/graph-pattern.html\nSELECT *\nFROM GRAPH_TABLE ( students_graph\n  MATCH (n IS person) -[IS friends]- () -[IS friends]- (m IS person)\n  WHERE n.name = 'Mary' AND m.name <> n.name\n  COLUMNS (m.name AS fof)\n);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/graph-pattern-9.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/graph-pattern.html\nSELECT *\nFROM GRAPH_TABLE ( students_graph\n  MATCH (n IS person) -[IS friends]- -[IS friends]- (m IS person)\n  WHERE n.name = 'Mary' AND m.name <> n.name\n  COLUMNS (m.name AS fof)\n);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/graph-reference-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/graph-reference.html\nSELECT COUNT(*)\nFROM GRAPH_TABLE ( scott.students_graph\n  MATCH (a IS person)\n  COLUMNS (a.name)\n);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/graph-reference-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/graph-reference.html\nINSERT INTO university (name) VALUES ('u3');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/graph-reference-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/graph-reference.html\nSELECT COUNT(*)\nFROM GRAPH_TABLE (\n  students_graph\n  MATCH (u IS university)\n  COLUMNS (u.*)\n);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/graph-reference-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/graph-reference.html\nSELECT COUNT(*)\nFROM GRAPH_TABLE (\n  students_graph AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '2' MINUTE)\n  MATCH (u IS university)\n  COLUMNS (u.*)\n);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/graph-reference-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/graph-reference.html\nDELETE FROM university WHERE name = 'u3';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/graph-table-shape-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/graph-table-shape.html\nSELECT *\nFROM GRAPH_TABLE ( students_graph\n  MATCH (n IS person|person_ht)\n  COLUMNS (n.name, n.height * 3.281 AS height_in_feet)\n)\nORDER BY name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/graph-table-shape-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/graph-table-shape.html\nSELECT *\nFROM GRAPH_TABLE ( students_graph\n       MATCH (u1 IS university)\n               <-[IS student_of]- (p1 IS person)\n               -[IS friends]-{1,2} (p2 IS person)\n               -[IS student_of]-> (u2 IS university)\n       WHERE u1.name = 'ABC' AND u2.name = 'XYZ'\n       ONE ROW PER VERTEX (v)\n       COLUMNS (MATCHNUM() AS matchnum,\n                ELEMENT_NUMBER(v) AS element_number,\n                CASE WHEN v.person_id IS NOT NULL\n                  THEN 'person'\n                  ELSE 'university'\n                  END AS label,\n                v.name))\nORDER BY matchnum, element_number;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/graph-table-shape-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/graph-table-shape.html\nSELECT *\nFROM GRAPH_TABLE ( students_graph\n  MATCH (p1 IS person) -[e IS friends]-> (p2 IS person)\n  COLUMNS ( p1.*, p2.name AS p2_name, e.* )\n)\nORDER BY 1, 2, 3, 4, 5;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/graph-table-shape-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/graph-table-shape.html\nSELECT *\nFROM GRAPH_TABLE ( students_graph\n  MATCH (v)\n  COLUMNS ( v.* )\n)\nORDER BY 1, 2, 3, 4, 5;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/graph-table-shape-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/graph-table-shape.html\nSELECT *\nFROM GRAPH_TABLE ( students_graph\n       MATCH (n IS person) -[e1 IS friends]->{0,3} (IS person)\n       WHERE n.name = 'John'\n       ONE ROW PER VERTEX (v)\n       COLUMNS (\n        LISTAGG(e1.friendship_id, ', ') AS friendship_ids,\n        v.name)\n     );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/graph-table-shape-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/graph-table-shape.html\nSELECT *\nFROM GRAPH_TABLE ( students_graph\n       MATCH (n IS person) -[e1 IS friends]->{0,3} (IS person)\n       WHERE n.name = 'John'\n       ONE ROW PER STEP (src, e2, dst)\n       COLUMNS (\n         LISTAGG(e1.friendship_id, ', ') AS friendship_ids,\n         src.name AS src_name,\n         e2.friendship_id,\n         dst.name AS dst_name)\n     );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/graph_table-operator-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/graph_table-operator.html\nCREATE TABLE university (\n    id NUMBER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1),\n    name VARCHAR2(10),\n    CONSTRAINT u_pk PRIMARY KEY (id));\nINSERT INTO university (name) VALUES ('ABC');\nINSERT INTO university (name) VALUES ('XYZ');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/graph_table-operator-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/graph_table-operator.html\nCREATE TABLE persons (\n     person_id NUMBER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT\n     BY 1),\n     name VARCHAR2(10),\n     birthdate DATE,\n     height FLOAT DEFAULT ON NULL 0,\n     person_data JSON,\n     CONSTRAINT person_pk PRIMARY KEY (person_id));\nINSERT INTO persons (name, height, birthdate, person_data)\n       VALUES ('John', 1.80, to_date('13/06/1963', 'DD/MM/YYYY'), '{\"department\":\"IT\",\"role\":\"Software Developer\"}');\nINSERT INTO persons (name, height, birthdate, person_data)\n       VALUES ('Mary', 1.65, to_date('25/09/1982', 'DD/MM/YYYY'), '{\"department\":\"HR\",\"role\":\"HR Manager\"}');\nINSERT INTO persons (name, height, birthdate, person_data)\n       VALUES ('Bob', 1.75, to_date('11/03/1966', 'DD/MM/YYYY'), '{\"department\":\"IT\",\"role\":\"Technical Consultant\"}');\nINSERT INTO persons (name, height, birthdate, person_data)\n       VALUES ('Alice', 1.70, to_date('01/02/1987', 'DD/MM/YYYY'), '{\"department\":\"HR\",\"role\":\"HR Assistant\"}');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/graph_table-operator-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/graph_table-operator.html\nCREATE TABLE students (\n      s_id NUMBER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1),\n      s_univ_id NUMBER,\n      s_person_id NUMBER,\n      subject VARCHAR2(10),      \n      CONSTRAINT stud_pk PRIMARY KEY (s_id),\n      CONSTRAINT stud_fk_person FOREIGN KEY (s_person_id) REFERENCES persons(person_id),\n      CONSTRAINT stud_fk_univ FOREIGN KEY (s_univ_id) REFERENCES university(id)\n    );\nINSERT INTO students(s_univ_id, s_person_id,subject) VALUES (1,1,'Arts');\nINSERT INTO students(s_univ_id, s_person_id,subject) VALUES (1,3,'Music');\nINSERT INTO students(s_univ_id, s_person_id,subject) VALUES (2,2,'Math');\nINSERT INTO students(s_univ_id, s_person_id,subject) VALUES (2,4,'Science');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/graph_table-operator-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/graph_table-operator.html\nCREATE TABLE friendships (\n    friendship_id NUMBER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1),\n    person_a NUMBER,\n    person_b NUMBER,\n    meeting_date DATE,\n    CONSTRAINT fk_person_a_id FOREIGN KEY (person_a) REFERENCES persons(person_id),\n    CONSTRAINT fk_person_b_id FOREIGN KEY (person_b) REFERENCES persons(person_id),\n    CONSTRAINT fs_pk PRIMARY KEY (friendship_id)\n);\nINSERT INTO friendships (person_a, person_b, meeting_date) VALUES (1, 3, to_date('01/09/2000', 'DD/MM/YYYY'));\nINSERT INTO friendships (person_a, person_b, meeting_date) VALUES (2, 4, to_date('19/09/2000', 'DD/MM/YYYY'));\nINSERT INTO friendships (person_a, person_b, meeting_date) VALUES (2, 1, to_date('19/09/2000', 'DD/MM/YYYY'));\nINSERT INTO friendships (person_a, person_b, meeting_date) VALUES (3, 2, to_date('10/07/2001', 'DD/MM/YYYY'));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/graph_table-operator-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/graph_table-operator.html\nCREATE PROPERTY GRAPH students_graph\n  VERTEX TABLES (\n    persons KEY (person_id)\n      LABEL person\n        PROPERTIES (person_id, name, birthdate AS dob)\n      LABEL person_ht\n        PROPERTIES (height),\n    university KEY (id)\n  )\n  EDGE TABLES (\n    friendships AS friends\n      KEY (friendship_id)\n      SOURCE KEY (person_a) REFERENCES persons(person_id)\n      DESTINATION KEY (person_b) REFERENCES persons(person_id)\n      PROPERTIES (friendship_id, meeting_date),\n    students AS student_of\n      SOURCE KEY (s_person_id) REFERENCES persons(person_id)\n      DESTINATION KEY (s_univ_id) REFERENCES university(id)\n      PROPERTIES (subject)\n  );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/graph_table-operator-5.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/graph_table-operator.html\nSELECT *\nFROM GRAPH_TABLE ( students_graph\n  MATCH (a IS person) -[e IS friends]- (b IS person)\n  WHERE a.name = 'John'\n  COLUMNS (b.name)\n);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/is_uuid-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/is_uuid.html\nSELECT IS_UUID('{e24e8de0-d663-428f-baaa-1be5f019cd25}') FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/is_uuid-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/is_uuid.html\nSELECT IS_UUID('{d20f8c3cde134b958d25eff3fbdb7e71}') FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ora_shardspace_name-pseudocolumn-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ora_shardspace_name-pseudocolumn.html\nSELECT CUST_NAME, CUST_ID FROM CUSTOMER WHERE ORA_SHARDSPACE_NAME = 'EUROPE'"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/ora_shardspace_name-pseudocolumn-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/ora_shardspace_name-pseudocolumn.html\nSELECT CUST_NAME, CUST_ID FROM CUSTOMER"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/raw_to_uuid-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/raw_to_uuid.html\nSELECT RAW_TO_UUID(UUID()) FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/round-interval-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/round-interval.html\nSELECT ROUND(INTERVAL '+123-06' YEAR(3) TO MONTH) AS year_round;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/round-interval-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/round-interval.html\nSELECT ROUND(INTERVAL '+99-11' YEAR(2) TO MONTH, 'YEAR') AS year_round;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/round-interval-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/round-interval.html\nSELECT ROUND(INTERVAL '-999999999-11' YEAR(9) TO MONTH, 'YEAR')AS year_round;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/round-interval-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/round-interval.html\nSELECT ROUND(INTERVAL '+4 12:42:10.222' DAY(2) TO SECOND(3), 'DD') AS day_round;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/shard_chunk_id-operator-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/shard_chunk_id-operator.html\nSELECT SHARD_CHUNK_ID(null, class, custno, name) FROM customers;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/storage_clause-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/storage_clause.html\nCREATE TABLE divisions \n    (div_no     NUMBER(2), \n     div_name   VARCHAR2(14), \n     location   VARCHAR2(13) ) \n     STORAGE  ( INITIAL 8M MAXSIZE 1G );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/storage_clause-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/storage_clause.html\nSELECT INITIAL_EXTENT FROM USER_TABLES WHERE TABLE_NAME='DIVISIONS';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/sys_row_etag-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/sys_row_etag.html\nCREATE TABLE foo (c1 NUMBER, c2 NUMBER, c3 NUMBER);\nINSERT INTO foo VALUES (1, 2, 3);\nSELECT SYS_ROW_ETAG(c2, c1) FROM foo;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/time_bucket-datetime-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/time_bucket-datetime.html\nALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD';"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/to_boolean-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/to_boolean.html\nSELECT TO_BOOLEAN(0), TO_BOOLEAN('true'), TO_BOOLEAN('no');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/to_boolean-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/to_boolean.html\nSELECT TO_BOOLEAN(1) FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/to_vector-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/to_vector.html\nSELECT TO_VECTOR('[34.6, 77.8]');\nSELECT TO_VECTOR('[34.6, 77.8]', 2, FLOAT32);\nSELECT TO_VECTOR('[34.6, 77.8, -89.34]', 3, FLOAT32);\nSELECT TO_VECTOR('[34.6, 77.8, -89.34]', 3, FLOAT32, DENSE);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/to_vector-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/to_vector.html\nINSERT INTO vecTab VALUES(TO_VECTOR('[1.1, 2.9, 3.14]'));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/to_vector-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/to_vector.html\nINSERT INTO vecTab VALUES ('[1.1, 2.9, 3.14]');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/trunc-interval-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/trunc-interval.html\nSELECT TRUNC(INTERVAL '+123-06' YEAR(3) TO MONTH) AS year_trunc;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/trunc-interval-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/trunc-interval.html\nSELECT TRUNC(INTERVAL '+99-11' YEAR(2) TO MONTH, 'YEAR') AS year_trunc;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/trunc-interval-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/trunc-interval.html\nSELECT TRUNC(INTERVAL '+4 12:42:10.222' DAY(2) TO SECOND(3), 'DD') AS day_trunc;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/uuid-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/uuid.html\nSELECT UUID() from dual;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/uuid_to_raw-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/uuid_to_raw.html\nSELECT UUID_TO_RAW ('{82e19137-f810-44ad-b26e-379d828408a1}') FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/uuid_to_raw-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/uuid_to_raw.html\nSELECT UUID_TO_RAW('{d20f8c3c-de13-4b95-8d25-eff3fbdb7e71}')  FROM DUAL;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/value-expressions-graph_table-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/value-expressions-graph_table.html\nSELECT GT.name, GT.birthday\nFROM GRAPH_TABLE ( students_graph\n  MATCH (p IS person|university)\n  COLUMNS (p.name, p.dob AS birthday)\n) GT\nORDER BY GT.birthday, GT.name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/value-expressions-graph_table-10.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/value-expressions-graph_table.html\nSELECT name\nFROM GRAPH_TABLE ( students_graph\n  MATCH (p IS person)\n          -[IS friends]- (friend IS person)\n            -[IS friends]- (friend_of_friend IS person)\n  WHERE p.name = 'Mary' AND NOT vertex_equal(p, friend_of_friend)\n  COLUMNS (friend_of_friend.name)\n)\nORDER BY name;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/value-expressions-graph_table-12.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/value-expressions-graph_table.html\nSELECT *\nFROM GRAPH_TABLE ( students_graph\n       MATCH (p1 IS person) -[e IS friends]- (p2 IS person)\n       WHERE p1.name = 'Mary'\n       COLUMNS (e.friendship_id,\n                e.meeting_date,\n                CASE WHEN p1 IS SOURCE OF e THEN p1.name ELSE p2.name END AS from_person,\n                CASE WHEN p1 IS DESTINATION OF e THEN p1.name ELSE p2.name END AS to_person))\nORDER BY friendship_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/value-expressions-graph_table-13.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/value-expressions-graph_table.html\nSELECT *\nFROM GRAPH_TABLE ( students_graph\n       MATCH (p1 IS person) -[e1 IS friends]- (p2 IS person)\n               -[e2 IS friends]- (p3 IS person)\n       WHERE p1.name = 'John'\n         AND ((p1 IS SOURCE OF e1 AND p2 IS SOURCE OF e2) OR\n             (p1 IS DESTINATION OF e1 AND p2 IS DESTINATION OF e2))\n       COLUMNS (p1.name AS person_1,\n                CASE WHEN p1 IS SOURCE OF e1\n                  THEN 'Outgoing' ELSE 'Incoming'\n                  END AS e1_direction,\n                p2.name AS person_2,\n                CASE WHEN p2 IS SOURCE OF e2\n                  THEN 'Outgoing' ELSE 'Incoming'\n                  END AS e2_direction,\n                p3.name AS person_3))\nORDER BY 1, 2, 3;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/value-expressions-graph_table-14.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/value-expressions-graph_table.html\nSELECT *\nFROM GRAPH_TABLE ( students_graph\n       MATCH (p IS person) -[e IS friends]-{2,5} (friend IS person)\n       WHERE p.name = 'Alice' AND\n             COUNT(edge_id(e)) = COUNT(DISTINCT edge_id(e))\n       COLUMNS (LISTAGG(e.friendship_id, ', ') AS friendship_ids,\n                COUNT(edge_id(e)) AS path_length))\nORDER BY path_length, friendship_ids;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/value-expressions-graph_table-16.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/value-expressions-graph_table.html\nSELECT *\nFROM GRAPH_TABLE ( students_graph\n       MATCH (u1 IS university) -[e]-{,3} (u2 IS university)\n       WHERE u1.name = 'ABC' AND u2.name = 'XYZ'\n       COLUMNS (JSON_ARRAYAGG(CASE WHEN e.subject IS NOT NULL THEN e.subject\n                              ELSE CAST(e.friendship_id AS VARCHAR(100)) END) AS path))\nORDER BY path;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/value-expressions-graph_table-17.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/value-expressions-graph_table.html\nSELECT *\nFROM GRAPH_TABLE ( students_graph\n       MATCH (p IS person) ( -[e IS friends]-> (friend IS person)\n                             WHERE p.person_id <> friend.person_id){2,3}\n       WHERE p.name = 'John'\n       COLUMNS (COUNT(edge_id(e)) AS path_length,\n                LISTAGG(friend.name, ', ') AS names,\n                LISTAGG(e.meeting_date, ', ') AS meeting_dates ))\nORDER BY path_length;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/value-expressions-graph_table-19.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/value-expressions-graph_table.html\nCREATE PROPERTY GRAPH persons_graph VERTEX TABLES ( persons );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/value-expressions-graph_table-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/value-expressions-graph_table.html\nSELECT *\nFROM GRAPH_TABLE ( students_graph\n  MATCH (n IS person)\n  COLUMNS ( n.name, n.height )\n)\nORDER BY height;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/value-expressions-graph_table-20.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/value-expressions-graph_table.html\nSELECT *\nFROM GRAPH_TABLE ( persons_graph\n       MATCH (n)\n       WHERE n.person_data.department = 'HR'\n       COLUMNS (n.name, n.person_data.role.string() AS role)\n     );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/value-expressions-graph_table-21.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/value-expressions-graph_table.html\nSELECT *\nFROM GRAPH_TABLE ( students_graph\n       MATCH (p IS person)\n       COLUMNS (MATCHNUM() AS matchnum,\n                p.name))\nORDER BY matchnum;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/value-expressions-graph_table-23.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/value-expressions-graph_table.html\nSELECT *\nFROM GRAPH_TABLE ( students_graph\n       MATCH (p1 IS person) -[IS friends]-{1,2} (p2 IS person)\n       WHERE p1.name = 'John' AND p2.name = 'Mary'\n       ONE ROW PER VERTEX (v)\n       COLUMNS (MATCHNUM() AS matchnum,\n                ELEMENT_NUMBER(v) AS element_number,\n                v.name))\nORDER BY matchnum, element_number;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/value-expressions-graph_table-25.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/value-expressions-graph_table.html\nSELECT *\nFROM GRAPH_TABLE ( students_graph\n       MATCH (p1 IS person) -[IS friends]-{1,2} (p2 IS person)\n       WHERE p1.name = 'John' AND p2.name = 'Mary'\n       ONE ROW PER STEP (v1, e, v2)\n       COLUMNS (MATCHNUM() AS matchnum,\n                ELEMENT_NUMBER(e) AS element_number,\n                v1.name AS name1,\n                e.friendship_id,\n                v2.name AS name2))\nORDER BY matchnum, element_number;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/value-expressions-graph_table-27.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/value-expressions-graph_table.html\nSELECT *\nFROM GRAPH_TABLE ( students_graph\n       MATCH (p1 IS person) -[IS friends]-{0,1} (p2 IS person)\n       WHERE p1.name = 'John'\n       ONE ROW PER STEP (v1, e, v2)\n       COLUMNS (MATCHNUM() AS matchnum,\n                ELEMENT_NUMBER(e) AS element_number,\n                v1.name AS name1,\n                e.friendship_id,\n                v2.name AS name2))\nORDER BY matchnum, element_number;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/value-expressions-graph_table-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/value-expressions-graph_table.html\nSELECT CAST(p2_id AS VARCHAR2(200)) AS p2_id\nFROM GRAPH_TABLE ( students_graph\n  MATCH (p1 IS person) -[e1 IS friends]- (p2 IS person)\n  WHERE p1.name = 'Mary'\n  COLUMNS (vertex_id(p2) AS p2_id)\n)\nORDER BY p2_id;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/value-expressions-graph_table-6.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/value-expressions-graph_table.html\nSELECT GT.p2_id.KEY_VALUE\nFROM GRAPH_TABLE ( students_graph\n  MATCH (p1 IS person) -[e1 IS friends]- (p2 IS person)\n  WHERE p1.name = 'Mary'\n  COLUMNS (vertex_id(p2) AS p2_id)\n) GT\nORDER BY key_value;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/value-expressions-graph_table-8.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/value-expressions-graph_table.html\nSELECT DISTINCT json_value(e_id, '$.ELEM_TABLE') AS elem_table\nFROM GRAPH_TABLE ( students_graph\n  MATCH -[e]-\n  COLUMNS (edge_id(e) AS e_id)\n)\nORDER BY elem_table;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/vector-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/vector.html\nINSERT INTO vecTab VALUES ('[1.1, 2.9, 3.14]');"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/vector-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/vector.html\nSELECT VECTOR('[34.6, 77.8]');\nSELECT VECTOR('[34.6, 77.8]', 2, FLOAT32);\nSELECT VECTOR('[34.6, 77.8, -89.34]', 3, FLOAT32);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/vector_chunks-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/vector_chunks.html\nCOLUMN chunk_offset HEADING Offset FORMAT 999\n\nCOLUMN chunk_length HEADING Len    FORMAT 999\n\nCOLUMN chunk_text   HEADING Text   FORMAT a60\n\nVARIABLE txt VARCHAR2(4000)\n\nEXECUTE :txt := 'An example text value to split with VECTOR_CHUNKS, having over 10 words because the minimum MAX value is 10';\nSELECT * FROM VECTOR_CHUNKS(:txt BY WORDS MAX 10);\nSELECT * FROM VECTOR_CHUNKS('Another example text value to split with VECTOR_CHUNKS, having over 10 words because the minimum MAX value is 10' BY WORDS MAX 10);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/vector_chunks-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/vector_chunks.html\nCREATE TABLE documentation_tab (\n  id   NUMBER,\n  text VARCHAR2(2000));\nINSERT INTO documentation_tab\n   VALUES(1, 'sample');\nCOMMIT;\nSET LINESIZE 100;\nSET PAGESIZE 20;\nCOLUMN pos FORMAT 999;\nCOLUMN siz FORMAT 999;\nCOLUMN txt FORMAT a60;\nSELECT D.id id, C.chunk_offset pos, C.chunk_length siz, C.chunk_text txt\nFROM documentation_tab D, VECTOR_CHUNKS(D.text\n                                  BY words\n                                  MAX 200\n                                  OVERLAP 10\n                                  SPLIT BY recursively\n                                  LANGUAGE american\n                                  NORMALIZE all) C;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/vector_dimension_count-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/vector_dimension_count.html\nSELECT VECTOR_DIMENSION_COUNT( TO_VECTOR('[34.6, 77.8]', 2, FLOAT64) );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/vector_dimension_format-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/vector_dimension_format.html\nSELECT VECTOR_DIMENSION_FORMAT(TO_VECTOR('[34.6, 77.8]', 2, FLOAT64));\nSELECT VECTOR_DIMENSION_FORMAT(TO_VECTOR('[34.6, 77.8, 9]', 3, FLOAT32));\nSELECT VECTOR_DIMENSION_FORMAT(TO_VECTOR('[34.6, 77.8, 9.10]', 3, INT8));\nSELECT VECTOR_DIMENSION_FORMAT(TO_VECTOR('[206, 32]', 16, BINARY));\nSELECT VECTOR_DIMENSION_FORMAT(TO_VECTOR('[34.6, 77.8, 9, 10]', 3, INT8));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/vector_embedding-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/vector_embedding.html\nSELECT TO_VECTOR(VECTOR_EMBEDDING(model USING 'hello' as data)) AS embedding;"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/vector_norm-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/vector_norm.html\nSELECT VECTOR_NORM( TO_VECTOR('[4, 3]', 2, FLOAT32) );"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/vector_serialize-0.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/vector_serialize.html\nSELECT VECTOR_SERIALIZE(VECTOR('[1.1,2.2,3.3]',3,FLOAT32));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/vector_serialize-1.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/vector_serialize.html\nSELECT VECTOR_SERIALIZE(VECTOR('[1.1, 2.2, 3.3]',3,FLOAT32) RETURNING VARCHAR2(1000));"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/vector_serialize-2.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/vector_serialize.html\nSELECT VECTOR_SERIALIZE(VECTOR('[1.1, 2.2, 3.3]',3,FLOAT32) RETURNING CLOB);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/vector_serialize-3.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/vector_serialize.html\nSELECT VECTOR_SERIALIZE(TO_VECTOR('[5,[2,4],[1.0,2.0]]', 5, FLOAT64, SPARSE) RETURNING CLOB FORMAT SPARSE);"
  },
  {
    "path": "zpa-checks/src/integrationTest/resources/sources/oracle-database_23/sqlrf/vector_serialize-4.sql",
    "content": "-- https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/vector_serialize.html\nSELECT VECTOR_SERIALIZE(TO_VECTOR('[5,[2,4],[1.0,2.0]]', 5, FLOAT64, SPARSE) RETURNING CLOB FORMAT DENSE);"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/AbstractBaseCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.zpa.CustomAnnotationBasedRulesDefinition.Companion.convertCheckClassName\nimport com.felipebz.zpa.api.checks.PlSqlCheck\nimport java.util.*\n\nabstract class AbstractBaseCheck : PlSqlCheck() {\n\n    private val bundle: ResourceBundle = ResourceBundle.getBundle(\"org.sonar.l10n.plsqlopen\", Locale.getDefault())\n\n    protected fun getLocalizedMessage(): String {\n        return bundle.getString(\"${convertCheckClassName(this::class.java)}.message\")\n    }\n\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/AddParenthesesInNestedExpressionCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.annotations.*\n\n@Rule(priority = Priority.MAJOR)\n@ConstantRemediation(\"2min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass AddParenthesesInNestedExpressionCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        subscribeTo(PlSqlGrammar.OR_EXPRESSION)\n    }\n\n    override fun visitNode(node: AstNode) {\n        val andExpressions = node.getChildren(PlSqlGrammar.AND_EXPRESSION)\n        for (andExpression in andExpressions) {\n            addIssue(andExpression, getLocalizedMessage())\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/CharacterDatatypeUsageCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.typeIs\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.PlSqlKeyword\nimport com.felipebz.zpa.api.annotations.*\n\n@Rule(priority = Priority.MINOR, tags = [Tags.OBSOLETE])\n@ConstantRemediation(\"5min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass CharacterDatatypeUsageCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        subscribeTo(PlSqlGrammar.CHARACTER_DATAYPE)\n    }\n\n    override fun visitNode(node: AstNode) {\n        val datatype = node.firstChild\n        if (datatype.typeIs(CHAR_DATATYPE)) {\n            addIssue(node, getLocalizedMessage(), datatype.tokenValue)\n        }\n    }\n\n    companion object {\n        val CHAR_DATATYPE = arrayOf(PlSqlKeyword.CHAR, PlSqlKeyword.VARCHAR)\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/CheckList.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nobject CheckList {\n\n    const val SONAR_WAY_PROFILE = \"Sonar way\"\n\n    val checks: List<Class<*>>\n        get() = listOf(\n                EmptyBlockCheck::class.java,\n                ParsingErrorCheck::class.java,\n                CollapsibleIfStatementsCheck::class.java,\n                InequalityUsageCheck::class.java,\n                ComparisonWithNullCheck::class.java,\n                TooManyRowsHandlerCheck::class.java,\n                InsertWithoutColumnsCheck::class.java,\n                DeclareSectionWithoutDeclarationsCheck::class.java,\n                NvlWithNullParameterCheck::class.java,\n                ComparisonWithBooleanCheck::class.java,\n                CharacterDatatypeUsageCheck::class.java,\n                SelectAllColumnsCheck::class.java,\n                ColumnsShouldHaveTableNameCheck::class.java,\n                SelectWithRownumAndOrderByCheck::class.java,\n                ToDateWithoutFormatCheck::class.java,\n                ExplicitInParameterCheck::class.java,\n                VariableInitializationWithNullCheck::class.java,\n                UselessParenthesisCheck::class.java,\n                IdenticalExpressionCheck::class.java,\n                EmptyStringAssignmentCheck::class.java,\n                DuplicatedValueInInCheck::class.java,\n                VariableInitializationWithFunctionCallCheck::class.java,\n                IfWithExitCheck::class.java,\n                FunctionWithOutParameterCheck::class.java,\n                SameConditionCheck::class.java,\n                AddParenthesesInNestedExpressionCheck::class.java,\n                RaiseStandardExceptionCheck::class.java,\n                NotFoundCheck::class.java,\n                QueryWithoutExceptionHandlingCheck::class.java,\n                UnusedVariableCheck::class.java,\n                VariableHidingCheck::class.java,\n                DbmsOutputPutCheck::class.java,\n                ReturnOfBooleanExpressionCheck::class.java,\n                UnnecessaryElseCheck::class.java,\n                DeadCodeCheck::class.java,\n                ConcatenationWithNullCheck::class.java,\n                SameBranchCheck::class.java,\n                UnusedParameterCheck::class.java,\n                CommitRollbackCheck::class.java,\n                UnnecessaryNullStatementCheck::class.java,\n                DuplicateConditionIfElsifCheck::class.java,\n                UnnecessaryAliasInQueryCheck::class.java,\n                VariableInCountCheck::class.java,\n                UnhandledUserDefinedExceptionCheck::class.java,\n                UnusedCursorCheck::class.java,\n                NotASelectedExpressionCheck::class.java,\n                InvalidReferenceToObjectCheck::class.java,\n                CursorBodyInPackageSpecCheck::class.java,\n                XPathCheck::class.java,\n                VariableNameCheck::class.java,\n                ToCharInOrderByCheck::class.java,\n                DisabledTestCheck::class.java,\n                RedundantExpectationCheck::class.java,\n                UnnecessaryLikeCheck::class.java)\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/CheckUtils.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.flr.api.AstNodeType\nimport com.felipebz.zpa.typeIs\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.PlSqlKeyword\nimport com.felipebz.zpa.api.matchers.MethodMatcher\nimport com.felipebz.zpa.api.squid.SemanticAstNode\nimport com.felipebz.zpa.api.symbols.PlSqlType\n\nobject CheckUtils {\n\n    private val TERMINATION_STATEMENTS = arrayOf<AstNodeType>(PlSqlGrammar.RETURN_STATEMENT, PlSqlGrammar.EXIT_STATEMENT, PlSqlGrammar.CONTINUE_STATEMENT, PlSqlGrammar.RAISE_STATEMENT)\n\n    private val PROGRAM_UNITS = arrayOf<AstNodeType>(PlSqlGrammar.ANONYMOUS_BLOCK, PlSqlGrammar.CREATE_PROCEDURE, PlSqlGrammar.PROCEDURE_DECLARATION, PlSqlGrammar.CREATE_FUNCTION, PlSqlGrammar.FUNCTION_DECLARATION, PlSqlGrammar.CREATE_PACKAGE_BODY)\n\n    private val WHEN = arrayOf<AstNodeType>(PlSqlKeyword.WHEN)\n\n    private val NVL_WITH_NULL_MATCHER = MethodMatcher.create().name(\"nvl\").addParameters(PlSqlType.UNKNOWN, PlSqlType.NULL)\n\n    private val RAISE_APPLICATION_ERROR_MATCHER = MethodMatcher.create().name(\"raise_application_error\").withNoParameterConstraint()\n\n    val terminationStatements: Array<AstNodeType>\n        get() = TERMINATION_STATEMENTS.clone()\n\n    fun isNullLiteralOrEmptyString(node: AstNode): Boolean {\n        return (node as SemanticAstNode).plSqlType === PlSqlType.NULL\n    }\n\n    fun isEmptyString(node: AstNode): Boolean {\n        return node.hasDirectChildren(PlSqlGrammar.CHARACTER_LITERAL) && (node as SemanticAstNode).plSqlType === PlSqlType.NULL\n    }\n\n    @JvmStatic\n    fun equalNodes(node1: AstNode, node2: AstNode): Boolean {\n        val first = skipExpressionsWithoutEffect(node1)\n        val second = skipExpressionsWithoutEffect(node2)\n\n        if (first.type != second.type || first.numberOfChildren != second.numberOfChildren) {\n            return false\n        }\n\n        if (first.numberOfChildren == 0) {\n            return first.token.value == second.token.value\n        }\n\n        val children1 = first.children\n        val children2 = second.children\n        for (i in children1.indices) {\n            if (!equalNodes(children1[i], children2[i])) {\n                return false\n            }\n        }\n        return true\n    }\n\n    fun containsNode(node1: AstNode, node2: AstNode): Boolean {\n        val currentNode = skipParenthesis(node1)\n        val nodeToCheck = skipParenthesis(node2)\n\n        val type = currentNode.type\n\n        val descendants = ArrayList<AstNode>()\n        if (nodeToCheck.type === type) {\n            descendants.add(nodeToCheck)\n        }\n        descendants.addAll(nodeToCheck.getDescendants(type))\n\n        var probableNode: AstNode? = null\n        for (descendant in descendants) {\n            if (descendant.tokenValue.equals(currentNode.tokenValue, ignoreCase = true)) {\n                probableNode = descendant\n            }\n        }\n\n        return probableNode != null && equalNodes(probableNode, currentNode)\n    }\n\n    fun skipExpressionsWithoutEffect(node: AstNode): AstNode {\n        var newNode = skipParenthesis(node)\n        newNode = skipNvlWithNull(newNode)\n        return newNode\n    }\n\n    fun skipParenthesis(node: AstNode): AstNode {\n        return if (node.type === PlSqlGrammar.BRACKED_EXPRESSION) {\n            node.children[1]\n        } else node\n    }\n\n    fun skipNvlWithNull(node: AstNode): AstNode {\n        if (NVL_WITH_NULL_MATCHER.matches(node)) {\n            val arguments = NVL_WITH_NULL_MATCHER.getArgumentsValues(node)\n            return arguments[0]\n        }\n        return node\n    }\n\n    fun isTerminationStatement(node: AstNode): Boolean {\n        return (node.typeIs(TERMINATION_STATEMENTS) || RAISE_APPLICATION_ERROR_MATCHER.matches(node)) && !node.hasDirectChildren(*WHEN)\n    }\n\n    fun isProgramUnit(node: AstNode?): Boolean {\n        return node != null && node.typeIs(PROGRAM_UNITS)\n    }\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/CollapsibleIfStatementsCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.asTree\nimport com.felipebz.zpa.sslr.IfStatement\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.annotations.*\n\n@Rule(priority = Priority.MAJOR, tags = [Tags.CLUMSY])\n@ConstantRemediation(\"5min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass CollapsibleIfStatementsCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        subscribeTo(PlSqlGrammar.IF_STATEMENT)\n    }\n\n    override fun visitNode(node: AstNode) {\n        val ifStatement = node.asTree<IfStatement>()\n        val singleIfChild = singleIfChild(ifStatement)\n        if (singleIfChild != null && !hasElseOrElsif(ifStatement) && !hasElseOrElsif(singleIfChild)) {\n            addIssue(singleIfChild, getLocalizedMessage())\n        }\n    }\n\n    private fun hasElseOrElsif(ifStatement: IfStatement): Boolean {\n        return ifStatement.elsifClauses.isNotEmpty() || ifStatement.elseClause != null\n    }\n\n    private fun singleIfChild(ifStatement: IfStatement): IfStatement? {\n        val statements = ifStatement.statements\n        if (statements.size == 1) {\n            val nestedIf = statements[0].getChildren(PlSqlGrammar.IF_STATEMENT)\n            if (nestedIf.size == 1) {\n                return nestedIf[0].asTree()\n            }\n        }\n        return null\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/ColumnsShouldHaveTableNameCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.typeIs\nimport com.felipebz.zpa.api.DmlGrammar\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.annotations.*\n\n@Rule(priority = Priority.MAJOR)\n@ConstantRemediation(\"2min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass ColumnsShouldHaveTableNameCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        subscribeTo(DmlGrammar.SELECT_COLUMN)\n    }\n\n    override fun visitNode(node: AstNode) {\n        var candidate = node.firstChild\n        if (candidate.hasChildren()) {\n            candidate = candidate.firstChild\n        }\n\n        val selectExpression = node.parentOrNull\n        if (selectExpression != null &&\n            selectExpression.hasDirectChildren(DmlGrammar.FROM_CLAUSE) &&\n            selectExpression.getFirstChild(DmlGrammar.FROM_CLAUSE).getChildren(DmlGrammar.DML_TABLE_EXPRESSION_CLAUSE).size > 1 &&\n            candidate.typeIs(PlSqlGrammar.IDENTIFIER_NAME) &&\n            !candidate.hasDirectChildren(PlSqlGrammar.NON_RESERVED_KEYWORD) &&\n            semantic(candidate).symbol == null) {\n\n            addIssue(candidate, getLocalizedMessage(), candidate.tokenOriginalValue)\n        }\n    }\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/CommitRollbackCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.typeIs\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.PlSqlKeyword\nimport com.felipebz.zpa.api.annotations.*\n\n@Rule(priority = Priority.MAJOR)\n@ConstantRemediation(\"30min\")\n@RuleInfo(scope = RuleInfo.Scope.MAIN)\n@ActivatedByDefault\nclass CommitRollbackCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        subscribeTo(PlSqlGrammar.COMMIT_STATEMENT, PlSqlGrammar.ROLLBACK_STATEMENT)\n    }\n\n    override fun visitNode(node: AstNode) {\n        val scope = context.currentScope\n\n        var outerScope = scope\n        while (outerScope?.outer != null && outerScope.outer?.type != null) {\n            outerScope = outerScope.outer\n        }\n\n        val isRollbackToSavepoint = node.typeIs(PlSqlGrammar.ROLLBACK_STATEMENT) && node.hasDirectChildren(PlSqlKeyword.TO)\n\n        val currentScopeIsAutonomousTransaction = scope?.isAutonomousTransaction ?: false\n        val isInsideABlockStatement = outerScope?.type == PlSqlGrammar.BLOCK_STATEMENT\n\n        if (!isRollbackToSavepoint && !currentScopeIsAutonomousTransaction && !isInsideABlockStatement) {\n            addLineIssue(getLocalizedMessage(), node.tokenLine, node.tokenValue)\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/ComparisonWithBooleanCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.typeIs\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.annotations.*\n\n@Rule(priority = Priority.MINOR)\n@ConstantRemediation(\"2min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass ComparisonWithBooleanCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        subscribeTo(PlSqlGrammar.COMPARISON_EXPRESSION)\n    }\n\n    override fun visitNode(node: AstNode) {\n        val children = node.getChildren(PlSqlGrammar.LITERAL)\n        for (child in children) {\n            if (child.firstChild.typeIs(PlSqlGrammar.BOOLEAN_LITERAL)) {\n                addLineIssue(getLocalizedMessage(), node.tokenLine, child.tokenValue)\n                return\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/ComparisonWithNullCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.typeIs\nimport com.felipebz.zpa.api.ConditionsGrammar\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.annotations.*\n\n@Rule(priority = Priority.BLOCKER, tags = [Tags.BUG])\n@ConstantRemediation(\"5min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass ComparisonWithNullCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        subscribeTo(PlSqlGrammar.COMPARISON_EXPRESSION)\n    }\n\n    override fun visitNode(node: AstNode) {\n        val children = node.getChildren(PlSqlGrammar.LITERAL)\n        for (child in children) {\n            if (CheckUtils.isNullLiteralOrEmptyString(child)) {\n                val operator = node.getFirstChild(ConditionsGrammar.RELATIONAL_OPERATOR)\n                val suggestion = if (operator.firstChild.typeIs(PlSqlGrammar.EQUALS_OPERATOR)) {\n                    \"IS NULL\"\n                } else {\n                    \"IS NOT NULL\"\n                }\n\n                addIssue(node, getLocalizedMessage(), suggestion)\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/ConcatenationWithNullCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.annotations.*\n\n@Rule(priority = Priority.MINOR)\n@ConstantRemediation(\"1min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass ConcatenationWithNullCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        subscribeTo(PlSqlGrammar.CONCATENATION_EXPRESSION)\n    }\n\n    override fun visitNode(node: AstNode) {\n        for (child in node.children) {\n            if (CheckUtils.isNullLiteralOrEmptyString(child)) {\n                addIssue(child, getLocalizedMessage())\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/CursorBodyInPackageSpecCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.api.DmlGrammar\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.annotations.ConstantRemediation\nimport com.felipebz.zpa.api.annotations.Priority\nimport com.felipebz.zpa.api.annotations.Rule\nimport com.felipebz.zpa.api.annotations.RuleInfo\nimport com.felipebz.zpa.api.symbols.Symbol.Kind\n\n@Rule(priority = Priority.MAJOR)\n@ConstantRemediation(\"10min\")\n@RuleInfo(scope = RuleInfo.Scope.MAIN)\nclass CursorBodyInPackageSpecCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        subscribeTo(PlSqlGrammar.CREATE_PACKAGE)\n    }\n\n    override fun visitNode(node: AstNode) {\n        val cursors = context.currentScope?.getSymbols(Kind.CURSOR) ?: emptyList()\n        for (cursor in cursors) {\n            val cursorDeclaration = cursor.declaration.parent\n            if (cursorDeclaration.hasDirectChildren(DmlGrammar.SELECT_EXPRESSION)) {\n                addIssue(cursorDeclaration, getLocalizedMessage(), cursor.name)\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/DbmsOutputPutCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.annotations.*\nimport com.felipebz.zpa.api.matchers.MethodMatcher\n\n@Rule(priority = Priority.MINOR)\n@ConstantRemediation(\"5min\")\n@RuleInfo(scope = RuleInfo.Scope.MAIN)\n@ActivatedByDefault\nclass DbmsOutputPutCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        subscribeTo(PlSqlGrammar.METHOD_CALL)\n    }\n\n    override fun visitNode(node: AstNode) {\n        val put = MethodMatcher.create()\n                .schema(\"sys\").schemaIsOptional()\n                .packageName(\"dbms_output\")\n                .name(\"put\")\n                .addParameter()\n\n        val putLine = MethodMatcher.create()\n                .schema(\"sys\").schemaIsOptional()\n                .packageName(\"dbms_output\")\n                .name(\"put_line\")\n                .addParameter()\n\n        if (!put.matches(node) && !putLine.matches(node)) {\n            return\n        }\n\n        addIssue(node, getLocalizedMessage())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/DeadCodeCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.typeIs\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.annotations.*\n\n@Rule(priority = Priority.MAJOR, tags = [Tags.UNUSED])\n@ConstantRemediation(\"5min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass DeadCodeCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        subscribeTo(*CheckUtils.terminationStatements)\n        subscribeTo(PlSqlGrammar.METHOD_CALL)\n    }\n\n    override fun visitNode(node: AstNode) {\n        if (CheckUtils.isTerminationStatement(node)) {\n            var parent = node.parent\n            while (!checkNode(parent)) {\n                parent = parent.parent\n            }\n        }\n    }\n\n    private fun checkNode(node: AstNode?): Boolean {\n        if (!shouldCheckNode(node) || node == null) {\n            return true\n        }\n        val nextSibling = node.nextSiblingOrNull\n        if (nextSibling != null && nextSibling.typeIs(PlSqlGrammar.STATEMENT)) {\n            addIssue(nextSibling, getLocalizedMessage())\n            return true\n        }\n        return false\n    }\n\n    private fun shouldCheckNode(node: AstNode?): Boolean {\n        if (node == null || CheckUtils.isProgramUnit(node)) {\n            return false\n        }\n\n        return if (node.typeIs(STATEMENT_OR_CALL)) {\n            true\n        } else {\n            node.typeIs(STATEMENT_SECTION) && !node.hasDirectChildren(PlSqlGrammar.EXCEPTION_HANDLERS)\n        }\n    }\n\n    companion object {\n        val STATEMENT_OR_CALL = arrayOf(PlSqlGrammar.STATEMENT, PlSqlGrammar.BLOCK_STATEMENT, PlSqlGrammar.CALL_STATEMENT)\n        val STATEMENT_SECTION = arrayOf(PlSqlGrammar.STATEMENTS_SECTION, PlSqlGrammar.STATEMENTS)\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/DeclareSectionWithoutDeclarationsCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.PlSqlKeyword\nimport com.felipebz.zpa.api.annotations.*\n\n@Rule(priority = Priority.INFO)\n@ConstantRemediation(\"1min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass DeclareSectionWithoutDeclarationsCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        subscribeTo(PlSqlGrammar.BLOCK_STATEMENT)\n    }\n\n    override fun visitNode(node: AstNode) {\n        if (node.hasDirectChildren(PlSqlKeyword.DECLARE) && !node.hasDescendant(PlSqlGrammar.DECLARE_SECTION)) {\n            addIssue(node, getLocalizedMessage())\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/DisabledTestCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.Trivia\nimport com.felipebz.zpa.api.annotations.ActivatedByDefault\nimport com.felipebz.zpa.api.annotations.Priority\nimport com.felipebz.zpa.api.annotations.Rule\nimport com.felipebz.zpa.api.annotations.RuleInfo\n\n@Rule(priority = Priority.MAJOR, tags = [Tags.UTPLSQL])\n@RuleInfo(scope = RuleInfo.Scope.TEST)\n@ActivatedByDefault\nclass DisabledTestCheck : AbstractBaseCheck() {\n\n    override fun visitComment(trivia: Trivia, content: String) {\n        if (content.trim().equals(\"%disabled\", ignoreCase = true)) {\n            addIssue(trivia.token, getLocalizedMessage())\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/DuplicateConditionIfElsifCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.asTree\nimport com.felipebz.zpa.sslr.IfStatement\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.annotations.*\n\n@Rule(priority = Priority.BLOCKER, tags = [Tags.BUG])\n@ConstantRemediation(\"5min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass DuplicateConditionIfElsifCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        subscribeTo(PlSqlGrammar.IF_STATEMENT)\n    }\n\n    override fun visitNode(node: AstNode) {\n        val ifStatement = node.asTree<IfStatement>()\n        val conditions = collectConditionsFromBranches(ifStatement)\n        findSameConditions(conditions)\n    }\n\n    private fun findSameConditions(branches: List<AstNode>) {\n        for (i in 1 until branches.size) {\n            checkCondition(branches, i)\n        }\n    }\n\n    private fun checkCondition(conditions: List<AstNode>, index: Int) {\n        val condition = conditions[index]\n        for (j in 0 until index) {\n            val otherCondition = conditions[j]\n            if (CheckUtils.equalNodes(otherCondition, condition)) {\n                addIssue(condition, getLocalizedMessage(), otherCondition.token.line)\n                        .secondary(otherCondition, \"Original\")\n                return\n            }\n        }\n    }\n\n    private fun collectConditionsFromBranches(ifStatement: IfStatement): List<AstNode> {\n        val conditionsFromBranches = ArrayList<AstNode>()\n\n        conditionsFromBranches.add(ifStatement.condition)\n\n        for (branch in ifStatement.elsifClauses) {\n            conditionsFromBranches.add(branch.condition)\n        }\n\n        return conditionsFromBranches\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/DuplicatedValueInInCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.typeIs\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.PlSqlPunctuator\nimport com.felipebz.zpa.api.annotations.*\n\n@Rule(priority = Priority.BLOCKER, tags = [Tags.BUG])\n@ConstantRemediation(\"5min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass DuplicatedValueInInCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        subscribeTo(PlSqlGrammar.IN_EXPRESSION)\n    }\n\n    override fun visitNode(node: AstNode) {\n        val values = getInValue(node)\n        findSameValues(values)\n    }\n\n    private fun getInValue(inExpression: AstNode): List<AstNode> {\n        val values = ArrayList<AstNode>()\n        var current = inExpression.getFirstChildOrNull(PlSqlPunctuator.LPARENTHESIS)\n        while (current != null) {\n            current = current.nextSibling\n\n            if (current.typeIs(PlSqlPunctuator.RPARENTHESIS)) {\n                current = null\n            } else if (!current.typeIs(PlSqlPunctuator.COMMA)) {\n                values.add(current)\n            }\n        }\n        return values\n    }\n\n    private fun findSameValues(values: List<AstNode>) {\n        for (i in 1 until values.size) {\n            checkValue(values, i)\n        }\n    }\n\n    private fun checkValue(values: List<AstNode>, index: Int) {\n        val current = values[index]\n\n        for (j in 0 until index) {\n            val other = values[j]\n\n            if (CheckUtils.equalNodes(current, other)) {\n                addIssue(current, getLocalizedMessage(), current.tokenOriginalValue)\n                        .secondary(other, \"Original\")\n                return\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/EmptyBlockCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.isOf\nimport com.felipebz.zpa.sslr.NullStatement\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.annotations.*\n\n@Rule(priority = Priority.MINOR, tags = [Tags.UNUSED])\n@ConstantRemediation(\"5min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass EmptyBlockCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        subscribeTo(PlSqlGrammar.STATEMENTS_SECTION)\n    }\n\n    override fun visitNode(node: AstNode) {\n        if (context.currentScope?.isOverridingMember == true) {\n            return\n        }\n\n        val statements = node.getFirstChild(PlSqlGrammar.STATEMENTS).getChildren(PlSqlGrammar.STATEMENT)\n        if (statements.size == 1) {\n            val statement = statements[0]\n            if (statement.isOf<NullStatement>()) {\n                addIssue(statement, getLocalizedMessage())\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/EmptyStringAssignmentCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.annotations.*\n\n@Rule(priority = Priority.MINOR)\n@ConstantRemediation(\"2min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass EmptyStringAssignmentCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        subscribeTo(PlSqlGrammar.ASSIGNMENT_STATEMENT)\n    }\n\n    override fun visitNode(node: AstNode) {\n        val value = node.getLastChildOrNull(PlSqlGrammar.LITERAL)\n\n        if (value != null && CheckUtils.isEmptyString(value)) {\n            addIssue(node, getLocalizedMessage())\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/ExplicitInParameterCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.PlSqlKeyword\nimport com.felipebz.zpa.api.annotations.*\n\n@Rule(priority = Priority.MINOR)\n@ConstantRemediation(\"2min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass ExplicitInParameterCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        subscribeTo(PlSqlGrammar.PARAMETER_DECLARATION)\n    }\n\n    override fun visitNode(node: AstNode) {\n        if (!node.hasDirectChildren(PlSqlKeyword.IN, PlSqlKeyword.OUT)) {\n            addIssue(node, getLocalizedMessage())\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/FunctionWithOutParameterCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.PlSqlKeyword\nimport com.felipebz.zpa.api.annotations.*\n\n@Rule(priority = Priority.MAJOR)\n@ConstantRemediation(\"1h\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass FunctionWithOutParameterCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        subscribeTo(PlSqlGrammar.PARAMETER_DECLARATION)\n    }\n\n    override fun visitNode(node: AstNode) {\n        if (node.parent.hasParent(PlSqlGrammar.FUNCTION_DECLARATION, PlSqlGrammar.CREATE_FUNCTION) && node.hasDirectChildren(PlSqlKeyword.OUT)) {\n            addIssue(node, getLocalizedMessage())\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/IdenticalExpressionCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.api.ConditionsGrammar\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.annotations.*\n\n@Rule(priority = Priority.BLOCKER, tags = [Tags.BUG])\n@ConstantRemediation(\"2min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass IdenticalExpressionCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        subscribeTo(PlSqlGrammar.COMPARISON_EXPRESSION)\n    }\n\n    override fun visitNode(node: AstNode) {\n        val operator = node.getFirstChildOrNull(ConditionsGrammar.RELATIONAL_OPERATOR)\n        if (operator != null) {\n\n            val leftSide = node.firstChild\n            val rightSide = node.lastChild\n\n            if (CheckUtils.equalNodes(leftSide, rightSide)) {\n                addIssue(leftSide, getLocalizedMessage(), operator.tokenValue)\n                        .secondary(rightSide, \"Original\")\n            }\n\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/IfWithExitCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.sslr.IfStatement\nimport com.felipebz.zpa.tryGetAsTree\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.annotations.*\n\n@Rule(priority = Priority.MINOR)\n@ConstantRemediation(\"5min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass IfWithExitCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        subscribeTo(PlSqlGrammar.EXIT_STATEMENT)\n    }\n\n    override fun visitNode(node: AstNode) {\n        val statement = node.parent\n        val ifStatement = statement.parent.parent.tryGetAsTree<IfStatement>()\n        if (ifStatement != null &&\n                ifStatement.elsifClauses.isEmpty() && ifStatement.elseClause == null &&\n                ifStatement.statements.size == 1) {\n            addIssue(ifStatement, getLocalizedMessage())\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/InequalityUsageCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.annotations.*\n\n@Rule(priority = Priority.MAJOR, tags = [Tags.OBSOLETE])\n@ConstantRemediation(\"5min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass InequalityUsageCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        subscribeTo(PlSqlGrammar.NOTEQUALS_NONSTANDARD_OPERATOR)\n    }\n\n    override fun visitNode(node: AstNode) {\n        addLineIssue(getLocalizedMessage(), node.tokenLine, node.tokens.joinToString(\"\") { it.value })\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/InsertWithoutColumnsCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.api.DmlGrammar\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.annotations.*\nimport com.felipebz.zpa.api.symbols.PlSqlType\n\n@Rule(priority = Priority.CRITICAL, tags = [Tags.CONVENTION, Tags.BUG])\n@ConstantRemediation(\"5min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass InsertWithoutColumnsCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        subscribeTo(DmlGrammar.SINGLE_TABLE_INSERT)\n    }\n\n    override fun visitNode(node: AstNode) {\n        if (!node.hasDescendant(DmlGrammar.INSERT_COLUMNS)) {\n            val valuesClause = node.getFirstChildOrNull(DmlGrammar.VALUES_CLAUSE);\n\n            if (valuesClause != null &&\n                semantic(valuesClause.lastChild).plSqlType === PlSqlType.ROWTYPE) {\n                return\n            }\n\n            if (node.parent.parent.parent.type === PlSqlGrammar.FORALL_STATEMENT) {\n                return\n            }\n\n            addIssue(node, getLocalizedMessage())\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/InvalidReferenceToObjectCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.FormsMetadataAwareCheck\nimport com.felipebz.zpa.typeIs\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.annotations.*\nimport com.felipebz.zpa.api.matchers.MethodMatcher\nimport java.util.*\n\n@Rule(priority = Priority.MAJOR, tags = [Tags.BUG])\n@ConstantRemediation(\"5min\")\n@RuleInfo(scope = RuleInfo.Scope.MAIN)\n@ActivatedByDefault\nclass InvalidReferenceToObjectCheck : AbstractBaseCheck(), FormsMetadataAwareCheck {\n\n    private val verifiers = listOf(\n            Verifier(MethodMatcher.create().name(\"find_alert\").addParameter(), ObjectType.ALERT),\n            Verifier(MethodMatcher.create().name(\"set_alert_button_property\").addParameters(4), ObjectType.ALERT),\n            Verifier(MethodMatcher.create().name(\"set_alert_property\").addParameters(3), ObjectType.ALERT),\n            Verifier(MethodMatcher.create().name(\"show_alert\").addParameter(), ObjectType.ALERT),\n\n            Verifier(MethodMatcher.create().name(\"find_lov\").addParameter(), ObjectType.LOV),\n            Verifier(MethodMatcher.create().name(\"get_lov_property\").addParameters(2), ObjectType.LOV),\n            Verifier(MethodMatcher.create().name(\"set_lov_column_property\").addParameters(4), ObjectType.LOV),\n            Verifier(MethodMatcher.create().name(\"set_lov_property\").addParameters(3), ObjectType.LOV),\n            Verifier(MethodMatcher.create().name(\"set_lov_property\").addParameters(4), ObjectType.LOV),\n            Verifier(MethodMatcher.create().name(\"show_lov\").addParameter(), ObjectType.LOV),\n\n            Verifier(MethodMatcher.create().name(\"find_block\").addParameter(), ObjectType.BLOCK),\n            Verifier(MethodMatcher.create().name(\"get_block_property\").addParameters(2), ObjectType.BLOCK),\n            Verifier(MethodMatcher.create().name(\"go_block\").addParameter(), ObjectType.BLOCK),\n            Verifier(MethodMatcher.create().name(\"set_block_property\").addParameters(3), ObjectType.BLOCK),\n            Verifier(MethodMatcher.create().name(\"set_block_property\").addParameters(4), ObjectType.BLOCK),\n\n            Verifier(MethodMatcher.create().name(\"checkbox_checked\").addParameter(), ObjectType.ITEM),\n            Verifier(MethodMatcher.create().name(\"convert_other_value\").addParameter(), ObjectType.ITEM),\n            Verifier(MethodMatcher.create().name(\"display_item\").addParameters(2), ObjectType.ITEM),\n            Verifier(MethodMatcher.create().name(\"find_item\").addParameter(), ObjectType.ITEM),\n            Verifier(MethodMatcher.create().name(\"get_item_instance_property\").addParameters(3), ObjectType.ITEM),\n            Verifier(MethodMatcher.create().name(\"get_item_property\").addParameters(2), ObjectType.ITEM),\n            Verifier(MethodMatcher.create().name(\"get_radio_button_property\").addParameters(3), ObjectType.ITEM),\n            Verifier(MethodMatcher.create().name(\"go_item\").addParameter(), ObjectType.ITEM),\n            Verifier(MethodMatcher.create().name(\"image_scroll\").addParameters(3), ObjectType.ITEM),\n            Verifier(MethodMatcher.create().name(\"image_zoom\").addParameters(2), ObjectType.ITEM),\n            Verifier(MethodMatcher.create().name(\"image_zoom\").addParameters(3), ObjectType.ITEM),\n            Verifier(MethodMatcher.create().name(\"play_sound\").addParameter(), ObjectType.ITEM),\n            Verifier(MethodMatcher.create().name(\"read_image_file\").addParameters(3), 3, ObjectType.ITEM),\n            Verifier(MethodMatcher.create().name(\"read_sound_file\").addParameters(3), 3, ObjectType.ITEM),\n            Verifier(MethodMatcher.create().name(\"recalculate\").addParameter(), ObjectType.ITEM),\n            Verifier(MethodMatcher.create().name(\"set_item_instance_property\").addParameters(4), ObjectType.ITEM),\n            Verifier(MethodMatcher.create().name(\"set_item_property\").addParameters(3), ObjectType.ITEM),\n            Verifier(MethodMatcher.create().name(\"set_item_property\").addParameters(4), ObjectType.ITEM),\n            Verifier(MethodMatcher.create().name(\"set_radio_button_property\").addParameters(4), ObjectType.ITEM),\n            Verifier(MethodMatcher.create().name(\"set_radio_button_property\").addParameters(5), ObjectType.ITEM),\n            Verifier(MethodMatcher.create().name(\"write_image_file\").addParameters(5), 3, ObjectType.ITEM),\n            Verifier(MethodMatcher.create().name(\"write_sound_file\").addParameters(5), 3, ObjectType.ITEM)\n    )\n\n    override fun init() {\n        subscribeTo(PlSqlGrammar.METHOD_CALL)\n    }\n\n    override fun visitNode(node: AstNode) {\n        val verifier = verifiers.firstOrNull { v -> v.matcher.matches(node) }\n\n        if (verifier != null) {\n            val argument = verifier.matcher.getArgumentsValues(node)[verifier.argumentToCheck]\n            if (!isVarcharLiteral(argument)) {\n                return\n            }\n\n            val value = argument.tokenOriginalValue.replace(\"'\", \"\")\n\n            val reportIssue = when (verifier.type) {\n                ObjectType.ALERT -> validateAlert(value)\n                ObjectType.BLOCK -> validateBlock(value)\n                ObjectType.ITEM -> validateItem(value)\n                ObjectType.LOV -> validateLov(value)\n            }\n\n            if (reportIssue) {\n                addIssue(argument, getLocalizedMessage(), value,\n                    verifier.matcher.methodName.uppercase(Locale.getDefault())\n                )\n\n            }\n\n        }\n    }\n\n    private fun validateAlert(value: String): Boolean {\n        return context.formsMetadata?.alerts?.none { alert -> alert.equals(value, ignoreCase = true) } ?: false\n    }\n\n    private fun validateBlock(value: String): Boolean {\n        return context.formsMetadata?.blocks?.none { block -> block.name.equals(value, ignoreCase = true) } ?: false\n    }\n\n    private fun validateItem(value: String): Boolean {\n        val formsMetadata = context.formsMetadata ?: return false\n\n        var reportIssue = true\n        for (block in formsMetadata.blocks) {\n            if (block.items.any { item ->\n                        val fullName = \"${block.name}.$item\"\n                        fullName.equals(value, ignoreCase = true)\n                    }) {\n                reportIssue = false\n            }\n        }\n        return reportIssue\n    }\n\n    private fun validateLov(value: String): Boolean {\n        return context.formsMetadata?.lovs?.none { lov -> lov.equals(value, ignoreCase = true) } ?: false\n    }\n\n    private enum class ObjectType {\n        ALERT, BLOCK, ITEM, LOV\n    }\n\n    private inner class Verifier(val matcher: MethodMatcher, argumentToCheck: Int, val type: ObjectType) {\n        val argumentToCheck: Int = argumentToCheck - 1\n\n        constructor(matcher: MethodMatcher, type: ObjectType) : this(matcher, 1, type)\n    }\n\n    private fun isVarcharLiteral(argument: AstNode): Boolean {\n        return if (argument.typeIs(PlSqlGrammar.LITERAL)) {\n            argument.hasDirectChildren(PlSqlGrammar.CHARACTER_LITERAL)\n        } else false\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/NotASelectedExpressionCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.typeIs\nimport com.felipebz.zpa.api.DmlGrammar\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.PlSqlKeyword\nimport com.felipebz.zpa.api.annotations.*\n\n@Rule(priority = Priority.CRITICAL, tags = [Tags.BUG])\n@ConstantRemediation(\"5min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass NotASelectedExpressionCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        subscribeTo(DmlGrammar.SELECT_EXPRESSION)\n    }\n\n    override fun visitNode(node: AstNode) {\n        val firstQueryBlock = node.getFirstChild(DmlGrammar.QUERY_BLOCK)\n        if (!firstQueryBlock.children[1].typeIs(PlSqlKeyword.DISTINCT) || !node.hasDirectChildren(DmlGrammar.ORDER_BY_CLAUSE)) {\n            return\n        }\n\n        val columns = firstQueryBlock.getChildren(DmlGrammar.SELECT_COLUMN)\n        val orderByItems = node.getFirstChild(DmlGrammar.ORDER_BY_CLAUSE).getChildren(DmlGrammar.ORDER_BY_ITEM)\n\n        for (orderByItem in orderByItems) {\n            checkOrderByItem(orderByItem, columns)\n        }\n    }\n\n    private fun checkOrderByItem(orderByItem: AstNode, columns: List<AstNode>) {\n        val orderByItemValue = skipVariableName(orderByItem.firstChild)\n\n        if (orderByItemValue.typeIs(PlSqlGrammar.LITERAL)) {\n            return\n        }\n\n        var found = false\n        for (column in columns) {\n            val candidates = extractAcceptableValuesFromColumn(column)\n\n            for (candidate in candidates) {\n                if (CheckUtils.containsNode(candidate, orderByItemValue)) {\n                    found = true\n                }\n            }\n        }\n\n        if (!found) {\n            addIssue(orderByItemValue, getLocalizedMessage())\n        }\n    }\n\n    private fun skipVariableName(node: AstNode): AstNode {\n        return if (node.typeIs(PlSqlGrammar.VARIABLE_NAME)) {\n            node.firstChild\n        } else node\n    }\n\n    private fun extractAcceptableValuesFromColumn(column: AstNode): List<AstNode> {\n        val values = ArrayList<AstNode>()\n\n        val selectedExpression = skipVariableName(column.firstChild)\n        values.add(selectedExpression)\n\n        // if the value is \"table.column\", \"column\" can be used in order by\n        if (selectedExpression.typeIs(PlSqlGrammar.MEMBER_EXPRESSION)) {\n            values.add(selectedExpression.lastChild)\n        }\n\n        if (column.numberOfChildren > 1) {\n            val alias = skipVariableName(column.lastChild)\n            values.add(alias)\n        }\n\n        return values\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/NotFoundCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.typeIs\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.PlSqlPunctuator\nimport com.felipebz.zpa.api.annotations.*\n\n@Rule(priority = Priority.MINOR)\n@ConstantRemediation(\"5min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass NotFoundCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        subscribeTo(PlSqlGrammar.MEMBER_EXPRESSION)\n    }\n\n    override fun visitNode(node: AstNode) {\n        val parent = node.parent\n        if (parent.typeIs(PlSqlGrammar.NOT_EXPRESSION) && node.numberOfChildren == 3) {\n\n            val foundCandidate = node.lastChild\n            val percentCandidate = foundCandidate.previousAstNode\n\n            if (percentCandidate.typeIs(PlSqlPunctuator.MOD) && \"FOUND\" == foundCandidate.tokenValue) {\n                addIssue(node, getLocalizedMessage())\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/NvlWithNullParameterCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.annotations.*\nimport com.felipebz.zpa.api.matchers.MethodMatcher\n\n@Rule(priority = Priority.BLOCKER, tags = [Tags.BUG])\n@ConstantRemediation(\"5min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass NvlWithNullParameterCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        subscribeTo(PlSqlGrammar.METHOD_CALL)\n    }\n\n    override fun visitNode(node: AstNode) {\n        val nvl = MethodMatcher.create().name(\"nvl\").addParameters(2)\n\n        if (!nvl.matches(node)) {\n            return\n        }\n\n        for (argument in nvl.getArgumentsValues(node)) {\n            if (CheckUtils.isNullLiteralOrEmptyString(argument)) {\n                addIssue(node, getLocalizedMessage(), argument.tokenValue)\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/ParsingErrorCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.annotations.Priority\nimport com.felipebz.zpa.api.annotations.Rule\nimport com.felipebz.zpa.api.annotations.RuleInfo\n\n@Rule(priority = Priority.INFO)\n@RuleInfo(scope = RuleInfo.Scope.ALL)\nclass ParsingErrorCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        val parsingException = context.parsingException()\n        if (parsingException != null) {\n            parsingException.message?.let {\n                addLineIssue(it, parsingException.line)\n            }\n        }\n\n        subscribeTo(PlSqlGrammar.RECOVERY)\n    }\n\n    override fun visitNode(node: AstNode) {\n        addIssue(node, getLocalizedMessage())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/QueryWithoutExceptionHandlingCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.typeIs\nimport com.felipebz.zpa.api.DmlGrammar\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.PlSqlKeyword\nimport com.felipebz.zpa.api.annotations.*\n\n@Rule(priority = Priority.CRITICAL)\n@ConstantRemediation(\"20min\")\n@RuleInfo(scope = RuleInfo.Scope.MAIN)\n@ActivatedByDefault\nclass QueryWithoutExceptionHandlingCheck : AbstractBaseCheck() {\n\n    @RuleProperty(key = \"strict\", defaultValue = \"true\")\n    var strictMode = true\n\n    override fun init() {\n        subscribeTo(PlSqlGrammar.SELECT_STATEMENT)\n    }\n\n    override fun visitNode(node: AstNode) {\n        val intoClause = node.getFirstDescendantOrNull(DmlGrammar.INTO_CLAUSE)\n        if (intoClause?.firstChild.typeIs(PlSqlKeyword.BULK)) {\n            return\n        }\n\n        if (strictMode) {\n            val parentBlock = node.getFirstAncestorOrNull(PlSqlGrammar.STATEMENTS_SECTION)\n\n            if (parentBlock?.hasDirectChildren(PlSqlGrammar.EXCEPTION_HANDLERS) == false) {\n                addIssue(node, getLocalizedMessage())\n            }\n        } else {\n            val hasExceptionHandler = context.currentScope?.hasExceptionHandler ?: false\n            if (!hasExceptionHandler) {\n                addIssue(node, getLocalizedMessage())\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/RaiseStandardExceptionCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.asTree\nimport com.felipebz.zpa.sslr.RaiseStatement\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.annotations.*\n\n@Rule(priority = Priority.MAJOR)\n@ConstantRemediation(\"20min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass RaiseStandardExceptionCheck : AbstractBaseCheck() {\n\n    private val standardExceptions = listOf(\n            \"ACCESS_INTO_NULL\",\n            \"CASE_NOT_FOUND\",\n            \"COLLECTION_IS_NULL\",\n            \"CURSOR_ALREADY_OPEN\",\n            \"DUP_VAL_ON_INDEX\",\n            \"INVALID_CURSOR\",\n            \"INVALID_NUMBER\",\n            \"LOGIN_DENIED\",\n            \"NO_DATA_FOUND\",\n            \"NOT_LOGGED_ON\",\n            \"PROGRAM_ERROR\",\n            \"ROWTYPE_MISMATCH\",\n            \"SELF_IS_NULL\",\n            \"STORAGE_ERROR\",\n            \"SUBSCRIPT_BEYOND_COUNT\",\n            \"SUBSCRIPT_OUTSIDE_LIMIT\",\n            \"SYS_INVALID_ROWID\",\n            \"TIMEOUT_ON_RESOURCE\",\n            \"TOO_MANY_ROWS\",\n            \"VALUE_ERROR\",\n            \"ZERO_DIVIDE\")\n\n    override fun init() {\n        subscribeTo(PlSqlGrammar.RAISE_STATEMENT)\n    }\n\n    override fun visitNode(node: AstNode) {\n        val statement = node.asTree<RaiseStatement>()\n        val exceptionIdentifier = statement.exception\n        if (exceptionIdentifier != null) {\n            val exceptionName = exceptionIdentifier.tokenValue\n\n            if (standardExceptions.contains(exceptionName)) {\n                addLineIssue(getLocalizedMessage(), exceptionIdentifier.tokenLine, exceptionName)\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/RedundantExpectationCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.annotations.*\nimport com.felipebz.zpa.api.matchers.MethodMatcher\n\n@Rule(priority = Priority.MAJOR, tags = [Tags.UTPLSQL, Tags.BUG])\n@ConstantRemediation(\"5min\")\n@RuleInfo(scope = RuleInfo.Scope.TEST)\n@ActivatedByDefault\nclass RedundantExpectationCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        subscribeTo(PlSqlGrammar.METHOD_CALL)\n    }\n\n    override fun visitNode(node: AstNode) {\n        if (expectMatcher.matches(node)) {\n            val expectationNode = node.nextSibling.nextSibling\n\n            val actualValue = expectMatcher.getArgumentsValues(node)[0]\n\n            val matcherArguments = expectMatcher.getArgumentsValues(expectationNode)\n            if (matcherArguments.isEmpty()) {\n                return\n            }\n\n            val expectedValue = matcherArguments[0]\n            if (CheckUtils.equalNodes(actualValue, expectedValue)) {\n                addIssue(actualValue, getLocalizedMessage()).secondary(expectedValue, \"Expected value\")\n            }\n        }\n    }\n\n    companion object {\n        private val expectMatcher = MethodMatcher.create()\n            .packageName(\"UT\")\n            .name(\"EXPECT\")\n            .withNoParameterConstraint()\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/ReturnOfBooleanExpressionCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.asTree\nimport com.felipebz.zpa.sslr.IfStatement\nimport com.felipebz.zpa.sslr.TreeWithStatements\nimport com.felipebz.zpa.typeIs\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.annotations.*\n\n@Rule(priority = Priority.MINOR, tags = [Tags.CLUMSY])\n@ConstantRemediation(\"2min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass ReturnOfBooleanExpressionCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        subscribeTo(PlSqlGrammar.IF_STATEMENT)\n    }\n\n    override fun visitNode(node: AstNode) {\n        val ifStatement = node.asTree<IfStatement>()\n\n        val elseClause = ifStatement.elseClause\n        if (!hasElsif(ifStatement) && elseClause != null) {\n            val firstBoolean = getBooleanValue(ifStatement)\n            val secondBoolean = getBooleanValue(elseClause)\n\n            if (firstBoolean != null && secondBoolean != null\n                    && firstBoolean.tokenValue != secondBoolean.tokenValue) {\n                addIssue(node, getLocalizedMessage())\n            }\n        }\n    }\n\n    private fun hasElsif(ifStatement: IfStatement): Boolean {\n        return ifStatement.elsifClauses.isNotEmpty()\n    }\n\n    private fun getBooleanValue(node: TreeWithStatements): AstNode? {\n        return extractBooleanValueFromReturn(getStatementFrom(node))\n    }\n\n    private fun getStatementFrom(node: TreeWithStatements): AstNode? {\n        val statements = node.statements\n        return if (statements.size == 1) {\n            statements[0]\n        } else null\n    }\n\n    private fun extractBooleanValueFromReturn(node: AstNode?): AstNode? {\n        if (node != null) {\n            val child = node.firstChild\n            if (child.typeIs(PlSqlGrammar.RETURN_STATEMENT)) {\n                val expression = child.getFirstChildOrNull(PlSqlGrammar.LITERAL)\n\n                return getBooleanLiteral(expression)\n            }\n        }\n        return null\n    }\n\n    private fun getBooleanLiteral(expression: AstNode?): AstNode? {\n        return expression?.getFirstChildOrNull(PlSqlGrammar.BOOLEAN_LITERAL)\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/SameBranchCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.asTree\nimport com.felipebz.zpa.sslr.IfStatement\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.annotations.*\n\n@Rule(priority = Priority.MAJOR, tags = [Tags.BUG])\n@ConstantRemediation(\"10min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass SameBranchCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        subscribeTo(PlSqlGrammar.IF_STATEMENT)\n    }\n\n    override fun visitNode(node: AstNode) {\n        val ifStatement = node.asTree<IfStatement>()\n        val branches = collectStatementsFromBranches(ifStatement)\n        findSameBranches(branches)\n    }\n\n    private fun findSameBranches(branches: List<AstNode>) {\n        for (i in 1 until branches.size) {\n            checkBranch(branches, i)\n        }\n    }\n\n    private fun checkBranch(branches: List<AstNode>, index: Int) {\n        val branch = branches[index]\n        val previousBranchIndex = index - 1\n        val otherBranch = branches[previousBranchIndex]\n        if (CheckUtils.equalNodes(otherBranch, branch)) {\n            addIssue(branch, getLocalizedMessage(), otherBranch.token.line)\n                    .secondary(otherBranch, \"Original\")\n        }\n    }\n\n    private fun collectStatementsFromBranches(ifStatement: IfStatement): List<AstNode> {\n        val statementsFromBranches = ArrayList<AstNode>()\n\n        statementsFromBranches.add(ifStatement.statements.astNode)\n\n        for (branch in ifStatement.elsifClauses) {\n            statementsFromBranches.add(branch.statements.astNode)\n        }\n\n        val elseBranch = ifStatement.elseClause\n        if (elseBranch != null) {\n            statementsFromBranches.add(elseBranch.statements.astNode)\n        }\n\n        return statementsFromBranches\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/SameConditionCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.typeIs\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.PlSqlKeyword\nimport com.felipebz.zpa.api.annotations.*\n\n@Rule(priority = Priority.BLOCKER, tags = [Tags.BUG])\n@ConstantRemediation(\"5min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass SameConditionCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        subscribeTo(PlSqlGrammar.AND_EXPRESSION)\n        subscribeTo(PlSqlGrammar.OR_EXPRESSION)\n    }\n\n    override fun visitNode(node: AstNode) {\n        val expressions = getExpressions(node)\n        findSameConditions(expressions)\n    }\n\n    private fun findSameConditions(conditions: List<AstNode>) {\n        for (i in 1 until conditions.size) {\n            checkCondition(conditions, i)\n        }\n    }\n\n    private fun checkCondition(conditions: List<AstNode>, index: Int) {\n        val condition = conditions[index]\n        for (j in 0 until index) {\n            val otherCondition = conditions[j]\n            if (CheckUtils.equalNodes(otherCondition, condition)) {\n                addIssue(condition, getLocalizedMessage(), otherCondition.token.line)\n                        .secondary(otherCondition, \"Original\")\n                return\n            }\n        }\n    }\n\n    private fun getExpressions(node: AstNode): List<AstNode> {\n        val expressions = ArrayList<AstNode>()\n        for (subnode in node.children) {\n            if (!subnode.typeIs(PlSqlKeyword.AND) && !subnode.typeIs(PlSqlKeyword.OR)) {\n                expressions.add(subnode)\n            }\n        }\n        return expressions\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/SelectAllColumnsCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.typeIs\nimport com.felipebz.zpa.api.DmlGrammar\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.PlSqlPunctuator\nimport com.felipebz.zpa.api.annotations.*\nimport com.felipebz.zpa.api.symbols.PlSqlType\n\n@Rule(priority = Priority.MAJOR, tags = [Tags.PERFORMANCE])\n@ConstantRemediation(\"30min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass SelectAllColumnsCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        subscribeTo(DmlGrammar.SELECT_COLUMN)\n    }\n\n    override fun visitNode(node: AstNode) {\n        val topParent = node.parent.parent.parent\n        if (topParent.typeIs(PlSqlGrammar.EXISTS_EXPRESSION)) {\n            return\n        }\n\n        if (topParent.typeIs(PlSqlGrammar.CURSOR_DECLARATION)) {\n\n            // TODO this is very complex and it probably can be simplified in the future\n            val fetchDestination = semantic(topParent.getFirstChild(PlSqlGrammar.IDENTIFIER_NAME))\n                .symbol?.usages.orEmpty()\n                .map { it.parent.parent }\n                .filter { it.typeIs(PlSqlGrammar.FETCH_STATEMENT) }\n                .map { it.getFirstChild(DmlGrammar.INTO_CLAUSE).getFirstChildOrNull(PlSqlGrammar.VARIABLE_NAME) }\n                .firstOrNull()\n\n            if (fetchDestination != null && semantic(fetchDestination).plSqlType == PlSqlType.ROWTYPE) {\n                return\n            }\n        }\n\n        var candidate = node.firstChild\n\n        if (candidate.typeIs(PlSqlGrammar.OBJECT_REFERENCE)) {\n            candidate = candidate.lastChild\n        }\n\n        if (candidate.typeIs(PlSqlPunctuator.MULTIPLICATION)) {\n            val intoClause = node.parent.getFirstChildOrNull(DmlGrammar.INTO_CLAUSE)\n\n            if (intoClause != null) {\n                val variablesInInto = intoClause.getChildren(PlSqlGrammar.VARIABLE_NAME, PlSqlGrammar.MEMBER_EXPRESSION, PlSqlGrammar.METHOD_CALL)\n                val type = semantic(variablesInInto[0]).plSqlType\n                if (variablesInInto.size == 1 && (type == PlSqlType.ROWTYPE || type == PlSqlType.ASSOCIATIVE_ARRAY)) {\n                    return\n                }\n            }\n\n            addIssue(node, getLocalizedMessage())\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/SelectWithRownumAndOrderByCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.api.DmlGrammar\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.annotations.*\n\n@Rule(priority = Priority.BLOCKER, tags = [Tags.BUG])\n@ConstantRemediation(\"20min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass SelectWithRownumAndOrderByCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        subscribeTo(DmlGrammar.SELECT_EXPRESSION)\n    }\n\n    override fun visitNode(node: AstNode) {\n        if (!hasOrderByClause(node)) {\n            return\n        }\n\n        val queryBlock = node.getFirstChild(DmlGrammar.QUERY_BLOCK)\n\n        val whereClause = queryBlock.getChildren(DmlGrammar.WHERE_CLAUSE)\n        if (whereClause.isEmpty()) {\n            return\n        }\n\n        val whereComparisonConditions = whereClause[0].getDescendants(PlSqlGrammar.COMPARISON_EXPRESSION)\n        if (whereComparisonConditions.isEmpty()) {\n            return\n        }\n\n        for (comparison in whereComparisonConditions) {\n            for (child in comparison.getChildren(PlSqlGrammar.VARIABLE_NAME)) {\n                if (\"rownum\".equals(child.tokenValue, ignoreCase = true) && node == child.getFirstAncestor(DmlGrammar.SELECT_EXPRESSION)) {\n                    addIssue(comparison, getLocalizedMessage())\n                }\n            }\n        }\n    }\n\n    private fun hasOrderByClause(node: AstNode): Boolean {\n        return node.hasDirectChildren(DmlGrammar.ORDER_BY_CLAUSE)\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/Tags.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nobject Tags {\n    const val BRAIN_OVERLOAD = \"brain-overload\"\n    const val BUG = \"bug\"\n    const val CLUMSY = \"clumsy\"\n    const val CONVENTION = \"convention\"\n    const val OBSOLETE = \"obsolete\"\n    const val SECURITY = \"security\"\n    const val UNUSED = \"unused\"\n    const val CERT = \"cert\"\n    const val PITFALL = \"pitfall\"\n    const val MISRA = \"misra\"\n    const val CONFUSING = \"confusing\"\n    const val CWE = \"cwe\"\n    const val PERFORMANCE = \"performance\"\n    const val UTPLSQL = \"utplsql\"\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/ToCharInOrderByCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.api.DmlGrammar\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.annotations.*\nimport com.felipebz.zpa.api.matchers.MethodMatcher\nimport com.felipebz.zpa.api.symbols.PlSqlType\n\n@Rule(priority = Priority.MAJOR, tags = [Tags.BUG])\n@ConstantRemediation(\"5min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass ToCharInOrderByCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        subscribeTo(DmlGrammar.ORDER_BY_ITEM)\n    }\n\n    override fun visitNode(node: AstNode) {\n        val expression = node.firstChild\n\n        if (toChar.matches(expression)) {\n            addIssue(node, getLocalizedMessage())\n        }\n\n        if (expression.type === PlSqlGrammar.LITERAL && semantic(expression).plSqlType === PlSqlType.NUMERIC) {\n            val index = Integer.parseInt(expression.tokenOriginalValue)\n\n            val selectExpression = node.getFirstAncestor(DmlGrammar.SELECT_EXPRESSION)\n            val queryBlock = selectExpression.getFirstChild(DmlGrammar.QUERY_BLOCK)\n            val columns = queryBlock.getChildren(DmlGrammar.SELECT_COLUMN)\n\n            if (index > 0 && index <= columns.size) {\n                val selectColumn = columns[index - 1].firstChild\n\n                if (toChar.matches(selectColumn)) {\n                    addIssue(node, getLocalizedMessage())\n                }\n            }\n        }\n    }\n\n    companion object {\n        private val toChar = MethodMatcher.create().name(\"to_char\").withNoParameterConstraint()\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/ToDateWithoutFormatCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.SingleRowSqlFunctionsGrammar\nimport com.felipebz.zpa.api.annotations.*\n\n@Rule(priority = Priority.MAJOR, tags = [Tags.BUG])\n@ConstantRemediation(\"5min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass ToDateWithoutFormatCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        subscribeTo(SingleRowSqlFunctionsGrammar.TO_DATE_EXPRESSION)\n    }\n\n    override fun visitNode(node: AstNode) {\n        val arguments = node.getChildren(PlSqlGrammar.ARGUMENT)\n        if (arguments.size == 1 && !CheckUtils.isNullLiteralOrEmptyString(arguments.first().lastChild)) {\n            addIssue(node, getLocalizedMessage())\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/TooManyRowsHandlerCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.isOf\nimport com.felipebz.zpa.sslr.NullStatement\nimport com.felipebz.zpa.typeIs\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.annotations.*\n\n@Rule(priority = Priority.CRITICAL, tags = [Tags.BUG])\n@ConstantRemediation(\"5min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass TooManyRowsHandlerCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        subscribeTo(PlSqlGrammar.EXCEPTION_HANDLER)\n    }\n\n    override fun visitNode(node: AstNode) {\n        // is a TOO_MANY_ROWS handler\n        val exceptions = node.getChildren(PlSqlGrammar.VARIABLE_NAME)\n\n        for (exception in exceptions) {\n            val child = exception.firstChild\n\n            if (child.typeIs(PlSqlGrammar.IDENTIFIER_NAME) && \"TOO_MANY_ROWS\".equals(child.tokenValue, ignoreCase = true)) {\n                // and have only one NULL_STATEMENT\n                val children = node.getFirstChild(PlSqlGrammar.STATEMENTS).children\n                if (children.size == 1 && children[0].isOf<NullStatement>()) {\n                    addIssue(node, getLocalizedMessage())\n                }\n            }\n        }\n    }\n\n}\n\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/UnhandledUserDefinedExceptionCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.asTree\nimport com.felipebz.zpa.sslr.RaiseStatement\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.PlSqlKeyword\nimport com.felipebz.zpa.api.annotations.ConstantRemediation\nimport com.felipebz.zpa.api.annotations.Priority\nimport com.felipebz.zpa.api.annotations.Rule\nimport com.felipebz.zpa.api.annotations.RuleInfo\nimport com.felipebz.zpa.api.symbols.Symbol\nimport java.util.*\n\n@Rule(priority = Priority.CRITICAL, tags = [Tags.BUG])\n@ConstantRemediation(\"5min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\nclass UnhandledUserDefinedExceptionCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        subscribeTo(PlSqlGrammar.RAISE_STATEMENT)\n    }\n\n    override fun visitNode(node: AstNode) {\n        val statement = node.asTree<RaiseStatement>()\n        val identifier = statement.exception\n                ?: return\n\n        val identifierName = identifier.tokenValue\n        val symbols = context.currentScope?.getSymbolsAcessibleInScope(identifierName) ?: ArrayDeque()\n\n        if (symbols.isNotEmpty()) {\n            val checkException = exceptionShouldBeChecked(symbols.first)\n\n            if (checkException && !isHandled(identifierName)) {\n                addIssue(node, getLocalizedMessage(), identifierName)\n            }\n        }\n    }\n\n    private fun exceptionShouldBeChecked(exceptionDeclaration: Symbol): Boolean {\n        return exceptionDeclaration.scope.type !in PACKAGE_SPEC_OR_BODY\n    }\n\n    private fun isHandled(identifierName: String): Boolean {\n        var outerScope = context.currentScope\n        do {\n            val scopeNode = outerScope?.tree\n\n            val statements = scopeNode?.getFirstChildOrNull(PlSqlGrammar.STATEMENTS_SECTION)\n            val exceptionHandlers = statements?.getFirstChildOrNull(PlSqlGrammar.EXCEPTION_HANDLERS)\n            if (statements != null && exceptionHandlers != null) {\n                for (handler in exceptionHandlers.getChildren(PlSqlGrammar.EXCEPTION_HANDLER)) {\n                    if (handler.hasDirectChildren(PlSqlKeyword.OTHERS) && !handler.hasDescendant(PlSqlKeyword.SQLERRM)) {\n                        return true\n                    }\n\n                    for (exceptionName in handler.getChildren(PlSqlGrammar.VARIABLE_NAME)) {\n                        if (exceptionName.tokenValue == identifierName) {\n                            return true\n                        }\n                    }\n                }\n            }\n\n            outerScope = outerScope?.outer\n        } while (outerScope != null)\n\n        return false\n    }\n\n    companion object {\n        val PACKAGE_SPEC_OR_BODY = arrayOf(PlSqlGrammar.CREATE_PACKAGE, PlSqlGrammar.CREATE_PACKAGE_BODY)\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/UnnecessaryAliasInQueryCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.flr.api.AstNodeType\nimport com.felipebz.zpa.api.DmlGrammar\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.annotations.*\n\n@Rule(priority = Priority.MINOR)\n@ConstantRemediation(\"1min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\nclass UnnecessaryAliasInQueryCheck : AbstractBaseCheck() {\n\n    @RuleProperty(key = \"acceptedLength\", defaultValue = \"\" + DEFAULT_ACCEPTED_LENGTH)\n    var acceptedLength = DEFAULT_ACCEPTED_LENGTH\n\n    private val dmlStatements = arrayOf<AstNodeType>(\n        DmlGrammar.QUERY_BLOCK,\n        PlSqlGrammar.UPDATE_STATEMENT,\n        PlSqlGrammar.DELETE_STATEMENT)\n\n    override fun init() {\n        subscribeTo(*dmlStatements)\n    }\n\n    override fun visitNode(node: AstNode) {\n        if (node.hasAncestor(*dmlStatements)) {\n            // if the current node is inside another DML statement (i.e. subquery), the node should be\n            // ignored because it is considered in the analysis of the outer statement\n            return\n        }\n\n        val tableReferences = hashMapOf<String, MutableList<TableReference>>()\n        for (fromClause in node.getDescendants(DmlGrammar.DML_TABLE_EXPRESSION_CLAUSE)) {\n            val table = fromClause.getFirstChildOrNull(DmlGrammar.TABLE_REFERENCE)\n            val alias = fromClause.getFirstChildOrNull(DmlGrammar.ALIAS)\n\n\n            if (table != null) {\n                tableReferences.getOrPut(table.tokenValue) { mutableListOf() }\n                    .add(TableReference(table, alias))\n            }\n        }\n\n        for (references in tableReferences.values) {\n            checkReference(references)\n        }\n    }\n\n    private fun checkReference(references: MutableList<TableReference>) {\n        if (references.size == 1) {\n            val reference: TableReference = references[0]\n\n            var alias: String? = null\n            if (reference.alias != null) {\n                alias = reference.alias.tokenValue\n            }\n\n            if (alias != null && reference.alias != null && alias.length < acceptedLength) {\n                addIssue(reference.alias, getLocalizedMessage(),\n                        reference.table.tokenOriginalValue,\n                        reference.alias.tokenOriginalValue)\n            }\n        }\n    }\n\n    internal class TableReference(val table: AstNode, val alias: AstNode?)\n\n    companion object {\n        private const val DEFAULT_ACCEPTED_LENGTH = 3\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/UnnecessaryElseCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.annotations.*\n\n@Rule(priority = Priority.MINOR)\n@ConstantRemediation(\"2min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass UnnecessaryElseCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        subscribeTo(PlSqlGrammar.ELSE_CLAUSE)\n    }\n\n    override fun visitNode(node: AstNode) {\n        val ifStatement = checkNotNull(node.parent)\n\n        if (!hasElsifClause(ifStatement) && hasTerminationStatement(ifStatement)) {\n            addLineIssue(getLocalizedMessage(), node.tokenLine)\n        }\n    }\n\n    private fun hasElsifClause(node: AstNode): Boolean {\n        return node.hasDirectChildren(PlSqlGrammar.ELSIF_CLAUSE)\n    }\n\n    private fun hasTerminationStatement(ifStatement: AstNode): Boolean {\n        for (statement in ifStatement.getFirstChild(PlSqlGrammar.STATEMENTS).children) {\n            val internal = statement.firstChild\n            if (CheckUtils.isTerminationStatement(internal)) {\n                return true\n            }\n        }\n        return false\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/UnnecessaryLikeCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.api.ConditionsGrammar\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.PlSqlKeyword\nimport com.felipebz.zpa.api.annotations.*\n\n@Rule(priority = Priority.MINOR, tags = [Tags.CONFUSING])\n@ConstantRemediation(\"5min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass UnnecessaryLikeCheck : AbstractBaseCheck() {\n\n    private val escapeRegex = Regex(\"[%_]\")\n\n    override fun init() {\n        subscribeTo(ConditionsGrammar.LIKE_CONDITION)\n    }\n\n    override fun visitNode(node: AstNode) {\n        val escapeChar = if (node.hasDescendant(PlSqlKeyword.ESCAPE) &&\n            node.lastChild.hasDirectChildren(PlSqlGrammar.CHARACTER_LITERAL))\n            node.lastChild.tokenValue.trim('\\'')\n        else\n            \"\"\n\n        val regex = if (escapeChar.isEmpty()) escapeRegex else Regex(\"[^${Regex.escape(escapeChar)}][%_]\")\n\n        val likeNode = node.getFirstChild(PlSqlKeyword.LIKE).nextSibling\n        if (likeNode.hasDirectChildren(PlSqlGrammar.CHARACTER_LITERAL) && !likeNode.tokenValue.contains(regex)) {\n            addIssue(node, getLocalizedMessage())\n        }\n    }\n\n}\n\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/UnnecessaryNullStatementCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.annotations.*\n\n@Rule(priority = Priority.MINOR)\n@ConstantRemediation(\"1min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass UnnecessaryNullStatementCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        subscribeTo(PlSqlGrammar.NULL_STATEMENT)\n    }\n\n    override fun visitNode(node: AstNode) {\n        val parent = node.parent\n        if (parent.previousSiblingOrNull != null || parent.nextSiblingOrNull != null) {\n            addIssue(node, getLocalizedMessage())\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/UnusedCursorCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.PlSqlKeyword\nimport com.felipebz.zpa.api.annotations.*\nimport com.felipebz.zpa.api.symbols.Scope\nimport com.felipebz.zpa.api.symbols.Symbol\n\n@Rule(priority = Priority.MAJOR, tags = [Tags.UNUSED])\n@ConstantRemediation(\"2min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass UnusedCursorCheck : AbstractBaseCheck() {\n\n    override fun leaveFile(node: AstNode) {\n        val scopes = context.symbolTable.scopes\n        for (scope in scopes) {\n            if (scope.type == PlSqlGrammar.CREATE_PACKAGE) {\n                continue\n            }\n            checkScope(scope)\n        }\n    }\n\n    private fun checkScope(scope: Scope) {\n        val symbols = scope.getSymbols(Symbol.Kind.CURSOR)\n        for (symbol in symbols) {\n            val parent = checkNotNull(symbol.declaration.parent)\n\n            if (symbol.usages.isEmpty() && !parent.hasDirectChildren(PlSqlKeyword.RETURN)) {\n                addIssue(parent, getLocalizedMessage(), symbol.name)\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/UnusedParameterCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.api.DmlGrammar\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.annotations.*\nimport com.felipebz.zpa.api.symbols.Scope\nimport com.felipebz.zpa.api.symbols.Symbol\nimport java.util.regex.Pattern\n\n@Rule(priority = Priority.MAJOR, tags = [Tags.UNUSED])\n@ConstantRemediation(\"30min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass UnusedParameterCheck : AbstractBaseCheck() {\n\n    @RuleProperty(key = \"ignoreMethods\", defaultValue = \"\")\n    var ignoreMethods = \"\"\n\n    private val ignoreRegex: Pattern? by lazy {\n        if (\"\" != ignoreMethods) {\n            Pattern.compile(ignoreMethods, Pattern.CASE_INSENSITIVE)\n        } else null\n    }\n\n    override fun leaveFile(node: AstNode) {\n        val scopes = context.symbolTable.scopes\n        for (scope in scopes) {\n            // is overriding something?\n            if (scope.isOverridingMember) {\n                continue\n            }\n\n            val scopeNode = scope.tree ?: continue\n\n            // ignore procedure/function specification and overriding members\n            if (scope.type in DECLARATION_OR_CONSTRUCTOR) {\n                // is specification?\n                if (!scopeNode.hasDirectChildren(PlSqlGrammar.STATEMENTS_SECTION)) {\n                    continue\n                }\n            }\n\n            // cursor declaration (without implementation)\n            if (scope.type == PlSqlGrammar.CURSOR_DECLARATION && !scopeNode.hasDirectChildren(DmlGrammar.SELECT_EXPRESSION)) {\n                continue\n            }\n\n            // ignore methods by name\n            if (scope.type in PROCEDURE_OR_FUNCTION && ignoreRegex != null) {\n                val matchesRegex = ignoreRegex?.matcher(scope.identifier)?.matches() ?: false\n                if (matchesRegex) {\n                    continue\n                }\n            }\n\n            checkScope(scope)\n        }\n    }\n\n    private fun checkScope(scope: Scope) {\n        val symbols = scope.getSymbols(Symbol.Kind.PARAMETER)\n        for (symbol in symbols) {\n\n            // SELF parameter in type members\n            if (scope.outer?.type == PlSqlGrammar.CREATE_TYPE_BODY && symbol.name.equals(\"self\", ignoreCase = true)) {\n                continue\n            }\n\n\n            if (symbol.usages.isEmpty()) {\n                val parent = checkNotNull(symbol.declaration.parent)\n                addIssue(parent, getLocalizedMessage(), symbol.name)\n            }\n\n        }\n    }\n\n    companion object {\n        val DECLARATION_OR_CONSTRUCTOR =\n            arrayOf(PlSqlGrammar.PROCEDURE_DECLARATION,\n                PlSqlGrammar.FUNCTION_DECLARATION,\n                PlSqlGrammar.TYPE_CONSTRUCTOR)\n        val PROCEDURE_OR_FUNCTION =\n            arrayOf(PlSqlGrammar.PROCEDURE_DECLARATION,\n                PlSqlGrammar.FUNCTION_DECLARATION,\n                PlSqlGrammar.CREATE_PROCEDURE,\n                PlSqlGrammar.CREATE_FUNCTION)\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/UnusedVariableCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.annotations.*\nimport com.felipebz.zpa.api.symbols.Scope\nimport com.felipebz.zpa.api.symbols.Symbol\n\n@Rule(priority = Priority.MAJOR, tags = [Tags.UNUSED])\n@ConstantRemediation(\"2min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass UnusedVariableCheck : AbstractBaseCheck() {\n\n    override fun leaveFile(node: AstNode) {\n        val scopes = context.symbolTable.scopes\n        for (scope in scopes) {\n            if (scope.type !in arrayOf(PlSqlGrammar.CREATE_PACKAGE, PlSqlGrammar.FOR_STATEMENT)) {\n                checkScope(scope)\n            }\n        }\n    }\n\n    private fun checkScope(scope: Scope) {\n        val symbols = scope.getSymbols(Symbol.Kind.VARIABLE)\n        for (symbol in symbols) {\n            if (symbol.usages.isEmpty()) {\n                addIssue(symbol.declaration, getLocalizedMessage(), symbol.name)\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/UselessParenthesisCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.typeIs\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.annotations.*\n\n@Rule(priority = Priority.MINOR)\n@ConstantRemediation(\"2min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass UselessParenthesisCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        subscribeTo(PlSqlGrammar.BRACKED_EXPRESSION)\n    }\n\n    override fun visitNode(node: AstNode) {\n        val parent = node.parent\n        if (parent.typeIs(PlSqlGrammar.BRACKED_EXPRESSION) && parent.numberOfChildren == 3) {\n            addIssue(node, getLocalizedMessage())\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/VariableHidingCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.asSemantic\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.annotations.*\nimport com.felipebz.zpa.api.symbols.Symbol\n\n@Rule(priority = Priority.MAJOR)\n@ConstantRemediation(\"5min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass VariableHidingCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        subscribeTo(PlSqlGrammar.VARIABLE_DECLARATION, PlSqlGrammar.EXCEPTION_DECLARATION)\n    }\n\n    override fun visitNode(node: AstNode) {\n        val identifier = node.getFirstChild(PlSqlGrammar.IDENTIFIER_NAME)\n        val name = identifier.tokenValue\n\n        val scope = identifier.asSemantic().symbol?.scope\n        if (scope != null) {\n            val symbols = scope.getSymbolsAcessibleInScope(name, Symbol.Kind.VARIABLE, Symbol.Kind.PARAMETER)\n\n            if (symbols.size > 1) {\n                val originalVariable = symbols.last.declaration\n\n                if (originalVariable != identifier) {\n                    addIssue(identifier, getLocalizedMessage(), name, originalVariable.tokenLine)\n                            .secondary(originalVariable, \"Original\")\n                }\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/VariableInCountCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.typeIs\nimport com.felipebz.zpa.api.DmlGrammar\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.annotations.*\nimport com.felipebz.zpa.api.matchers.MethodMatcher\n\n@Rule(priority = Priority.BLOCKER, tags = [Tags.BUG])\n@ConstantRemediation(\"2min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass VariableInCountCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        subscribeTo(PlSqlGrammar.METHOD_CALL)\n    }\n\n    override fun visitNode(node: AstNode) {\n        val count = MethodMatcher.create().name(\"count\").addParameter()\n\n        if (!node.parent.typeIs(DmlGrammar.SELECT_COLUMN) || !count.matches(node)) {\n            return\n        }\n\n        checkArguments(node, count.getArgumentsValues(node))\n    }\n\n    private fun checkArguments(currentNode: AstNode, arguments: List<AstNode>) {\n        if (arguments.size != 1) {\n            return\n        }\n\n        val value = arguments[0]\n        val symbol = semantic(value).symbol\n        if (symbol != null) {\n            addIssue(currentNode, getLocalizedMessage(), value.tokenOriginalValue)\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/VariableInitializationWithFunctionCallCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.typeIs\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.annotations.*\n\n@Rule(priority = Priority.MAJOR)\n@ConstantRemediation(\"5min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass VariableInitializationWithFunctionCallCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        subscribeTo(PlSqlGrammar.DEFAULT_VALUE_ASSIGNMENT)\n    }\n\n    override fun visitNode(node: AstNode) {\n        if (node.hasParent(PlSqlGrammar.VARIABLE_DECLARATION)) {\n            val datatype = node.parent.getFirstChild(PlSqlGrammar.DATATYPE)\n\n            val expression = node.lastChild\n            if (expression.typeIs(PlSqlGrammar.METHOD_CALL) && datatype.tokenValue != expression.tokenValue) {\n                addIssue(node, getLocalizedMessage())\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/VariableInitializationWithNullCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.annotations.*\n\n@Rule(priority = Priority.MINOR)\n@ConstantRemediation(\"2min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass VariableInitializationWithNullCheck : AbstractBaseCheck() {\n\n    override fun init() {\n        subscribeTo(PlSqlGrammar.DEFAULT_VALUE_ASSIGNMENT)\n    }\n\n    override fun visitNode(node: AstNode) {\n        if (node.hasParent(PlSqlGrammar.VARIABLE_DECLARATION, PlSqlGrammar.RECORD_FIELD_DECLARATION)) {\n            val expression = node.lastChild\n            if (CheckUtils.isNullLiteralOrEmptyString(expression)) {\n                addIssue(node, getLocalizedMessage())\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/VariableNameCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.annotations.*\nimport java.util.regex.Pattern\n\n@Rule(priority = Priority.MINOR)\n@ConstantRemediation(\"10min\")\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@ActivatedByDefault\nclass VariableNameCheck : AbstractBaseCheck() {\n\n    @RuleProperty(key = \"regexp\", defaultValue = DEFAULT_REGEXP)\n    var regexp = DEFAULT_REGEXP\n\n    private val pattern: Pattern by lazy {\n        Pattern.compile(regexp)\n    }\n\n    override fun init() {\n        subscribeTo(PlSqlGrammar.VARIABLE_DECLARATION)\n    }\n\n    override fun visitNode(node: AstNode) {\n        val identifier = node.getFirstChild(PlSqlGrammar.IDENTIFIER_NAME)\n        val name = identifier.tokenOriginalValue\n\n        if (!pattern.matcher(name).matches()) {\n            addIssue(identifier, getLocalizedMessage(), name, regexp)\n        }\n    }\n\n    companion object {\n        private const val DEFAULT_REGEXP = \"[a-zA-Z]([a-zA-Z0-9_]*[a-zA-Z0-9])?\"\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/kotlin/com/felipebz/zpa/checks/XPathCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.flr.xpath.api.AstNodeXPathQuery\nimport com.felipebz.zpa.squid.AnalysisException\nimport com.felipebz.zpa.api.annotations.*\n\n@Rule(priority = Priority.MAJOR)\n@RuleInfo(scope = RuleInfo.Scope.ALL)\n@RuleTemplate\nclass XPathCheck : AbstractBaseCheck() {\n\n    @RuleProperty(key = \"xpathQuery\")\n    var xpathQuery = DEFAULT_XPATH_QUERY\n\n    @RuleProperty(key = \"message\", defaultValue = \"\" + DEFAULT_MESSAGE)\n    var message = DEFAULT_MESSAGE\n\n    private var query: AstNodeXPathQuery<Any>? = null\n\n    private fun query(): AstNodeXPathQuery<Any>? {\n        if (query == null && xpathQuery.isNotEmpty()) {\n            try {\n                query = AstNodeXPathQuery.create(xpathQuery)\n            } catch (e: RuntimeException) {\n                throw AnalysisException(\n                        \"Unable to initialize the XPath engine, perhaps because of an invalid query: $xpathQuery\", e)\n            }\n\n        }\n        return query\n    }\n\n    override fun visitFile(node: AstNode) {\n        if (query() != null) {\n            val objects = query()?.selectNodes(node) ?: emptyList()\n\n            for (obj in objects) {\n                if (obj is AstNode) {\n                    addIssue(obj, message)\n                } else if (obj is Boolean && obj) {\n                    addFileIssue(message)\n                }\n            }\n        }\n    }\n\n    companion object {\n        private const val DEFAULT_XPATH_QUERY = \"\"\n        private const val DEFAULT_MESSAGE = \"The XPath expression matches this piece of code\"\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/AddParenthesesInNestedExpression.html",
    "content": "<p>\nAn AND condition has a higher precedence than an OR condition, so you should wrap the AND condition in parentheses \nfor clarity and to ensure that the operators are evaluated in the order that you intend.\n</p>\n\n<p>\nConsider this example: \n</p>\n\n<pre>\nSELECT dogs.name\n  FROM dogs\n WHERE dogs.sex = 'male'\n   and dogs.color = 'white'\n    or dogs.size = 'big';\n</pre>\n\n<p>\nWithout parentheses, one would think that it is equivalent to:\n</p>\n\n<pre>\nSELECT dogs.name\n  FROM dogs\n WHERE dogs.sex = 'male'\n   and (dogs.color = 'white' or dogs.size = 'big');\n</pre>\n\n<p>\nBut the original query is parsed as:\n</p>\n\n<pre>\nSELECT dogs.name\n  FROM dogs\n WHERE (dogs.sex = 'male' and dogs.color = 'white')\n    or dogs.size = 'big';\n</pre>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/CharacterDatatypeUsage.html",
    "content": "<p>\nCurrently, the VARCHAR and VARCHAR2 data types are identical. But to accommodate emerging SQL standards, VARCHAR might become a separate data type in future.\n</p>\n\n<p>\nThe CHAR data type doesn't have any advantage over VARCHAR2 and makes searching more difficult because the right-padded values.\n</p>\n\n<pre>\ndeclare\n  var1 varchar(10); -- noncompliant\n  var2 char(10); -- noncompliant\n  \n  var3 varchar2(10); -- compliant\nbegin\n  null;\nend;\n</pre>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/CollapsibleIfStatements.html",
    "content": "<p>\nMerging collapsible <code>if</code> statements increases the code's readability.\n</p>\n\n<h2>Noncompliant Code Example</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nif condition1 then\n  if condition2 then\n    -- code\n  end if;\nend if;\n</pre>\n\n<h2>Compliant Solution</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nif condition1 and condition2 then\n  -- code\nend if;\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/ColumnsShouldHaveTableName.html",
    "content": "<p>\nSpecify the table name of the columns in a SELECT statement to improve readability and guarantee that the code won't stop working when the table changes.\n</p>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/CommitRollback.html",
    "content": "<p>\nUsually, the control of the transaction should be handled by the its \"owner\".\nIf the transaction was started by some Java code, the commit and rollback of this should be done in the Java code.\n</p>\n\n<p>\nSo, in this situation, calling a COMMIT or ROLLBACK from a database object is a bad pratice and should be avoided. \n</p>\n\n<p>\nThis rule ignores procedures and functions with <code>PRAGMA AUTONOMOUS_TRANSACTION</code>.\n</p>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/ComparisonWithBoolean.html",
    "content": "<p>\nRemove literal boolean values from comparisons to improve readability.\n</p>\n\n<h2>Noncompliant Code Example</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nif var = true then ...\nif var = false then ...\n</pre>\n\n<h2>Compliant Solution</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nif var then ...\nif not var then ...\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/ComparisonWithNull.html",
    "content": "<p>\nTo test for nulls, use only the comparison conditions IS NULL and IS NOT NULL. Any other comparison with nulls will result in NULL.\n</p>\n\n<p>\nKeep in mind that an empty string is equivalent to a NULL literal.  \n</p>\n\n<h2>Noncompliant Code Example</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nif var = null then\n  -- code\nend if;\n</pre>\n\nOr:\n\n<pre data-diff-id=\"2\" data-diff-type=\"noncompliant\">\nif other_var = '' then\n  -- code\nend if;\n</pre>\n\n<h2>Compliant Solution</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nif var is null then\n  -- code\nend if;\n</pre>\n\n<pre data-diff-id=\"2\" data-diff-type=\"compliant\">\nif other_var is null then\n  -- code\nend if;\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/ConcatenationWithNull.html",
    "content": "<p>Concatenating a VARCHAR2 value with NULL is no-op. So, the NULL value should be removed.</p>\n\n<p>A concatenation of any other datatype with NULL will cause a implicit cast to VARCHAR2. If this is the desired behavior,\nreplace the concatenation by a TO_CHAR call to make the intention explicit. See this example:</p>\n\n<pre>\nvar := NVL(''||id, 'Empty');\n</pre>\n\n<p>You should use this:</p>\n\n<pre>\nvar := NVL(TO_CHAR(id), 'Empty');\n</pre>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/CursorBodyInPackageSpec.html",
    "content": "<p>\nCursor declarations can be splitted in two parts: specification and body. When declaring a cursor \nin a package specification, the package specification should contains only the cursor specification \nand the cursor body should be added to the package body. \n</p>\n\n<p>\nIn newer versions of Oracle Forms, the usage of cursors declared with body in a package specification \nalso causes the compilation error \"internal error [Unexpected fragile external reference.]\". \n</p>\n\n<h2>Noncompliant Code Example</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\ncreate or replace package pkg is\n  cursor cur is\n    select dummy from dual;\nend;\n</pre>\n\n<h2>Compliant Solution</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\ncreate or replace package pkg is\n  type cur_type is record(dummy varchar2(1));\n  cursor cur return cur_type;\nend;\n/\ncreate or replace package body pkg is\n  cursor cur return cur_type is\n    select dummy from dual;\nend;\n/\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/DbmsOutputPut.html",
    "content": "<p>\nThe output of DBMS_OUTPUT.PUT/DBMS_OUTPUT.PUT_LINE will not be visible when SERVEROUTPUT is set to OFF.\nMoreover, unless this call is explicitly necessary, is better to use logging mechanism instead.\n</p>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/DeadCode.html",
    "content": "<p>\nJump statements (<code>return</code>, <code>exit</code>, <code>continue</code>, and <code>raise</code>) move control flow out of the current code block.\nTypically, any statements in a block that come after a jump are simply wasted keystrokes lying in wait to confuse the unwary.\n</p>\n\n<h2>Noncompliant Code Example</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nbegin\n  raise my_error;\n  log('finished'); -- this code will never be executed\nend;\n</pre>\n\n<h2>Compliant Solution</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nbegin\n  raise my_error;\nend;\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/DeclareSectionWithoutDeclarations.html",
    "content": "<p>\nYou don't need to add the DECLARE keyword in a block if it doesn't contains any declaration. \n</p>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/DisabledTest.html",
    "content": "<p>When a test fails due, for example, to infrastructure issues, you might want to ignore it temporarily.\nBut without some kind of notation about why the test is being disabled, it may never be reactivated.</p>\n\n<p>This rule raises an issue for each disabled test that does not have a notation about why it was disabled.</p>\n\n<h2>Noncompliant Code Example</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\n-- %test(my test)\n-- %disabled\nprocedure test;\n</pre>\n\n<h2>Compliant Solution</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\n-- %test(my test)\nprocedure test;\n</pre>\n\n<h2>Exceptions</h2>\n\n<p>The rule doesn't raise an issue if there is a comment in the <code>%disabled</code> annotation.</p>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/DuplicateConditionIfElsif.html",
    "content": "<p>\nA chain of <code>if</code>/<code>elsif</code> statements is evaluated from top to bottom.\nAt most, only one branch will be executed: the first one with a condition that evaluates to <code>true</code>.\n</p>\n\n<p>\nTherefore, duplicating a condition automatically leads to dead code. Usually, this is due to a copy/paste error.\nAt best, it's simply dead code and at worst, it's a bug that is likely to induce further bugs as the code is maintained, \nand obviously it could lead to unexpected behavior.\n</p>\n\n<h2>Noncompliant Code Example</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nIF (param = 1) THEN\n  open();\nELSIF (param = 2) THEN\n  close();\nELSIF (param = 1) THEN // Incorrect\n  move();\nEND IF;\n</pre>\n\n<h2>Compliant Solution</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nIF (param = 1) THEN\n  open();\nELSIF (param = 2) THEN\n  close();\nELSIF (param = 3) THEN\n  move();\nEND IF;\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/DuplicatedValueInIn.html",
    "content": "<p>\nDuplicated values in an IN condition can be either a copy/paste error and therefore a bug, or it is simply wasted code, and should be simplified.\n</p>\n\n<h2>Noncompliant Code Example</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nif value in (a, a, b) then ...\n</pre>\n\n<h2>Compliant Solution</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nif value in (a, b) then ...\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/EmptyBlock.html",
    "content": "<p>\nMost of the time a block of code is empty when a piece of code is really missing. So such empty block must be either filled or removed.\n</p>\n\n<h2>Noncompliant Code Example</h2>\n\n<pre>\nbegin\n  null;\nend;\n</pre>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/EmptyStringAssignment.html",
    "content": "<p>\nTo improve the readability, avoid using empty strings to represent NULL.\n</p>\n\n<h2>Noncompliant Code Example</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nvar := '';\n</pre>\n\n<h2>Compliant Solution</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nvar := null;\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/ExplicitInParameter.html",
    "content": "<p>\nIf not set, the parameter mode is IN. However, defining it explicitly does make the code easier to read.\n</p>\n\n<pre>\nCREATE OR REPLACE PROCEDURE myproc(value VARCHAR2) IS -- violation\nBEGIN\n  NULL;\nEND;\n\nCREATE OR REPLACE PROCEDURE myproc(value IN VARCHAR2) IS -- correct, the parameter mode is defined\nBEGIN\n  NULL;\nEND;\n</pre>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/FunctionWithOutParameter.html",
    "content": "<p>\nFunctions with OUT parameters are complex to understand.\nIt is impossible to tell whether an argument is a input or output just by looking at the function call.\nAlso, functions with OUT parameters cannot be called from SQL.\n</p>\n\n<h2>Noncompliant Code Example</h2>\n\n<pre>\nCREATE OR REPLACE FUNCTION get_product_info(id IN NUMBER, value OUT NUMBER) RETURN VARCHAR2 IS\nBEGIN\n ...\nEND;\n</pre>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/IdenticalExpression.html",
    "content": "<p>\nUsing the same value on either side of an operator is almost always a mistake.\nIt can be either a copy/paste error and therefore a bug, or it is simply wasted code, and should be simplified.\n</p>\n\n<h2>Noncompliant Code Example</h2>\n\n<pre>\nif a = a then ...\n</pre>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/IfWithExit.html",
    "content": "<p>\nTo improve the code readability always use EXIT WHEN instead of an IF statement to exit from a loop.\n</p>\n\n<h2>Noncompliant Code Example</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nif condition1 then\n  exit;\nend if;\n</pre>\n\n<h2>Compliant Solution</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nexit when condition1;\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/InequalityUsage.html",
    "content": "<p>\nThe forms \"<>\", \"!=\", \"~=\" and \"^=\" are equivalent, but only the \"<>\" form is defined in ANSI SQL.\n</p>\n\n<h2>Noncompliant Code Example</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nif a != b then\n</pre>\n\n<h2>Compliant Solution</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nif a <> b then\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/InsertWithoutColumns.html",
    "content": "<p>\nSpecify the columns in an INSERT statement to guarantee that the code won't stop working when a new column is added.\n</p>\n\n<h2>Noncompliant Code Example</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\ninsert into tab values (1);\n</pre>\n\n<h2>Compliant Solution</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\ninsert into tab (col) values (1);\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/InvalidReferenceToObject.html",
    "content": "<p>\nIn Oracle Forms, many procedures and functions need a reference to an object (blocks, itens, alerts...).\nUnfortunately, the only way to pass a reference to an object is using a VARCHAR2 variable and these references\nare not checked by the compiler. \n</p>\n\n<p>Currently this rule checks the following methods:</p>\n\n<strong>Alert bultins:</strong>\n<ul>\n<li>FIND_ALERT</li>\n<li>SET_ALERT_BUTTON_PROPERTY</li>\n<li>SET_ALERT_PROPERTY</li>\n<li>SHOW_ALERT</li>\n</ul>\n\n<strong>Block bultins:</strong>\n<ul>\n<li>FIND_BLOCK</li>\n<li>GET_BLOCK_PROPERTY</li>\n<li>GO_BLOCK</li>\n<li>SET_BLOCK_PROPERTY</li>\n</ul>\n\n<strong>Item bultins:</strong>\n<ul>\n<li>CHECKBOX_CHECKED</li>\n<li>CONVERT_OTHER_VALUE</li>\n<li>DISPLAY_ITEM</li>\n<li>FIND_ITEM</li>\n<li>GET_ITEM_INSTANCE_PROPERTY</li>\n<li>GET_ITEM_PROPERTY</li>\n<li>GET_RADIO_BUTTON_PROPERTY</li>\n<li>GO_ITEM</li>\n<li>IMAGE_SCROLL</li>\n<li>IMAGE_ZOOM</li>\n<li>IMAGE_ZOOM</li>\n<li>PLAY_SOUND</li>\n<li>READ_IMAGE_FILE</li>\n<li>READ_SOUND_FILE</li>\n<li>RECALCULATE</li>\n<li>SET_ITEM_INSTANCE_PROPERTY</li>\n<li>SET_ITEM_PROPERTY</li>\n<li>SET_ITEM_PROPERTY</li>\n<li>SET_RADIO_BUTTON_PROPERTY</li>\n<li>SET_RADIO_BUTTON_PROPERTY</li>\n<li>WRITE_IMAGE_FILE</li>\n<li>WRITE_SOUND_FILE</li>\n</ul>\n\n<strong>LOV bultins:</strong>\n<ul>\n<li>FIND_LOV</li>\n<li>GET_LOV_PROPERTY</li>\n<li>SET_LOV_COLUMN_PROPERTY</li>\n<li>SET_LOV_PROPERTY</li>\n<li>SHOW_LOV</li>\n</ul>\n\n<p><strong>Note</strong>: this rule is automatically disabled when the project's <code>sonar.plsql.forms.metadata</code> is not specified.</p>."
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/NotASelectedExpression.html",
    "content": "<p>\nIn a SELECT DISTINCT with an ORDER BY clause, if you specify a value in the ORDER BY that does not exists \nin the SELECT clause, Oracle will raise the exception <code>ORA-01791: not a SELECTed expression</code>. \n</p>\n\n<p>See this example:</p>\n\n<pre>\nSELECT DISTINCT item.name\n  FROM item\n ORDER BY item.group_id\n</pre>\n\n<p>\nThe <code>item.id</code> column is not in the SELECT clause, so Oracle will raise an ORA-01791. The corrected version can be: \n</p>\n\n<pre>\nSELECT DISTINCT item.name, item.group_id\n  FROM item\n ORDER BY item.group_id\n</pre>\n\n<p>\nIf the column in SELECT clause has an alias, you also can use the alias in the ORDER BY clause:\n</p>\n\n<pre>\n-- valid queries\nSELECT DISTINCT item.name AS full_name\n  FROM item\n ORDER BY item.name;\n \nSELECT DISTINCT item.name AS full_name\n  FROM item\n ORDER BY full_name;\n</pre>\n\n<p>\nBe aware that until the version 11.2.0.4, Oracle accepted some incorrect values in ORDER BY, like:\n</p>\n\n<pre>\nSELECT DISTINCT UPPER(item.name) AS full_name, item.group_id\n  FROM item\n ORDER BY item.name -- should be \"UPPER(item.name)\" or \"full_name\" \n</pre>\n\n<p>\nYou should fix the queries to avoid compatibility issues with newer versions of the Oracle database.\n</p>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/NotFound.html",
    "content": "<p>Use cursor%NOTFOUND instead of NOT cursor%FOUND.</p>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/NvlWithNullParameter.html",
    "content": "<p>\nThe NVL function lets you replace a null value with a valid value value. So, don't specify a NULL literal or an empty string as a parameter of a NVL call.\n</p>\n\n<h2>Noncompliant Code Example</h2>\n\n<pre>\nvar := nvl(x, '');\n</pre>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/ParsingError.html",
    "content": "<p>\nWhen the PL/SQL parser fails, it is possible to record the failure as a violation on the file. This way, not only it is possible to track the number of files that do not parse but also to easily find out why they do not parse.\n</p>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/QueryWithoutExceptionHandling.html",
    "content": "<p>\nUsually you should add an exception handling block for SELECT statements, to avoid unexpected exceptions.\n</p>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/RaiseStandardException.html",
    "content": "<p>\nYou should review all the RAISE statements that causes a predefined exception, because usually this is a sign of bad logic. Consider this example:\n</p>\n\n<pre>\nCREATE OR REPLACE FUNCTION group_has_users(id IN NUMBER) RETURN BOOLEAN IS\n  has_users BOOLEAN;\n  user_id   user_group.user_id%TYPE;\nBEGIN\n  BEGIN\n    SELECT user_group.user_id\n      INTO user_id\n      FROM user_group\n     WHERE user_group.group_id = id;\n     \n    RAISE TOO_MANY_ROWS;\n  EXCEPTION\n    WHEN NO_DATA_FOUND THEN\n      has_users := FALSE;\n    WHEN TOO_MANY_ROWS THEN\n      has_users := TRUE;\n  END;\n  \n  RETURN has_users;\nEND;\n</pre>\n\n<p>\nIn this case, the TOO_MANY_ROWS exception is being used as a flow control mechanism. This function could be rewritten to avoid the RAISE statement:\n</p>\n\n<pre>\nCREATE OR REPLACE FUNCTION group_has_users(id IN NUMBER) RETURN BOOLEAN IS\n  number_of_users NUMBER;\nBEGIN\n  BEGIN\n    SELECT COUNT(*)\n      INTO number_of_users\n      FROM user_group\n     WHERE user_group.group_id = id;\n  EXCEPTION\n    WHEN OTHERS THEN\n      number_of_users := 0;\n  END;\n  \n  RETURN number_of_users > 0;\nEND;\n</pre>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/RedundantExpectation.html",
    "content": "<p>From the <a href=\"http://utplsql.org/utPLSQL/latest/userguide/expectations.html\">utPLSQL documentation</a>:</p>\n\n<blockquote>\n  Validation of the code under test (the tested logic of procedure/function etc.) is performed by comparing\n  the actual data against the expected data. utPLSQL uses a combination of expectation and matcher to\n  perform the check on the data.\n</blockquote>\n\n<p>\n  Some validations are written in the form of <code>ut.expect(actual_value).matcher(expected_value)</code>.\n  This rules checks if the <code>actual_value</code> and the <code>expected_value</code> are the same thing. Example:\n</p>\n\n<pre>\n...\nbegin\n  v_expected := '2345';\n  v_actual := betwnstr('1234567', 2, 5);\n  ut.expect(v_actual).to_equal(v_actual); -- This expectation is wrong, it's always true\nend;\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/ReturnOfBooleanExpression.html",
    "content": "<p>\nReturn of boolean literal statements wrapped into IF-THEN-ELSE ones should be simplified.\n</p>\n\n<h2>Noncompliant Code Example</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nIF expression THEN\n  RETURN TRUE;\nELSE\n  RETURN FALSE;\nEND IF;\n</pre>\n\n<h2>Compliant Solution</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nRETURN expression;\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/SameBranch.html",
    "content": "<p>Having two branches in the same <code>if</code> structure with the same implementation is at best duplicate code,\nand at worst a coding error. If the same logic is truly needed for both instances, then they should be combined.</p>\n\n<h2>Noncompliant Code Example</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nIF var BETWEEN 0 AND 10 THEN\n  do_the_thing();\nELSIF var BETWEEN 10 AND 20 THEN\n  do_the_thing(); -- Noncompliant; duplicates first condition\nELSIF var BETWEEN 20 AND 50 THEN\n  do_the_another_thing();\nELSE\n  do_the_rest()\nEND IF;\n</pre>\n\n<h2>Compliant Solution</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nIF var BETWEEN 0 AND 10 THEN\n  do_the_thing();\nELSIF var BETWEEN 10 AND 20 THEN\n  do_the_second_thing();\nELSIF var BETWEEN 20 AND 50 THEN\n  do_the_another_thing();\nELSE\n  do_the_rest()\nEND IF;\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/SameCondition.html",
    "content": "<p>\nDuplicate a condition in a comparison is almost always a mistake.\nIt can be either a copy/paste error and therefore a bug, or it is simply wasted code, and should be simplified.\n</p>\n\n<h2>Noncompliant Code Example</h2>\n\n<pre>\nIF (x = 1) AND (x = 1) THEN ...\n</pre>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/SelectAllColumns.html",
    "content": "<p>\nSELECT * returns all the available columns. You should explicitly list the necessary columns.\nWhen considering using *, you should consider the possibility that more fields will be added to the table later.\n</p>\n\n<h2>Noncompliant Code Example</h2>\n\n<pre>\nbegin\n  select *\n    into var\n    from emp;\n  \n  select emp.*\n    into var\n    from emp;\nend;\n</pre>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/SelectWithRownumAndOrderBy.html",
    "content": "<p>\nIn a SELECT expression, the WHERE clause is executed before the ORDER BY clause. Consider this example:\n</p>\n\n<pre>\nDECLARE\n  CURSOR recent_users IS\n    SELECT user.name,\n           user.creation_date\n      FROM user\n     WHERE ROWNUM <= 5\n     ORDER BY user.creation_date DESC;\nBEGIN\n  ...\n</pre>\n\n<p>\nThis query won't return the last 5 created users. The database will filter the users without any ordering and after, apply the ORDER BY clause. The corrected query is:\n</p>\n\n<pre>\nDECLARE\n  CURSOR recent_users IS\n    SELECT name,\n           creation_date\n      FROM (SELECT user.name,\n                   user.creation_date\n              FROM user\n             ORDER BY user.creation_date DESC)\n     WHERE ROWNUM <= 5;\nBEGIN\n  ...\n</pre>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/ToCharInOrderBy.html",
    "content": "<p>The usage of <code>TO_CHAR</code> function in a <code>ORDER BY</code> is almost always a mistake.\n  The column value will be ordered alphabetically instead of being ordered according its datatype.</p>\n\n<h2>Noncompliant Code Example</h2>\n\n<p>Suppose we have the data below in the <code>EMP</code> table:</p>\n\n<table>\n  <tr>\n    <td>empno</td>\n    <td>hiredate</td>\n  </tr>\n  <tr>\n    <td>1</td>\n    <td>2019-10-01</td>\n  </tr>\n  <tr>\n    <td>5</td>\n    <td>2019-10-10</td>\n  </tr>\n  <tr>\n    <td>15</td>\n    <td>2018-10-02</td>\n  </tr>\n  <tr>\n    <td>20</td>\n    <td>2018-10-20</td>\n  </tr>\n</table>\n\nThe queries below return an unwanted result:\n\n<p><code>select empno from emp order by to_char(empno);</code></p>\n\n<table>\n  <tr>\n    <td>empno</td>\n  </tr>\n  <tr>\n    <td>1</td>\n  </tr>\n  <tr>\n    <td>15</td>\n  </tr>\n  <tr>\n    <td>20</td>\n  </tr>\n  <tr>\n    <td>5</td>\n  </tr>\n</table>\n\n<p><code>select hiredate from emp order by to_char(hiredate, 'dd-mm-rrrr');</code></p>\n\n<table>\n  <tr>\n    <td>hiredate</td>\n  </tr>\n  <tr>\n    <td>01-OCT-19</td>\n  </tr>\n  <tr>\n    <td>02-OCT-18</td>\n  </tr>\n  <tr>\n    <td>10-OCT-19</td>\n  </tr>\n  <tr>\n    <td>20-OCT-18</td>\n  </tr>\n</table>\n\n<h2>Compliant Code Example</h2>\n\nTo order these columns correctly we must remove the <code>TO_CHAR</code> call.\n\n<p><code>select empno from emp order by empno;</code></p>\n\n<table>\n  <tr>\n    <td>empno</td>\n  </tr>\n  <tr>\n    <td>1</td>\n  </tr>\n  <tr>\n    <td>5</td>\n  </tr>\n  <tr>\n    <td>15</td>\n  </tr>\n  <tr>\n    <td>20</td>\n  </tr>\n</table>\n\n<p><code>select hiredate from emp order by hiredate;</code></p>\n\n<table>\n  <tr>\n    <td>hiredate</td>\n  </tr>\n  <tr>\n    <td>02-OCT-18</td>\n  </tr>\n  <tr>\n    <td>20-OCT-18</td>\n  </tr>\n  <tr>\n    <td>01-OCT-19</td>\n  </tr>\n  <tr>\n    <td>10-OCT-19</td>\n  </tr>\n</table>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/ToDateWithoutFormat.html",
    "content": "<p>\nAlways specify the date format in TO_DATE calls.\n</p>\n\n<h2>Noncompliant Code Example</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nbegin\n  var := to_date('2015-01-01');\nend;\n</pre>\n\n<h2>Compliant Solution</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nbegin\n  var := to_date('2015-01-01', 'YYYY-MM-DD');\nend;\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/TooManyRowsHandler.html",
    "content": "<p>\nWhen a SELECT INTO statement causes the predefined exception TOO_MANY_ROWS the values of the variables in the INTO clause are undefined.\n</p>\n\n<h2>Noncompliant Code Example</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nbegin\n  select empno\n    into var\n    from emp;\nexception\n  when too_many_rows then\n    null;\nend;\n</pre>\n\n<h2>Compliant Solution</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nbegin\n  select empno\n    into var\n    from emp;\nexception\n  when too_many_rows then\n    var := null;\nend;\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/UnhandledUserDefinedException.html",
    "content": "<p>\nWhen a custom exception is declared and not handled in the code, raising this exception will cause the error \n\"ORA-06510: PL/SQL: unhandled user-defined exception\" in the database or the error \"User-defined exception\" in\nOracle Forms. \n</p>\n\n<p>\nIt is a good practice to handle custom exceptions. \n</p>\n\n<h2>Noncompliant Code Example</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nDECLARE\n  my_exception EXCEPTION;\nBEGIN\n  ...\n  RAISE my_exception; -- this will cause an \"user-defined exception\"\nEND;\n</pre>\n\n<h2>Compliant Solution</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nDECLARE\n  my_exception EXCEPTION;\nBEGIN\n  ...\n  RAISE my_exception;\nEXCEPTION\n  WHEN my_exception THEN\n    ...\nEND;\n</pre>\n\n<p>\nThis check will also trigger a violation if the exception is handled by a OTHERS handler and it has a reference to SQLERRM.\nIn this case, the SQLERRM will return \"User-defined exception\", which is not very useful.\n</p>\n\n<pre>\nDECLARE\n  my_exception EXCEPTION;\nBEGIN\n  ...\n  RAISE my_exception;\nEXCEPTION\n  WHEN OTHERS THEN\n    log(SQLERRM);\nEND;\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/UnnecessaryAliasInQuery.html",
    "content": "<p>\nAn alias can be used in tables when you plan to add the same table more than once in the FROM clause \n(e.g. self join), or you want to shorten the table name to make the SQL statement shorter and easier to read. \nBut when abused, aliases can have the opposite effect: decrease legibility. \n</p>\n\n<p>\nConsider using aliases only when the table appears more than once in a query. \n</p>\n\n<h2>Noncompliant Code Example</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nSELECT a.id,\n       b.id,\n       b.name\n  FROM employee a,\n       dept b\n WHERE a.dept_id = b.id;\n</pre>\n\n<h2>Compliant Solution</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nSELECT employee.id,\n       dept.id,\n       dept.name\n  FROM employee,\n       dept\n WHERE employee.dept_id = dept.id;\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/UnnecessaryElse.html",
    "content": "<p>\nWhen the IF clause of a IF-THEN-ELSE structure does not complete successfully, the ELSE clause is unnecessary.  \n</p>\n\n<h2>Noncompliant Code Example</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nBEGIN\n  IF condition THEN\n    RETURN value;\n  ELSE\n    value := NULL;\n  END IF;\nEND;\n</pre>\n\n<h2>Compliant Solution</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nBEGIN\n  IF condition THEN\n    RETURN value;\n  END IF;\n  \n  value := NULL;\nEND;\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/UnnecessaryLike.html",
    "content": "<p>\n  Using a LIKE condition without a wildcard (% or _) is suspicious. A maintainer can suppose whether a wildcard is\n  forgotten or it is meant as equality test.\n</p>\n\n<h2>Noncompliant Code Example</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nif (last_name like 'Smith') ...\n</pre>\n\n<h2>Compliant Solution</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nif (last_name like 'Smith%') ...\n\n-- or\nif (last_name = 'Smith') ...\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/UnnecessaryNullStatement.html",
    "content": "A NULL statement at the same level of other statements is useless, so should be removed.\n\n<h2>Noncompliant Code Example</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nBEGIN\n  var := 1;\n  NULL; -- this NULL statement can be removed\nEND\n</pre>\n\n<h2>Compliant Solution</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nBEGIN\n  var := 1;\nEND\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/UnusedCursor.html",
    "content": "<p>\nIf a local cursor is declared but not used, it is dead code and should be removed.\nDoing so will improve maintainability because developers will not wonder what the cursor is used for.\n</p>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/UnusedParameter.html",
    "content": "<p>Unused parameters are misleading. Whatever the value passed to such parameters is, the behavior will be the same.</p>\n\n<h2>Noncompliant Code Example</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nPROCEDURE do_something(a IN NUMBER, b IN NUMBER) IS -- \"b\" is unused\nBEGIN\n  compute(a);\nEND;\n</pre>\n\n<h2>Compliant Solution</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nPROCEDURE do_something(a IN NUMBER) IS\nBEGIN\n  compute(a);\nEND;\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/UnusedVariable.html",
    "content": "<p>\nIf a local variable is declared but not used, it is dead code and should be removed.\nDoing so will improve maintainability because developers will not wonder what the variable is used for.\n</p>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/UselessParenthesis.html",
    "content": "<p>Useless parentheses can sometimes be misleading and so should be removed.</p>\n\n<h2>Noncompliant Code Example</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nif ((a = b)) then ...\n</pre>\n\n<h2>Compliant Solution</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nif (a = b) then ...\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/VariableHiding.html",
    "content": "<p>\nRedeclaring variables in inner scopes is allowed in PL/SQL, but it can cause confusion and should therefore be avoided.\n</p>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/VariableInCount.html",
    "content": "Using the COUNT built-in with local variable is misleading and in the most of time it is a coding error.\n\n<h2>Noncompliant Code Example</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nDECLARE\n  v_empno emp.empno%TYPE;\n  ...\nBEGIN\n  \n  -- Because the v_empno is NULL at this point, this COUNT always returns 0.\n  SELECT COUNT(v_empno)\n    INTO i\n    FROM employee\n   WHERE employee.deptno = v_deptno;\nEND;\n</pre>\n\n<h2>Compliant Solution</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nBEGIN\n  SELECT COUNT(*)\n    INTO i\n    FROM employee\n   WHERE employee.deptno = v_deptno;\nEND;\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/VariableInitializationWithFunctionCall.html",
    "content": "<p>\nIf your initialization fails you will not be able to handle the error in your exceptions block.\n</p>\n\n<h2>Noncompliant Code Example</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nDECLARE\n  employee_name emp.name%TYPE := get_employee_name(id => 5);\nBEGIN\n  ...\nEND;\n</pre>\n\n<h2>Compliant Solution</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nDECLARE\n  employee_name emp.name%TYPE;\nBEGIN\n  employee_name := get_employee_name(id => 5);\n  ...\nEND;\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/VariableInitializationWithNull.html",
    "content": "<p>\nBy default, new variables and RECORD fields are initialized with NULL. So, you don't need to initialize them with NULL.\n</p>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/VariableName.html",
    "content": "<p>\nThis rule checks that all variable names match a provided regular expression.\n</p>\n\n<h2>Example</h2>\n\n<p>Considering the default expression:</p>\n\n<pre>\nDECLARE\n  dept_name dept.name%type; -- Compliant\n  dept_name_ dept.name%type; -- Noncompliant\nBEGIN\n  ...\nEND;\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen/rules/plsql/XPath.html",
    "content": "<p>This rule allows the definition of custom rules using XPath expressions.</p>\n<p>Issues are created depending on the return value of the XPath expression. If the XPath expression returns:</p>\n<ul>\n  <li>a single or list of AST nodes, then a line issue with the given message is created for each node</li>\n  <li>a boolean, then a file issue with the given message is created only if the boolean is true</li>\n  <li>anything else, no issue is created</li>\n</ul>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen.properties",
    "content": "AddParenthesesInNestedExpression.message=Add parentheses around this AND condition to make the operator precedence explicit.\nAddParenthesesInNestedExpression.name=Add parentheses in nested expression\nCharacterDatatypeUsage.message=Use VARCHAR2 instead of {0}.\nCharacterDatatypeUsage.name=Use VARCHAR2 instead of CHAR and VARCHAR\nCollapsibleIfStatements.message=This IF statement can be merged with the enclosing one.\nCollapsibleIfStatements.name=Collapsible \"if\" statements should be merged\nColumnsShouldHaveTableName.message=Specify the table of column \"{0}\".\nColumnsShouldHaveTableName.name=The columns in a SELECT should be prefixed with table name\nCommitRollback.message=Avoid {0} calls unless it is in an autonomous transaction.\nCommitRollback.name=Avoid COMMIT/ROLLBACK calls in database objects\nComparisonWithBoolean.message=Remove the literal \"{0}\" of this comparison.\nComparisonWithBoolean.name=Avoid superfluous comparation against boolean literals\nComparisonWithNull.message=Fix this comparison or change to \"{0}\".\nComparisonWithNull.name=Do not compare values against the NULL literal or an empty string\nConcatenationWithNull.message=Review this concatenation with NULL value.\nConcatenationWithNull.name=Unnecessary concatenation with NULL value\nCursorBodyInPackageSpec.message=Move the body of the cursor \"{0}\" to the package body.\nCursorBodyInPackageSpec.name=Do not declare cursor bodies in a package specification\nDbmsOutputPut.message=Avoid direct calls to DBMS_OUTPUT procedures.\nDbmsOutputPut.name=Avoid direct calls to DBMS_OUTPUT procedures\nDeadCode.message=This code will never be executed.\nDeadCode.name=Dead code should be removed\nDeclareSectionWithoutDeclarations.message=Remove this DECLARE keyword.\nDeclareSectionWithoutDeclarations.name=Do not add the DECLARE keyword if the block doesn't have any declaration\nDisabledTest.message=Fix or remove this disabled unit test.\nDisabledTest.name=Tests should not be disabled\nDuplicateConditionIfElsif.message=This code can not be reached because the condition duplicates a previous condition in the same sequence of \"if/else if\" statements.\nDuplicateConditionIfElsif.name=Related \"if/elsif\" statements should not have the same condition\nDuplicatedValueInIn.message=Remove or fix the duplicated value \"{0}\" in the IN condition.\nDuplicatedValueInIn.name=Duplicated value in an IN condition\nEmptyBlock.message=Either remove or fill this block of code.\nEmptyBlock.name=Empty blocks should be removed\nEmptyStringAssignment.message=Replace this empty string by NULL.\nEmptyStringAssignment.name=Avoid using empty strings to represent NULL\nExplicitInParameter.message=Explicitly declare this parameter as IN.\nExplicitInParameter.name=Parameter mode should be explicitly declared\nFunctionWithOutParameter.message=Rewrite this function to not depend on OUT parameters.\nFunctionWithOutParameter.name=Avoid functions with OUT parameters\nIdenticalExpression.message=Identical expressions on both sides of operator \"{0}\".\nIdenticalExpression.name=Identical expressions should not be used on both sides of an operator\nIfWithExit.message=Replace this IF ... EXIT by a EXIT WHEN statement.\nIfWithExit.name=Use EXIT WHEN instead of an IF statement to exit from a loop\nInequalityUsage.message=Replace \"{0}\" by \"<>\".\nInequalityUsage.name=Only \"<>\" should be used to test inequality\nInsertWithoutColumns.message=Specify the columns in this INSERT.\nInsertWithoutColumns.name=Always specify the columns in an INSERT statement\nInvalidReferenceToObject.message=Invalid reference to the object \"{0}\" in this {1} call.\nInvalidReferenceToObject.name=Invalid reference to Oracle Forms object\nNotASelectedExpression.message=This value does not exists in the SELECT clause. Fix this expression or add this value in the SELECT.\nNotASelectedExpression.name=ORDER BY items must appear in the select list if SELECT DISTINCT is specified\nNotFound.message=Use %NOTFOUND instead of NOT ...%FOUND.\nNotFound.name=Use cursor%NOTFOUND instead of NOT cursor%FOUND\nNvlWithNullParameter.message=This NVL does not have any effect. Fix the {0} parameter or remove this NVL.\nNvlWithNullParameter.name=Do not pass a NULL literal or an empty string to NVL\nParsingError.message=This code wasn't parsed correctly. No issue will be registered on it.\nParsingError.name=Parser failure\nQueryWithoutExceptionHandling.message=Handle exceptions of this query.\nQueryWithoutExceptionHandling.name=Avoid queries without an exception handling block\nQueryWithoutExceptionHandling.param.strictMode=If false, allows inner block without exception handling.\nRaiseStandardException.message=Avoid raising the standard exception {0}.\nRaiseStandardException.name=Avoid raising standard exceptions\nRedundantExpectation.message=This test expectation is redundant. The actual value is the same as the one used in the matcher.\nRedundantExpectation.name=Test expectations should not be redundant\nReturnOfBooleanExpression.message=Replace this if-then-else statement by a single return statement.\nReturnOfBooleanExpression.name=Return of boolean expressions should not be wrapped into an \"if-then-else\" statement\nSameBranch.message=Either merge this branch with the identical one on line {0} or change one of the implementations.\nSameBranch.name=Branches in the same conditional structure should not have exactly the same implementation\nSameCondition.message=This condition duplicates the one on line {0}.\nSameCondition.name=Identical conditions should not be duplicated\nSelectAllColumns.message=SELECT * should not be used.\nSelectAllColumns.name=SELECT * should not be used\nSelectWithRownumAndOrderBy.message=Move this ROWNUM comparation to a more external level to guarantee the ordering.\nSelectWithRownumAndOrderBy.name=A SELECT cannot have a comparison with ROWNUM and an ORDER BY at the same level\nToCharInOrderBy.message=This TO_CHAR may be causing the records to be fetched in the wrong order.\nToCharInOrderBy.name=Avoid TO_CHAR in an ORDER BY clause\nToDateWithoutFormat.message=Specify the date format in this TO_DATE.\nToDateWithoutFormat.name=TO_DATE without date format\nTooManyRowsHandler.message=Handle the variables used in the SELECT INTO statements here so their values do not become undefined.\nTooManyRowsHandler.name=Avoid masking the TOO_MANY_ROWS exception\nUnhandledUserDefinedException.message=There is no exception handler for \"{0}\" here. This will cause an \"user-defined exception\" error.\nUnhandledUserDefinedException.name=User defined exceptions should be handled\nUnnecessaryAliasInQuery.message=This statement has only one reference to the table \"{0}\". Remove the alias \"{1}\" to improve the readability.\nUnnecessaryAliasInQuery.name=Unnecessary alias for table reference\nUnnecessaryAliasInQuery.param.acceptedLength=Ignore alias with size greater than or equals to this\nUnnecessaryElse.message=This ELSE can be replaced by an END IF. When the corresponding IF is executed, the code execution will be stopped. Either way, the code within this ELSE will always run, regardless of the ELSE block.\nUnnecessaryElse.name=Unnecessary ELSE clause\nUnnecessaryLike.message=This LIKE condition is not using any wildcard. Replace with an equality comparator or add a wildcard. \nUnnecessaryLike.name=Do not use LIKE conditions without wildcards\nUnnecessaryNullStatement.message=This NULL statement does not have any effect here.\nUnnecessaryNullStatement.name=Unnecessary NULL statement\nUnusedCursor.message=Remove this unused \"{0}\" cursor.\nUnusedCursor.name=Unused cursors should be removed\nUnusedParameter.message=Remove this unused \"{0}\" parameter.\nUnusedParameter.name=Unused parameters should be removed\nUnusedParameter.param.ignoreMethods=Regular Expression describing method names that should be ignored for this check\nUnusedVariable.message=Remove this unused \"{0}\" local variable.\nUnusedVariable.name=Unused local variables should be removed\nUselessParenthesis.message=Remove those useless parenthesis.\nUselessParenthesis.name=Useless parentheses around expressions should be removed to prevent any misunderstanding\nVariableHiding.message=This variable \"{0}\" hides the declaration on line {1}.\nVariableHiding.name=Do not redeclare variables in inner scope\nVariableInCount.message=Looks like there is a \"{0}\" variable in this context. Review if this COUNT is correct.\nVariableInCount.name=Don't pass variables to COUNT function\nVariableInitializationWithFunctionCall.message=Move this initialization to the BEGIN...END block.\nVariableInitializationWithFunctionCall.name=Avoid initializing variables using functions in the declaration section\nVariableInitializationWithNull.message=Remove this unnecessary initialization to NULL.\nVariableInitializationWithNull.name=Variables and RECORD fields do not need to be initialized with NULL\nVariableName.message=Rename {0} to match the regular expression {1}.\nVariableName.name=Variables should comply with a naming convention\nXPath.name=Track breaches of an XPath rule\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/AddParenthesesInNestedExpression.html",
    "content": "<p>\nUma condição AND tem uma precedência maior que uma condição OR, então você deve envolver a condição AND em parênteses\npor questão de clareza e para garantir que os operadores sejam avaliados na ordem que você deseja.\n</p>\n\n<p>\nConsidere esse exemplo:\n</p>\n\n<pre>\nSELECT cachorros.nome\n  FROM cachorros\n WHERE cachorros.sexo = 'macho'\n   and cachorros.cor = 'branco'\n    or cachorros.tamanho = 'grande';\n</pre>\n\n<p>\nSem parênteses, alguém poderia pensar que ela equivale a:\n</p>\n\n<pre>\nSELECT cachorros.nome\n  FROM cachorros\n WHERE cachorros.sexo = 'macho'\n   and (cachorros.tamanho = 'branco' or cachorros.size = 'grande');\n</pre>\n\n<p>\nMas a consulta original é processada como:\n</p>\n\n<pre>\nSELECT cachorros.nome\n  FROM cachorros\n WHERE (cachorros.sexo = 'macho' and cachorros.cor = 'branco')\n    or cachorros.tamanho = 'grande';\n</pre>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/CharacterDatatypeUsage.html",
    "content": "<p>\nAtualmente os tipos de dados VARCHAR e VARCHAR2 são idênticos. Mas para acomodar padrões SQL emergentes, o VARCHAR pode se tornar um tipo de dados diferente no futuro.\n</p>\n\n<p>\nO tipo de dados CHAR não oferece nenhuma vantagem sobre o VARCHAR2 e faz com que a pesquisa seja mais difícil devido aos valores com espaços à direita.\n</p>\n\n<pre>\ndeclare\n  var1 varchar(10); -- violação\n  var2 char(10); -- violação\n  \n  var3 varchar2(10); -- ok\nbegin\n  null;\nend;\n</pre>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/CollapsibleIfStatements.html",
    "content": "<p>\nUna comandos <code>if</code> aninhados para melhorar a legibilidade do código.\n</p>\n\n<h2>Código em desconformidade</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nif condition1 then\n  if condition2 then\n    -- code\n  end if;\nend if;\n</pre>\n\n<h2>Código correto</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nif condition1 and condition2 then\n  -- code\nend if;\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/ColumnsShouldHaveTableName.html",
    "content": "<p>\nEspecifique o nome da tabela nas colunas de um comando SELECT para melhorar a legibilidade e evitar que o código pare de funcionar quando a tabela for alterada.\n</p>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/CommitRollback.html",
    "content": "<p>\nGeralmente, o contole de uma transação deve ser responsabilidade do \"proprietário\" dela.\nSe a transação foi iniciada por um código Java, o commit e rollback devem ser feitos no código Java.\n</p>\n\n<p>\nAssim, nessa situação, chamar um COMMIT ou ROLLBACK a partir de um objeto de banco de dados é uma prática ruim e deve ser evitada.\n</p>\n\n<p>\nEssa regra ignora procedimentos e funções com <code>PRAGMA AUTONOMOUS_TRANSACTION</code>.\n</p>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/ComparisonWithBoolean.html",
    "content": "<p>\nRemova literais booleanos de comparações para melhorar a legibilidade.\n</p>\n\n<h2>Código em desconformidade</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nif var = true then ...\nif var = false then ...\n</pre>\n\n<h2>Código correto</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nif var then ...\nif not var then ...\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/ComparisonWithNull.html",
    "content": "<p>\nPara testar por nulls, use apenas as comparações IS NULL e IS NOT NULL. Qualquer outra comparação com nulls resultará em NULL.\n</p>\n\n<p>\nLembre que uma string vazia é equivalente ao literal NULL.\n</p>\n\n<h2>Código em desconformidade</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nif var = null then\n  -- code\nend if;\n</pre>\n\nOu:\n\n<pre data-diff-id=\"2\" data-diff-type=\"noncompliant\">\nif var = '' then\n  -- code\nend if;\n</pre>\n\n<h2>Código correto</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nif var is null then\n  -- code\nend if;\n</pre>\n\n<pre data-diff-id=\"2\" data-diff-type=\"compliant\">\nif other_var is null then\n  -- code\nend if;\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/ConcatenationWithNull.html",
    "content": "<p>Concatenar um valor VARCHAR2 com NULL não causa efeito nenhum. Sendo assim, o valor NULL deve ser removido.</p>\n\n<p>Uma concatenação de qualquer outro tipo de dado com NULL causará uma conversão implícita para VARCHAR2. Se esse for o\ncomportamento desejado, substitua a concatenação por uma chamada para TO_CHAR para tornar isso explícito. Veja esse exemplo:</p>\n\n<pre>\nvar := NVL(''||id, 'Vazio');\n</pre>\n\n<p>Você deveria usar:</p>\n\n<pre>\nvar := NVL(TO_CHAR(id), 'Vazio');\n</pre>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/CursorBodyInPackageSpec.html",
    "content": "<p>\nDeclarações de cursores podem ser separadas em duas partes: especificação e corpo. Ao declarar um\ncursor em uma especificação de pacote, a especificação do pacote deveria conter apenas a especificação\ndo cursor e o corpo do cursor deve ser incluído no corpo do pacote.\n</p>\n\n<p>\nEm versões mais novas do Oracle Forms, o uso de cursores declarados com corpo em especificação de pacote\ntambém causa o erro de compilação \"internal error [Unexpected fragile external reference.]\". \n</p>\n\n<h2>Código em desconformidade</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\ncreate or replace package pkg is\n  cursor cur is\n    select dummy from dual;\nend;\n</pre>\n\n<h2>Código correto</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\ncreate or replace package pkg is\n  type cur_type is record(dummy varchar2(1));\n  cursor cur return cur_type;\nend;\n/\ncreate or replace package body pkg is\n  cursor cur return cur_type is\n    select dummy from dual;\nend;\n/\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/DbmsOutputPut.html",
    "content": "<p>\nA saída da chamada DBMS_OUTPUT.PUT/DBMS_OUTPUT.PUT_LINE não será visível quando SERVEROUTPUT estiver definido como OFF.\nAlém disso, a menos que essa chamada seja explicitamente necessária, é melhor usar um mecanismo de logging em vez disso.\n</p>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/DeadCode.html",
    "content": "<p>\nComandos como <code>return</code>, <code>exit</code>, <code>continue</code>, e <code>raise</code> alteram o fluxo para fora do bloco atual.\nGeralmente, qualquer comando em um bloco que estiver depois de um desses comandos é código desnecessário esperando para confundir alguém desavisado.\n</p>\n\n<h2>Código em desconformidade</h2>\n\n<pre>\nbegin\n  raise my_error;\n  log('finished'); -- esse código nunca será executado\nend;\n</pre>\n\n<h2>Código correto</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nbegin\n  raise my_error;\nend;\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/DeclareSectionWithoutDeclarations.html",
    "content": "<p>\nVocê não precisa adicionar a palavra-chave DECLARE em um bloco se não há nenhuma declaração. \n</p>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/DisabledTest.html",
    "content": "<p>Quando um teste falha, por exemplo, devido a problemas de infraestrutura, você pode querer ignorá-lo temporariamente.\n  Mas sem nenhum tipo de explicação do motivo do teste ter sido ignorado, talvez ele nunca seja reativado.</p>\n\n<p>Essa regra registra um problema em cada teste desativado que não tem um comentário explicando o motivo disso.</p>\n\n<h2>Código em desconformidade</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\n-- %test(my test)\n-- %disabled\nprocedure test;\n</pre>\n\n<h2>Código correto</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\n-- %test(my test)\nprocedure test;\n</pre>\n\n<h2>Exceções</h2>\n\n<p>A regra não registra um problema se houver um comentário na anotação <code>%disabled</code>.</p>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/DuplicateConditionIfElsif.html",
    "content": "<p>\nUma sequência de instruções <code>if</code>/<code>elsif</code> é avaliada de cima para baixo.\nApenas uma branch dessas instruções será executada de cada vez: a primeira que retornar <code>true</code>.\n</p>\n\n<p>\nAssim, duplicar uma condição automaticamente leva a código inútil. Geralmente isso acontece por um erro ao copiar/colar.\nNa melhor situação isso é apenas código inútil e na pior das situações é um bug que provavelmente causará mais problemas\nna manutenção do código e obviamente pode levar a um comportamento inesperado.\n</p>\n\n<h2>Código em desconformidade</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nIF (param = 1) THEN\n  open();\nELSIF (param = 2) THEN\n  close();\nELSIF (param = 1) THEN // Incorreto\n  move();\nEND IF;\n</pre>\n\n<h2>Código correto</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nIF (param = 1) THEN\n  open();\nELSIF (param = 2) THEN\n  close();\nELSIF (param = 3) THEN\n  move();\nEND IF;\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/DuplicatedValueInIn.html",
    "content": "<p>\nValores duplicados em uma condição IN pode ser um erro ao copiar/colar sendo então um bug, ou simplesmente é código inútil e deve ser simplificado.\n</p>\n\n<h2>Código em desconformidade</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nif value in (a, a, b) then ...\n</pre>\n\n<h2>Código correto</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nif value in (a, b) then ...\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/EmptyBlock.html",
    "content": "<p>\nNa maioria das vezes um bloco de código está vazio quando realmente falta alguma implementação. Então tal bloco deve ser preenchido ou removido.\n</p>\n\n<h2>Código em desconformidade</h2>\n\n<pre>\nbegin\n  null;\nend;\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/EmptyStringAssignment.html",
    "content": "<p>\nPara melhorar a legibilidade, evite usar strings vazias para representar NULL.\n</p>\n\n<h2>Código em desconformidade</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nvar := '';\n</pre>\n\n<h2>Código correto</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nvar := null;\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/ExplicitInParameter.html",
    "content": "<p>\nSe não for informado, o modo padrão dos parâmetros é IN. Porém, definir ele explicitamente faz com que o código seja mais fácil de ler.\n</p>\n\n<pre>\nCREATE OR REPLACE PROCEDURE myproc(value VARCHAR2) IS -- violação\nBEGIN\n  NULL;\nEND;\n\nCREATE OR REPLACE PROCEDURE myproc(value IN VARCHAR2) IS -- correto, o modo do parâmetro está definido\nBEGIN\n  NULL;\nEND;\n</pre>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/FunctionWithOutParameter.html",
    "content": "<p>\nFunções com parâmetros OUT são difíceis de entender.\nÉ impossível dizer se um parâmetro é de entrada ou saída apenas olhando para a chamada da função\nAlém disso, funções com parâmetros OUT não podem ser chamadas por SQL.\n</p>\n\n<h2>Código em desconformidade</h2>\n\n<pre>\nCREATE OR REPLACE FUNCTION get_product_info(id IN NUMBER, value OUT NUMBER) RETURN VARCHAR2 IS\nBEGIN\n ...\nEND;\n</pre>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/IdenticalExpression.html",
    "content": "<p>\nUsar o mesmo valor nos dois lados de um operador é quase sempre um equívoco.\nPode ser um erro causado por copiar/colar e então ser um bug ou simplesmente ser código desnecessários que deve ser simplificado.\n</p>\n\n<h2>Código em desconformidade</h2>\n\n<pre>\nif a = a then ...\n</pre>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/IfWithExit.html",
    "content": "<p>\nPara melhorar a legibilidade sempre use EXIT WHEN em vez de um IF para sair de um loop.\n</p>\n\n<h2>Código em desconformidade</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nif condition1 then\n  exit;\nend if;\n</pre>\n\n<h2>Código correto</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nexit when condition1;\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/InequalityUsage.html",
    "content": "<p>\nAs formas \"<>\", \"!=\", \"~=\" and \"^=\" são equivalentes, mas apenas a forma \"<>\" está definida no padrão ANSI SQL.\n</p>\n\n<h2>Código em desconformidade</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nif a != b then\n</pre>\n\n<h2>Código correto</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nif a <> b then\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/InsertWithoutColumns.html",
    "content": "<p>\nEspecifique as colunas em um comando insert para evitar que o código pare de funcionar após adicionar uma nova coluna na tabela.\n</p>\n\n<h2>Código em desconformidade</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\ninsert into tab values (1);\n</pre>\n\n<h2>Código correto</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\ninsert into tab (col) values (1);\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/InvalidReferenceToObject.html",
    "content": "<p>\nNo Oracle Forms, vários procedimentos e funções precisam de uma refererência a um objeto (blocos, itens, alertas...).\nInfelizmente, a única forma de passar uma referência a um objeto é usando uma variável VARCHAR2 e essas referências\nnão são verificadas pelo compilador.\n</p>\n\n<p>Atualmente essa regra verifica os seguintes métodos:</p>\n\n<strong>Bultins para alertas:</strong>\n<ul>\n<li>FIND_ALERT</li>\n<li>SET_ALERT_BUTTON_PROPERTY</li>\n<li>SET_ALERT_PROPERTY</li>\n<li>SHOW_ALERT</li>\n</ul>\n\n<strong>Bultins para blocos:</strong>\n<ul>\n<li>FIND_BLOCK</li>\n<li>GET_BLOCK_PROPERTY</li>\n<li>GO_BLOCK</li>\n<li>SET_BLOCK_PROPERTY</li>\n</ul>\n\n<strong>Bultins para itens:</strong>\n<ul>\n<li>CHECKBOX_CHECKED</li>\n<li>CONVERT_OTHER_VALUE</li>\n<li>DISPLAY_ITEM</li>\n<li>FIND_ITEM</li>\n<li>GET_ITEM_INSTANCE_PROPERTY</li>\n<li>GET_ITEM_PROPERTY</li>\n<li>GET_RADIO_BUTTON_PROPERTY</li>\n<li>GO_ITEM</li>\n<li>IMAGE_SCROLL</li>\n<li>IMAGE_ZOOM</li>\n<li>IMAGE_ZOOM</li>\n<li>PLAY_SOUND</li>\n<li>READ_IMAGE_FILE</li>\n<li>READ_SOUND_FILE</li>\n<li>RECALCULATE</li>\n<li>SET_ITEM_INSTANCE_PROPERTY</li>\n<li>SET_ITEM_PROPERTY</li>\n<li>SET_ITEM_PROPERTY</li>\n<li>SET_RADIO_BUTTON_PROPERTY</li>\n<li>SET_RADIO_BUTTON_PROPERTY</li>\n<li>WRITE_IMAGE_FILE</li>\n<li>WRITE_SOUND_FILE</li>\n</ul>\n\n<strong>Bultins para LOVs:</strong>\n<ul>\n<li>FIND_LOV</li>\n<li>GET_LOV_PROPERTY</li>\n<li>SET_LOV_COLUMN_PROPERTY</li>\n<li>SET_LOV_PROPERTY</li>\n<li>SHOW_LOV</li>\n</ul>\n\n<p><strong>Nota</strong>: essa regra é desativada automaticamente quando a propriedade <code>sonar.plsql.forms.metadata</code> do projeto não está definida.</p>."
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/NotASelectedExpression.html",
    "content": "<p>\nEm um SELECT DISTINCT com uma cláusula ORDER BY, se você especificar um valor no ORDER BY que não existe \nna cláusula SELECT, o Oracle retornará a exceção <code>ORA-01791: not a SELECTed expression</code>. \n</p>\n\n<p>Veja esse exemplo:</p>\n\n<pre>\nSELECT DISTINCT item.name\n  FROM item\n ORDER BY item.group_id\n</pre>\n\n<p>\nA coluna <code>item.id</code> não está na cláusula SELECT, então o Oracle causará um ORA-01791. A versão corrigida pode ser: \n</p>\n\n<pre>\nSELECT DISTINCT item.name, item.group_id\n  FROM item\n ORDER BY item.group_id\n</pre>\n\n<p>\nSe uma coluna na cláusula SELECT tem um alias, você também pode usar o alias na cláusula ORDER BY:\n</p>\n\n<pre>\n-- consultas válidas\nSELECT DISTINCT item.name AS full_name\n  FROM item\n ORDER BY item.name;\n \nSELECT DISTINCT item.name AS full_name\n  FROM item\n ORDER BY full_name;\n</pre>\n\n<p>\nEsteja ciente de que até a versão 11.2.0.4, o Oracle aceitava alguns valores incorretos em ORDER BY, como:\n</p>\n\n<pre>\nSELECT DISTINCT UPPER(item.name) AS full_name, item.group_id\n  FROM item\n ORDER BY item.name -- deveria ser \"UPPER(item.name)\" ou \"full_name\" \n</pre>\n\n<p>\nVocê deve corrigir as consultas para evitar problemas de compatibilidade com versões mais novas do Oracle.\n</p>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/NotFound.html",
    "content": "<p>Use cursor%NOTFOUND em vez de NOT cursor%FOUND.</p>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/NvlWithNullParameter.html",
    "content": "<p>\nA função NVL serve para substituir um valor nulo por um valor válido. Então, não especifque o literal NULL ou uma string vazia como parâmetro de uma chamada para NVL.\n</p>\n\n<h2>Código em desconformidade</h2>\n\n<pre>\nvar := nvl(x, '');\n</pre>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/ParsingError.html",
    "content": "<p>\nQuando o parser PL/SQL falha é possível registrar essa falha como uma violação no arquivo. Dessa forma, é possível registrar o número de arquivos que\nnão foram processados pelo parser e também identificar facilmente porque eles não foram entendidos.\n</p>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/QueryWithoutExceptionHandling.html",
    "content": "<p>\nGeralmente você deve adicionar um bloco de tratamento de exceptions para comandos SELECT, para evitar exceções inesperadas.\n</p>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/RaiseStandardException.html",
    "content": "<p>\nVocê deve revisar todos os comandos RAISE que causam exceções pré-definidas, porque normalmente esse é um sinal de lógica ruim. Considere esse exemplo:\n</p>\n\n<pre>\nCREATE OR REPLACE FUNCTION grupo_tem_usuario(id IN NUMBER) RETURN BOOLEAN IS\n  tem_usuario BOOLEAN;\n  usuario_id  usuario_grupo.usuario_id%TYPE;\nBEGIN\n  BEGIN\n    SELECT usuario_grupo.usuario_id\n      INTO grupo_id\n      FROM usuario_grupo\n     WHERE usuario_grupo.grupo_id = id;\n     \n    RAISE TOO_MANY_ROWS;\n  EXCEPTION\n    WHEN NO_DATA_FOUND THEN\n      tem_usuario := FALSE;\n    WHEN TOO_MANY_ROWS THEN\n      tem_usuario := TRUE;\n  END;\n  \n  RETURN tem_usuario;\nEND;\n</pre>\n\n<p>\nNesse caso, a exceção TOO_MANY_ROWS está sendo usada como mecanismo de controle de fluxo. Essa função poderia ser reescrita para evitar o comando RAISE:\n</p>\n\n<pre>\nCREATE OR REPLACE FUNCTION grupo_tem_usuario(id IN NUMBER) RETURN BOOLEAN IS\n  numero_de_usuarios NUMBER;\nBEGIN\n  BEGIN\n    SELECT COUNT(*)\n      INTO numero_de_usuarios\n      FROM usuario_grupo\n     WHERE usuario_grupo.grupo_id = id;\n  EXCEPTION\n    WHEN OTHERS THEN\n      numero_de_usuarios := 0;\n  END;\n  \n  RETURN numero_de_usuarios > 0;\nEND;\n</pre>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/RedundantExpectation.html",
    "content": "<p>De acordo com a <a href=\"http://utplsql.org/utPLSQL/latest/userguide/expectations.html\">documentação do utPLSQL</a>:</p>\n\n<blockquote>\n  A validação do código sob teste (a lógica testada do procedimento/função/etc.) é executada comparando\n  os dados reais com os dados esperados. O utPLSQL usa uma combinação de expectativa e um comparador para executar\n  a validação nos dados.\n</blockquote>\n\n<p>\n  Algumas validações são escritas no formato <code>ut.expect(valor_real).matcher(valor_esperado)</code>.\n  Essa regra verifica se o <code>valor_real</code> e o <code>valor_esperado</code> são a mesma coisa. Exemplo:\n</p>\n\n<pre>\n...\nbegin\n  v_expected := '2345';\n  v_actual := betwnstr('1234567', 2, 5);\n  ut.expect(v_actual).to_equal(v_actual); -- Essa expectativa está errada, ela é sempre verdadeira\nend;\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/ReturnOfBooleanExpression.html",
    "content": "<p>\nO retorno de literais boolean envolvidos em um IF-THEN-ELSE devem ser simplificados.\n</p>\n\n<h2>Código em desconformidade</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nIF expression THEN\n  RETURN TRUE;\nELSE\n  RETURN FALSE;\nEND IF;\n</pre>\n\n<h2>Código correto</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nRETURN expression;\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/SameBranch.html",
    "content": "<p>Ter duas branches na mesma estrutura <code>if</code> com a mesma implementação é código duplicado na melhor das hipóteses,\nna pior é um erro de programação. Se a mesma lógica é realmente necessária para as duas situações, então as condições devem ser combinadas.</p>\n\n<h2>Código em desconformidade</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nIF var BETWEEN 0 AND 10 THEN\n  do_the_thing();\nELSIF var BETWEEN 10 AND 20 THEN\n  do_the_thing(); -- Noncompliant; duplicates first condition\nELSIF var BETWEEN 20 AND 50 THEN\n  do_the_another_thing();\nELSE\n  do_the_rest()\nEND IF;\n</pre>\n\n<h2>Código correto</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nIF var BETWEEN 0 AND 10 THEN\n  do_the_thing();\nELSIF var BETWEEN 10 AND 20 THEN\n  do_the_second_thing();\nELSIF var BETWEEN 20 AND 50 THEN\n  do_the_another_thing();\nELSE\n  do_the_rest()\nEND IF;\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/SameCondition.html",
    "content": "<p>\nDuplicar uma condição em uma comparação é quase sempre um equívoco.\nPode ser um erro causado por copiar/colar e então ser um bug ou simplesmente ser código desnecessários que deve ser simplificado.\n</p>\n\n<h2>Código em desconformidade</h2>\n\n<pre>\nIF (x = 1) AND (x = 1) THEN ...\n</pre>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/SelectAllColumns.html",
    "content": "<p>\nSELECT * retorna todas as colunas disponíveis. Você deve listar explicitamente as colunas necessárias.\nAo usar *, você deve considerar a possibilidade de novas colunas serem adicionadas à tabela no futuro.\n</p>\n\n<h2>Código em desconformidade</h2>\n\n<pre>\nbegin\n  select *\n    into var\n    from emp;\n  \n  select emp.*\n    into var\n    from emp;\nend;\n</pre>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/SelectWithRownumAndOrderBy.html",
    "content": "<p>\nEm uma expressão SELECT, a cláusula WHERE é executada antes da cláusula ORDER BY. Considere esse exemplo:\n</p>\n\n<pre>\nDECLARE\n  CURSOR usuarios_recentes IS\n    SELECT usuario.nome,\n           usuario.data_de_criacao\n      FROM usuario\n     WHERE ROWNUM <= 5\n     ORDER BY usuario.data_de_criacao DESC;\nBEGIN\n  ...\n</pre>\n\n<p>\nEssa consulta não retornará os últimos 5 usuários criados. O banco de dados filtrará os usuários sem nenhuma ordenação e só então aplicará a cláusula ORDER BY. A consulta corrigida é:\n</p>\n\n<pre>\nDECLARE\n  CURSOR usuarios_recentes IS\n    SELECT nome,\n           data_de_criacao\n      FROM (SELECT usuario.nome,\n                   usuario.data_de_criacao\n              FROM usuario\n             ORDER BY user.data_de_criacao DESC)\n     WHERE ROWNUM <= 5;\nBEGIN\n  ...\n</pre>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/ToCharInOrderBy.html",
    "content": "<p>O uso da função <code>TO_CHAR</code> em um <code>ORDER BY</code> quase sempre é um erro.\n  O valor da coluna será ordenado alfabeticamente em vez de ser ordenado de acordo com o tipo de dados da coluna.</p>\n\n<h2>Código em desconformidade</h2>\n\n<p>Supondo que temos os dados abaixo na tabela <code>EMP</code>:</p>\n\n<table>\n  <tr>\n    <td>empno</td>\n    <td>hiredate</td>\n  </tr>\n  <tr>\n    <td>1</td>\n    <td>2019-10-01</td>\n  </tr>\n  <tr>\n    <td>5</td>\n    <td>2019-10-10</td>\n  </tr>\n  <tr>\n    <td>15</td>\n    <td>2018-10-02</td>\n  </tr>\n  <tr>\n    <td>20</td>\n    <td>2018-10-20</td>\n  </tr>\n</table>\n\nAs consultas abaixo retornam um resultado indesejado:\n\n<p><code>select empno from emp order by to_char(empno);</code></p>\n\n<table>\n  <tr>\n    <td>empno</td>\n  </tr>\n  <tr>\n    <td>1</td>\n  </tr>\n  <tr>\n    <td>15</td>\n  </tr>\n  <tr>\n    <td>20</td>\n  </tr>\n  <tr>\n    <td>5</td>\n  </tr>\n</table>\n\n<p><code>select hiredate from emp order by to_char(hiredate, 'dd-mm-rrrr');</code></p>\n\n<table>\n  <tr>\n    <td>hiredate</td>\n  </tr>\n  <tr>\n    <td>01-OCT-19</td>\n  </tr>\n  <tr>\n    <td>02-OCT-18</td>\n  </tr>\n  <tr>\n    <td>10-OCT-19</td>\n  </tr>\n  <tr>\n    <td>20-OCT-18</td>\n  </tr>\n</table>\n\n<h2>Código correto</h2>\n\nPara ordernar essa colunas corretamente precisamos remover a chamada para <code>TO_CHAR</code>.\n\n<p><code>select empno from emp order by empno;</code></p>\n\n<table>\n  <tr>\n    <td>empno</td>\n  </tr>\n  <tr>\n    <td>1</td>\n  </tr>\n  <tr>\n    <td>5</td>\n  </tr>\n  <tr>\n    <td>15</td>\n  </tr>\n  <tr>\n    <td>20</td>\n  </tr>\n</table>\n\n<p><code>select hiredate from emp order by hiredate;</code></p>\n\n<table>\n  <tr>\n    <td>hiredate</td>\n  </tr>\n  <tr>\n    <td>02-OCT-18</td>\n  </tr>\n  <tr>\n    <td>20-OCT-18</td>\n  </tr>\n  <tr>\n    <td>01-OCT-19</td>\n  </tr>\n  <tr>\n    <td>10-OCT-19</td>\n  </tr>\n</table>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/ToDateWithoutFormat.html",
    "content": "<p>\nSempre especifique o formato da data nas chamadas para TO_DATE.\n</p>\n\n<h2>Código em desconformidade</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nbegin\n  var := to_date('2015-01-01');\nend;\n</pre>\n\n<h2>Código correto</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nbegin\n  var := to_date('2015-01-01', 'YYYY-MM-DD');\nend;\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/TooManyRowsHandler.html",
    "content": "<p>\nQuando um comando SELECT INTO causa a exceção pré-definida TOO_MANY_ROWS os valores das variáveis na cláusula INTO ficam indefinidos.\n</p>\n\n<h2>Código em desconformidade</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nbegin\n  select empno\n    into var\n    from emp;\nexception\n  when too_many_rows then\n    null;\nend;\n</pre>\n\n<h2>Código correto</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nbegin\n  select empno\n    into var\n    from emp;\nexception\n  when too_many_rows then\n    var := null;\nend;\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/UnhandledUserDefinedException.html",
    "content": "<p>\nQuando uma exceção é declarada e não é tratada no código, lançar essa exceção causa o erro \n\"ORA-06510: PL/SQL: unhandled user-defined exception\" no banco de dados ou o erro \"User-defined exception\" no\nOracle Forms. \n</p>\n\n<p>\nÉ uma boa prática sempre tratar exceções personalizadas.\n</p>\n\n<h2>Código em desconformidade</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nDECLARE\n  my_exception EXCEPTION;\nBEGIN\n  ...\n  RAISE my_exception; -- isso causará um \"user-defined exception\"\nEND;\n</pre>\n\n<h2>Código correto</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nDECLARE\n  my_exception EXCEPTION;\nBEGIN\n  ...\n  RAISE my_exception;\nEXCEPTION\n  WHEN my_exception THEN\n    ...\nEND;\n</pre>\n\n<p>\nEssa verificação também registrará uma violação se a exceção é tratada por um OTHERS e que tem uma referência a SQLERRM.\nNessa situação, a variável SQLERRM retornará \"User-defined exception\", o que não é muito útil.\n</p>\n\n<pre>\nDECLARE\n  my_exception EXCEPTION;\nBEGIN\n  ...\n  RAISE my_exception;\nEXCEPTION\n  WHEN OTHERS THEN\n    log(SQLERRM);\nEND;\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/UnnecessaryAliasInQuery.html",
    "content": "<p>\nUm alias pode ser usado em tabelas quando você pretende adicionar a mesma tabela mais que uma vez na cláusula FROM\n(por exemplo, em self join) ou para reduzir o nome da tabela para tornar a instrução SQL menor e mais fácil de ler.\nMas se forem abusados, os aliases podem ter o efeito oposto: diminuir a legibilidade.\n</p>\n\n<p>\nPrefira usar aliases apenas quando a tabela aparece mais de uma vez em uma consulta.\n</p>\n\n<h2>Código em desconformidade</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nSELECT a.id,\n       b.id,\n       b.name\n  FROM employee a,\n       dept b\n WHERE a.dept_id = b.id;\n</pre>\n\n<h2>Código correto</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nSELECT employee.id,\n       dept.id,\n       dept.name\n  FROM employee,\n       dept\n WHERE employee.dept_id = dept.id;\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/UnnecessaryElse.html",
    "content": "<p>\nQuando a cláusula IF de uma estrutura IF-THEN-ELSE não completa normalmente, a cláusa ELSE é desnecessária.  \n</p>\n\n<h2>Código em desconformidade</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nBEGIN\n  IF condition THEN\n    RETURN value;\n  ELSE\n    value := NULL;\n  END IF;\nEND;\n</pre>\n\n<h2>Código correto</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nBEGIN\n  IF condition THEN\n    RETURN value;\n  END IF;\n  \n  value := NULL;\nEND;\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/UnnecessaryLike.html",
    "content": "<p>\n  Usar uma condição LIKE sem um curinga (% ou _) é suspeito. Um desenvolvedor pode supor que o curinha foi esquecido\n  ou se deveria ser um teste de igualdade.\n</p>\n\n<h2>Código em desconformidade</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nif (last_name like 'Smith') ...\n</pre>\n\n<h2>Código correto</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nif (last_name like 'Smith%') ...\n\n-- or\nif (last_name = 'Smith') ...\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/UnnecessaryNullStatement.html",
    "content": "Uma instrução NULL no mesmo nível de outras instruções é inútil, portanto deve ser removida.\n\n<h2>Código em desconformidade</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nBEGIN\n  var := 1;\n  NULL; -- essa instrução NULL pode ser removida\nEND\n</pre>\n\n<h2>Código correto</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nBEGIN\n  var := 1;\nEND\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/UnusedCursor.html",
    "content": "<p>\nSe um cursor é declarado mas não é usado, é código inútil e deve ser removido.\nFazer isso melhorará a manutenibilidade porque os desenvolvedores não terão que se preocupar com qual seria a utilidade do cursor.\n</p>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/UnusedParameter.html",
    "content": "<p>Parâmetros não usados causam confusão. Não importa quais valores sejam passados para tais parâmetros, o comportamento do método será o mesmo.</p>\n\n<h2>Código em desconformidade</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nPROCEDURE do_something(a IN NUMBER, b IN NUMBER) IS -- \"b\" is unused\nBEGIN\n  compute(a);\nEND;\n</pre>\n\n<h2>Código correto</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nPROCEDURE do_something(a IN NUMBER) IS\nBEGIN\n  compute(a);\nEND;\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/UnusedVariable.html",
    "content": "<p>\nSe uma variável local é declarada mas não é usada, é código inútil e deve ser removida.\nFazer isso melhorará a manutenibilidade porque os desenvolvedores não terão que se preocupar com qual seria a utilidade da variável.\n</p>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/UselessParenthesis.html",
    "content": "<p>Parênteses desnecessários podem às vezes ser confusos e por isso devem ser removidos.</p>\n\n<h2>Código em desconformidade</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nif ((a = b)) then ...\n</pre>\n\n<h2>Código correto</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nif (a = b) then ...\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/VariableHiding.html",
    "content": "<p>\nRedeclarar variáveis em um escopo mais interno é permitido no PL/SQL, mas pode causar confusão e por isso deve ser evitado.\n</p>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/VariableInCount.html",
    "content": "Usar a built-in COUNT com variáveis locais é confuso e na maioria das vezes é um erro de programação.\n\n<h2>Código em desconformidade</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nDECLARE\n  v_empno emp.empno%TYPE;\n  ...\nBEGIN\n  \n  -- Como a variável v_empno é NULL nesse ponto, esse COUNT sempre retornará 0.\n  SELECT COUNT(v_empno)\n    INTO i\n    FROM employee\n   WHERE employee.deptno = v_deptno;\nEND;\n</pre>\n\n<h2>Código correto</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nBEGIN\n  SELECT COUNT(*)\n    INTO i\n    FROM employee\n   WHERE employee.deptno = v_deptno;\nEND;\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/VariableInitializationWithFunctionCall.html",
    "content": "<p>\nSe a inicialização falhar você não será capaz de tratar o erro no bloco de exceções.\n</p>\n\n<h2>Código em desconformidade</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"noncompliant\">\nDECLARE\n  employee_name emp.name%TYPE := get_employee_name(id => 5);\nBEGIN\n  ...\nEND;\n</pre>\n\n<h2>Código correto</h2>\n\n<pre data-diff-id=\"1\" data-diff-type=\"compliant\">\nDECLARE\n  employee_name emp.name%TYPE;\nBEGIN\n  employee_name := get_employee_name(id => 5);\n  ...\nEND;\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/VariableInitializationWithNull.html",
    "content": "<p>\nPor padrão, novas variáveis e campos de um RECORD são inicializados com NULL. Então você não precisa inicializá-las com NULL.\n</p>"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/VariableName.html",
    "content": "<p>\nEssa regra verifica se os nomes de todas as variáveis são aceitos na expressão regular fornecida.\n</p>\n\n<h2>Examplo</h2>\n\n<p>Considerando a expressão regular padrão:</p>\n\n<pre>\nDECLARE\n  dept_name dept.name%type; -- Correto\n  dept_name_ dept.name%type; -- Em desconformidade\nBEGIN\n  ...\nEND;\n</pre>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR/rules/plsql/XPath.html",
    "content": "<p>Essa regra permite a definição de regras personalizadas usando expressões XPath.</p>\n<p>Os problemas são criados dependendo do retorno da expressão XPath. Se a expressão XPath retornar:</p>\n<ul>\n  <li>um único nó ou uma lista de nós AST, então um problema é criado para cada nó com a mensagem definida</li>\n  <li>um boolean, então um problema a nível de arquivo é criado com a mensagem definida se o boolean for verdadeiro</li>\n  <li>qualquer outra situação, nenhum problema é criado</li>\n</ul>\n"
  },
  {
    "path": "zpa-checks/src/main/resources/org/sonar/l10n/plsqlopen_pt_BR.properties",
    "content": "AddParenthesesInNestedExpression.message=Adicione parnteses em volta dessa condio AND para tornar a precedncia dos operadores mais explcita.\nAddParenthesesInNestedExpression.name=Adicione parnteses em expresses aninhadas\nCharacterDatatypeUsage.message=Use VARCHAR2 em vez de {0}.\nCharacterDatatypeUsage.name=Use VARCHAR2 em vez de CHAR ou VARCHAR\nCollapsibleIfStatements.message=Esse comando IF pode ser unido com o IF do nvel acima.\nCollapsibleIfStatements.name=Comandos \"if\" aninhados devem ser unificados\nColumnsShouldHaveTableName.message=Especifique a tabela da coluna \"{0}\".\nColumnsShouldHaveTableName.name=As colunas em um SELECT devem ter o nome da tabela\nCommitRollback.message=Evite {0} a menos que esteja em uma transao autnoma.\nCommitRollback.name=Evite COMMIT/ROLLBACK em objetos do banco de dados\nComparisonWithBoolean.message=Remova o literal \"{0}\" dessa comparao.\nComparisonWithBoolean.name=Evite comparaes desnecessrias com literais booleanos\nComparisonWithNull.message=Corrija essa comparao ou altere para \"{0}\".\nComparisonWithNull.name=No compare valores com o literal NULL ou uma string vazia\nConcatenationWithNull.message=Revise essa concatenao com valor NULL.\nConcatenationWithNull.name=Concatenao desnecessria com valor NULL\nCursorBodyInPackageSpec.message=Mova o corpo do cursor \"{0}\" para o corpo do pacote.\nCursorBodyInPackageSpec.name=No declare corpos de cursores em uma especificao de pacote\nDbmsOutputPut.message=Evite chamadas diretas aos procedimentos DBMS_OUTPUT.\nDbmsOutputPut.name=Evite chamadas diretas aos procedimentos DBMS_OUTPUT\nDeadCode.message=Esse cdigo nunca ser executado.\nDeadCode.name=Cdigo morto deve ser removido\nDeclareSectionWithoutDeclarations.message=Remova essa palavra-chave DECLARE.\nDeclareSectionWithoutDeclarations.name=No adicione a palavra-chave DECLARE quando o bloco no conter nenhuma declarao\nDisabledTest.message=Corrija ou remova esse teste unitrio desativado.\nDisabledTest.name=Testes no devem ser desativados\nDuplicateConditionIfElsif.message=Esse cdigo no ser executado porque a condio duplica uma condio anterior desse mesmo comando \"if/elsif\".\nDuplicateConditionIfElsif.name=Instrues \"if/elsif\" relacionadas no podem ter a mesma condio\nDuplicatedValueInIn.message=Remova ou corrija o valor duplicado \"{0}\" nessa condio IN.\nDuplicatedValueInIn.name=Valor duplicado em uma condio IN\nEmptyBlock.message=Remova ou preencha esse bloco de cdigo.\nEmptyBlock.name=Blocos vazios devem ser removidos\nEmptyStringAssignment.message=Substitua essa string vazia por NULL.\nEmptyStringAssignment.name=Evite usar strings vazias para representar NULL\nExplicitInParameter.message=Declare explicitamente esse parmetro como IN.\nExplicitInParameter.name=O modo do parmetro deve estar definido explicitamente\nFunctionWithOutParameter.message=Reescreva essa funo para no depender de parmetros OUT.\nFunctionWithOutParameter.name=Evite funes com parmetros OUT\nIdenticalExpression.message=Expresses idnticas nos dois lados do operador \"{0}\".\nIdenticalExpression.name=Expresses idnticas no devem ser usadas nos dois lados de um operador\nIfWithExit.message=Substitua esse IF ... EXIT por um comando EXIT WHEN.\nIfWithExit.name=Use EXIT WHEN em vez de um comando IF para sair de um loop\nInequalityUsage.message=Substitua \"{0}\" por \"<>\".\nInequalityUsage.name=Apenas o operador \"<>\" deve ser usado para testar diferena\nInsertWithoutColumns.message=Especifique as colunas nesse INSERT.\nInsertWithoutColumns.name=Sempre especifique as colunas em um comando INSERT\nInvalidReferenceToObject.message=Referncia invlida para o objeto \"{0}\" nessa chamada para {1}.\nInvalidReferenceToObject.name=Referncia invlida para objeto do Oracle Forms\nNotASelectedExpression.message=Esse valor no existe na clusula SELECT. Corrija essa expresso ou adicione esse valor no SELECT.\nNotASelectedExpression.name=Os itens de um ORDER BY devem existir na consulta caso ela seja um SELECT DISTINCT\nNotFound.message=Use %NOTFOUND em vez de NOT ...%FOUND.\nNotFound.name=Use cursor%NOTFOUND em vez de NOT cursor%FOUND\nNvlWithNullParameter.message=Esse NVL no tem nenhum efeito. Corrija o parmetro {0} ou remova esse NVL.\nNvlWithNullParameter.name=No passe o literal NULL ou uma string vazia para o NVL\nParsingError.message=Esse trecho de cdigo no foi identificado corretamente pelo parser. Nenhum problema ser reportado nele.\nParsingError.name=Falha no parser\nQueryWithoutExceptionHandling.message=Trate as excees dessa consulta.\nQueryWithoutExceptionHandling.name=Evite consultas sem um bloco de tratamento de excees\nQueryWithoutExceptionHandling.param.strictMode=Se falso, permite que blocos internos fiquem sem tratamento de exceo.\nRaiseStandardException.message=Evite lanar a exceo padro {0}.\nRaiseStandardException.name=Evite lanar excees pr-definidas\nRedundantExpectation.message=Essa expectativa de teste  redundante. O valor testado  o mesmo que  usado no comparador.\nRedundantExpectation.name=Expectativas de teste no devem ser redundantes\nReturnOfBooleanExpression.message=Substitua esse if-then-else por um nico comando RETURN.\nReturnOfBooleanExpression.name=O retorno de expresses boolean no deve estar dentro de um comando \"if-then-else\"\nSameBranch.message=Una essa branch com o cdigo idntico na linha {0} or altere uma das implementaes.\nSameBranch.name=Branches da mesma estrutura condicional no devem ter exatamente a mesma implementao\nSameCondition.message=Essa condio duplica a que est na linha {0}.\nSameCondition.name=Condies idnticas no devem estar duplicadas\nSelectAllColumns.message=SELECT * no deve ser usado.\nSelectAllColumns.name=SELECT * no deve ser usado\nSelectWithRownumAndOrderBy.message=Mova essa comparao com ROWNUM para um nvel mais externo para garantir a ordenao.\nSelectWithRownumAndOrderBy.name=Um SELECT no pode ter uma comparao com ROWNUM e um ORDER BY no mesmo nvel\nToCharInOrderBy.message=Esse TO_CHAR pode estar fazendo com que os registros sejam retornados na ordem incorreta.\nToCharInOrderBy.name=Evite TO_CHAR em uma clusula ORDER BY\nToDateWithoutFormat.message=Especifique o formato da data nesse TO_DATE.\nToDateWithoutFormat.name=TO_DATE sem formato da data\nTooManyRowsHandler.message=Trate as variveis utilizadas em comandos SELECT INTO aqui para que elas no fiquem com valores indefinidos.\nTooManyRowsHandler.name=Evite mascarar a exceo TOO_MANY_ROWS\nUnhandledUserDefinedException.message=No h um tratamento para a exceo \"{0}\" aqui. Isso causar o erro \"user-defined exception\".\nUnhandledUserDefinedException.name=Excees definidas pelo usurio devem ser tratadas\nUnnecessaryAliasInQuery.message=Esse comando tem apenas uma referncia para a tabela \"{0}\". Remova o alias \"{1}\" para tornar o cdigo mais legvel.\nUnnecessaryAliasInQuery.name=Alias desnecessrio em tabela\nUnnecessaryAliasInQuery.param.acceptedLength=Ignorar alias com tamanho maior ou igual a esse\nUnnecessaryElse.message=Esse ELSE pode ser substitudo por um END IF. Se IF correspondente for executado, a execuo do cdigo ser interrompida. Caso contrrio, o cdigo dentro desse ELSE ser sempre executado, estando dentro de um ELSE ou no.\nUnnecessaryElse.name=Clusula ELSE desnecessria\nUnnecessaryLike.message=Essa condio LIKE no est utilizando nenhum curinga. Substituia por um comparador de igualdade ou adicione um curinga.\nUnnecessaryLike.name=No use condies LIKE sem curingas\nUnnecessaryNullStatement.message=Essa instruo NULL no tem nenhum efeito aqui.\nUnnecessaryNullStatement.name=Instruo NULL desnecessria\nUnusedCursor.message=Remova esse cursor \"{0}\" no utilizado.\nUnusedCursor.name=Cursores no utilizados devem ser removidos\nUnusedParameter.message=Remova esse parmetro \"{0}\" no utilizado.\nUnusedParameter.name=Parmetros no utilizados devem ser removidos\nUnusedParameter.param.ignoreMethods=Expresso regular que identifica os nomes de mtodos que devem ser ignorados nessa validao\nUnusedVariable.message=Remova essa varivel local \"{0}\" no utilizada.\nUnusedVariable.name=Variveis no utilizadas devem ser removidas\nUselessParenthesis.message=Remova esses parnteses desnecessrios.\nUselessParenthesis.name=Parnteses desnecessrios em expresses devem ser removidos para evitar qualquer mal entendido\nVariableHiding.message=Essa varivel \"{0}\" oculta a declarao da linha {1}.\nVariableHiding.name=No redeclare variveis em um escopo mais interno\nVariableInCount.message=Parece que h uma varivel \"{0}\" nesse contexto. Revise se esse COUNT est correto.\nVariableInCount.name=No passe variveis para a funo COUNT\nVariableInitializationWithFunctionCall.message=Mova essa inicializao para o bloco BEGIN...END.\nVariableInitializationWithFunctionCall.name=Evite inicializar variveis com chamadas de funes na seo de declaraes\nVariableInitializationWithNull.message=Remova essa inicializao desnecessria para NULL.\nVariableInitializationWithNull.name=Variveis e campos de um RECORD no precisam ser inicializados com NULL\nVariableName.message=Renomeie {0} para corresponder  expresso regular {1}.\nVariableName.name=As variveis devem seguir o padro de nomenclatura\nXPath.name=Controle violaes a partir de uma expresso XPath\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/AddParenthesesInNestedExpressionCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass AddParenthesesInNestedExpressionCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"add_parentheses_in_nested_expression.sql\"), AddParenthesesInNestedExpressionCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/BaseCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.BeforeEach\nimport java.util.*\n\nabstract class BaseCheckTest {\n\n    @BeforeEach\n    fun setUp() {\n        Locale.setDefault(Locale.ENGLISH)\n    }\n\n    protected fun getPath(filename: String) = defaultResourceFolder + filename\n\n    companion object {\n        private const val defaultResourceFolder = \"src/test/resources/checks/\"\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/CharacterDatatypeUsageCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass CharacterDatatypeUsageCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"character_datatype_usage.sql\"), CharacterDatatypeUsageCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/CheckListTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport java.io.File\n\nclass CheckListTest {\n\n    /**\n     * Enforces that each check declared in list.\n     */\n    @Test\n    fun count() {\n        val files = File(\"src/main/kotlin/com/felipebz/zpa/checks/\")\n            .list { _, name -> name.contains(\"Check.\") && !name.startsWith(\"Abstract\") }\n            .map { File(it).nameWithoutExtension }\n            .toTypedArray()\n\n        assertThat(CheckList.checks.map { it.simpleName }).containsExactlyInAnyOrder(*files)\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/CollapsibleIfStatementsCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass CollapsibleIfStatementsCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"collapsible_if_statements.sql\"), CollapsibleIfStatementsCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/ColumnsShouldHaveTableNameCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass ColumnsShouldHaveTableNameCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"columns_should_have_table_name.sql\"), ColumnsShouldHaveTableNameCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/CommitRollbackCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass CommitRollbackCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"commit_rollback.sql\"), CommitRollbackCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/ComparisonWithBooleanCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass ComparisonWithBooleanCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"comparison_with_boolean.sql\"), ComparisonWithBooleanCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/ComparisonWithNullCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass ComparisonWithNullCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"comparison_with_null.sql\"), ComparisonWithNullCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/ConcatenationWithNullCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass ConcatenationWithNullCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"concatenation_with_null.sql\"), ConcatenationWithNullCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/CursorBodyInPackageSpecCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass CursorBodyInPackageSpecCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"cursor_body_in_package_spec.sql\"), CursorBodyInPackageSpecCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/DbmsOutputPutCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass DbmsOutputPutCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"dbms_output_put.sql\"), DbmsOutputPutCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/DeadCodeCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass DeadCodeCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"dead_code.sql\"), DeadCodeCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/DeclareSectionWithoutDeclarationsCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass DeclareSectionWithoutDeclarationsCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"declare_section_without_declarations.sql\"), DeclareSectionWithoutDeclarationsCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/DisabledTestCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass DisabledTestCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"disabled_test.sql\"), DisabledTestCheck())\n    }\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/DuplicateConditionIfElsifCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass DuplicateConditionIfElsifCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"duplicate_condition_if_elsif.sql\"), DuplicateConditionIfElsifCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/DuplicatedValueInInCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass DuplicatedValueInInCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"duplicated_value_in_in.sql\"), DuplicatedValueInInCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/EmptyBlockCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass EmptyBlockCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"empty_block.sql\"), EmptyBlockCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/EmptyStringAssignmentCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass EmptyStringAssignmentCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"empty_string_assignment.sql\"), EmptyStringAssignmentCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/ExplicitInParameterCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass ExplicitInParameterCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"explicit_in_parameter.sql\"), ExplicitInParameterCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/FunctionWithOutParameterCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass FunctionWithOutParameterCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"function_with_out_parameter.sql\"), FunctionWithOutParameterCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/IdenticalExpressionCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass IdenticalExpressionCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"identical_expression.sql\"), IdenticalExpressionCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/IfWithExitCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass IfWithExitCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"if_with_exit.sql\"), IfWithExitCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/InequalityUsageCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass InequalityUsageCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"inequality_usage_check.sql\"), InequalityUsageCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/InsertWithoutColumnsCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass InsertWithoutColumnsCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"insert_without_columns.sql\"), InsertWithoutColumnsCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/InvalidReferenceToObjectCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\nimport com.felipebz.zpa.metadata.Block\nimport com.felipebz.zpa.metadata.FormsMetadata\n\nclass InvalidReferenceToObjectCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        val metadata = FormsMetadata()\n        metadata.alerts = listOf(\"foo\")\n        metadata.blocks = listOf(Block(\"foo\", arrayOf(\"item1\")))\n        metadata.lovs = listOf(\"foo\")\n        PlSqlCheckVerifier.verify(getPath(\"invalid_reference_to_object.sql\"), InvalidReferenceToObjectCheck(), metadata)\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/NotASelectedExpressionCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass NotASelectedExpressionCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"not_a_selected_expression.sql\"), NotASelectedExpressionCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/NotFoundCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass NotFoundCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"not_found.sql\"), NotFoundCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/NvlWithNullParameterCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass NvlWithNullParameterCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"nvl_with_null_parameter.sql\"), NvlWithNullParameterCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/ParsingErrorCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.RecognitionException\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.parser.PlSqlParser\nimport com.felipebz.zpa.squid.PlSqlConfiguration\nimport com.felipebz.zpa.api.PlSqlVisitorContext\nimport java.io.File\nimport java.nio.charset.StandardCharsets\n\nclass ParsingErrorCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        val file = File(\"src/test/resources/checks/parsing_error.sql\")\n\n        val parser = PlSqlParser.create(PlSqlConfiguration(StandardCharsets.UTF_8))\n        val context: PlSqlVisitorContext\n        try {\n            parser.parse(file)\n            throw IllegalStateException(\"Expected RecognitionException\")\n        } catch (e: RecognitionException) {\n            context = PlSqlVisitorContext(null, e, null)\n        }\n\n        val check = ParsingErrorCheck()\n        val issues = check.scanFileForIssues(context)\n        assertThat(issues).hasSize(1)\n        assertThat(issues[0].primaryLocation().startLine()).isEqualTo(1)\n    }\n\n    @Test\n    fun testTolerantParsing() {\n        val file = File(\"src/test/resources/checks/parsing_error.sql\")\n\n        val parser = PlSqlParser.create(PlSqlConfiguration(StandardCharsets.UTF_8, isErrorRecoveryEnabled = true))\n\n        val rootTree = parser.parse(file)\n        val context = PlSqlVisitorContext(rootTree, null, null)\n\n        val check = ParsingErrorCheck()\n        val issues = check.scanFileForIssues(context)\n        assertThat(issues).hasSize(1)\n        assertThat(issues[0].primaryLocation().startLine()).isEqualTo(1)\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/QueryWithoutExceptionHandlingCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass QueryWithoutExceptionHandlingCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"query_without_exception_handling.sql\"), QueryWithoutExceptionHandlingCheck())\n    }\n\n    @Test\n    fun testNoStrict() {\n        val check = QueryWithoutExceptionHandlingCheck()\n        check.strictMode = false\n        PlSqlCheckVerifier.verify(getPath(\"query_without_exception_handling_no_strict.sql\"), check)\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/RaiseStandardExceptionCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass RaiseStandardExceptionCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"raise_standard_exception.sql\"), RaiseStandardExceptionCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/RedundantExpectationCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass RedundantExpectationCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"redundant_expectation.sql\"), RedundantExpectationCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/ReturnOfBooleanExpressionCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass ReturnOfBooleanExpressionCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"return_of_boolean_expression.sql\"), ReturnOfBooleanExpressionCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/SameBranchCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass SameBranchCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"same_branch.sql\"), SameBranchCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/SameConditionCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass SameConditionCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"same_condition.sql\"), SameConditionCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/SelectAllColumnsCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass SelectAllColumnsCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"select_all_columns.sql\"), SelectAllColumnsCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/SelectWithRownumAndOrderByCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass SelectWithRownumAndOrderByCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"select_with_rownum_and_order_by.sql\"), SelectWithRownumAndOrderByCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/ToCharInOrderByCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass ToCharInOrderByCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"to_char_in_order_by.sql\"), ToCharInOrderByCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/ToDateWithoutFormatCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass ToDateWithoutFormatCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"to_date_without_format.sql\"), ToDateWithoutFormatCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/TooManyRowsHandlerCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass TooManyRowsHandlerCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"too_many_rows_handler.sql\"), TooManyRowsHandlerCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/UnhandledUserDefinedExceptionCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass UnhandledUserDefinedExceptionCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"unhandled_user_defined_exception.sql\"), UnhandledUserDefinedExceptionCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/UnnecessaryAliasInQueryCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass UnnecessaryAliasInQueryCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"unnecessary_alias_in_query.sql\"), UnnecessaryAliasInQueryCheck())\n    }\n\n    @Test\n    fun test2() {\n        val check = UnnecessaryAliasInQueryCheck()\n        check.acceptedLength = 4\n\n        PlSqlCheckVerifier.verify(getPath(\"unnecessary_alias_in_query_custom_length.sql\"), check)\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/UnnecessaryElseCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass UnnecessaryElseCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"unnecessary_else.sql\"), UnnecessaryElseCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/UnnecessaryLikeCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass UnnecessaryLikeCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"unnecessary_like.sql\"), UnnecessaryLikeCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/UnnecessaryNullStatementCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass UnnecessaryNullStatementCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"unnecessary_null_statement.sql\"), UnnecessaryNullStatementCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/UnusedCursorCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass UnusedCursorCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"unused_cursor.sql\"), UnusedCursorCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/UnusedParameterCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass UnusedParameterCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"unused_parameter.sql\"), UnusedParameterCheck())\n    }\n\n    @Test\n    fun testIgnoreMethodsByName() {\n        val check = UnusedParameterCheck()\n        check.ignoreMethods = \"(on_.*|fullmatch)\"\n        PlSqlCheckVerifier.verify(getPath(\"unused_parameter_ignore_methods.sql\"), check)\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/UnusedVariableCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass UnusedVariableCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"unused_variable.sql\"), UnusedVariableCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/UselessParenthesisCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass UselessParenthesisCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"useless_parenthesis.sql\"), UselessParenthesisCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/VariableHidingCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass VariableHidingCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"variable_hiding.sql\"), VariableHidingCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/VariableInCountCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass VariableInCountCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"variable_in_count.sql\"), VariableInCountCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/VariableInitializationWithFunctionCallCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass VariableInitializationWithFunctionCallCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"variable_initialization_with_function_call.sql\"), VariableInitializationWithFunctionCallCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/VariableInitializationWithNullCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass VariableInitializationWithNullCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"variable_initialization_with_null.sql\"), VariableInitializationWithNullCheck())\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/VariableNameCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\n\nclass VariableNameCheckTest : BaseCheckTest() {\n\n    @Test\n    fun test() {\n        PlSqlCheckVerifier.verify(getPath(\"variable_name.sql\"), VariableNameCheck())\n    }\n\n    @Test\n    fun testIgnoreMethodsByName() {\n        val check = VariableNameCheck()\n        check.regexp = \"\\\\w{3,}\"\n        PlSqlCheckVerifier.verify(getPath(\"variable_name_alternative.sql\"), check)\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/kotlin/com/felipebz/zpa/checks/XPathCheckTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport com.felipebz.zpa.checks.verifier.PlSqlCheckVerifier\nimport com.felipebz.zpa.squid.AnalysisException\n\nclass XPathCheckTest : BaseCheckTest() {\n\n    @Test\n    fun line_level_issue() {\n        analyze(\"xpath_statement.sql\", \"//STATEMENT\")\n    }\n\n    @Test\n    fun boolean_true_result() {\n        analyze(\"xpath_count_statement.sql\", \"count(//STATEMENT) > 0\")\n    }\n\n    @Test\n    fun boolean_false_result() {\n        analyze(\"xpath.sql\", \"count(//STATEMENT) < 0\")\n    }\n\n    @Test\n    fun integer_xpath_result() {\n        analyze(\"xpath.sql\", \"count(//STATEMENT)\")\n    }\n\n    @Test\n    fun empty_query() {\n        analyze(\"xpath.sql\", \"\")\n    }\n\n    @Test\n    fun invalid_query() {\n        assertThrows<AnalysisException> {\n            analyze(\"xpath.sql\", \"+++\")\n        }\n    }\n\n    private fun analyze(fileName: String, xpathQuery: String) {\n        val check = XPathCheck()\n        check.xpathQuery = xpathQuery\n        check.message = MESSAGE\n        PlSqlCheckVerifier.verify(\"src/test/resources/checks/$fileName\", check)\n    }\n\n    companion object {\n        private const val MESSAGE = \"Avoid statements\"\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/add_parentheses_in_nested_expression.sql",
    "content": "begin\n  var := (x = 1 or x = 2 and y = 3); -- Noncompliant {{Add parentheses around this AND condition to make the operator precedence explicit.}}\n--                 ^^^^^^^^^^^^^^^\n  var := (x = 1 or x = 2 and y = 3 or -- Noncompliant \n--                 ^^^^^^^^^^^^^^^\n         x = 4 and y = 5); -- Noncompliant\n--       ^^^^^^^^^^^^^^^\n  \n  select 1\n    into var\n    from dual\n   where x = 1\n      or x = 2 -- Noncompliant [[sc=10;el=+1;ec=15]]\n     and y = 3;\n     \n  -- correct\n  var := (x = 1 or (x = 2 and y = 3));\n  var := (x = 1 or (x = 2 and y = 3) or (x = 4 and y = 5));\n  \n  select 1\n    into var\n    from dual\n   where x = 1\n      or (x = 2\n     and y = 3);\nend;"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/character_datatype_usage.sql",
    "content": "declare\n  var1 varchar(10); -- Noncompliant {{Use VARCHAR2 instead of VARCHAR.}}\n  var2 char(10); -- Noncompliant {{Use VARCHAR2 instead of CHAR.}}\n  \n  var3 varchar2(10); -- compliant\nbegin\n  null;\nend;"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/collapsible_if_statements.sql",
    "content": "begin\n  -- can be collapsed\n  if x = 1 then\n    if y = 2 then -- Noncompliant {{This IF statement can be merged with the enclosing one.}}\n      null;\n    end if;\n  end if;\n  \n  if x = 1 then\n    if y = 2 then -- Noncompliant\n      if z = 3 then -- Noncompliant\n        null;\n      end if;\n    end if;\n  end if;\n  \n  -- cannot be collapsed\n  -- if with elsif\n  if x = 1 then\n    if y = 2 then\n      null;\n    end if;\n  elsif x = 2 then\n    null;\n  end if;\n  \n  -- if with else\n  if x = 1 then\n    if y = 2 then\n      null;\n    end if;\n  else\n    null;\n  end if;\n  \n  -- if with more than 1 statement\n  if x = 1 then\n    null;\n    \n    if y = 2 then\n      null;\n    end if;\n  end if;\n  \n  if x = 1 then\n    if y = 2 then\n      null;\n    end if;\n    \n    null;\n  end if;\n  \n  -- internal if has elsif/else\n  if x = 1 then\n    if y = 2 then\n      null;\n    elsif y = 3 then\n      null;\n    else\n      null;\n    end if;\n  elsif x = 2 then\n    null;\n  end if;\nend;\n/"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/columns_should_have_table_name.sql",
    "content": "declare\n  my_var number;\nbegin\n  select col, -- Noncompliant {{Specify the table of column \"col\".}}\n--       ^^^\n         tab.col,\n         func(col),\n         'text'\n    from tab, tab2;\n  \n  -- do not create issue when the select has one table\n  select col,\n         tab.col,\n         func(col),\n         'text'\n    from tab;\n    \n  -- do not report error in rownum\n  select rownum\n    from tab, tab2;\n  \n  -- do not report error when the column is a known variable\n  insert into tab (foo, bar, baz)\n    (select other.foo,\n            my_var, -- compliant\n            other.baz \n       from other, other2);\n\n  select my_var; -- do not report error in queries without tables\nend;\n\n-- DML in scripts should be checked too\nselect col, -- Noncompliant {{Specify the table of column \"col\".}}\n--     ^^^\n       tab.col,\n       func(col),\n       'text'\n  from tab, tab2\n/\n"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/commit_rollback.sql",
    "content": "create procedure test is\n\n  procedure test2 is\n    pragma autonomous_transaction;\n  begin\n    commit; -- no violation here, it is in an autonomous transaction\n  end;\n  \nbegin\n commit; -- Noncompliant {{Avoid COMMIT calls unless it is in an autonomous transaction.}}\n \n begin\n   rollback; -- Noncompliant {{Avoid ROLLBACK calls unless it is in an autonomous transaction.}}\n\n   -- should ignore rollback to savepoint\n   rollback to savepoint s1;\n   rollback to s1;\n end;\nend;\n/\n\nbegin\n  commit; -- correct, it isn't a database object\nend;\n/\n"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/comparison_with_boolean.sql",
    "content": "begin\n  var := (x = true); -- Noncompliant {{Remove the literal \"TRUE\" of this comparison.}}\n  var := (x != true); -- Noncompliant\n  var := (x = false); -- Noncompliant {{Remove the literal \"FALSE\" of this comparison.}} \n  var := (x != false); -- Noncompliant\n  var := (true = true); -- Noncompliant\n  \n  var := (x = y);\nend;"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/comparison_with_null.sql",
    "content": "begin\n  -- noncompliant code\n  var := (foo = null); -- Noncompliant {{Fix this comparison or change to \"IS NULL\".}}\n--        ^^^^^^^^^^\n\n  var := (foo = ''); -- Noncompliant\n--        ^^^^^^^^\n\n  var := (foo <> null); -- Noncompliant {{Fix this comparison or change to \"IS NOT NULL\".}}\n--        ^^^^^^^^^^^\n\n  var := (foo <> ''); -- Noncompliant\n--        ^^^^^^^^^\n  \n  -- valid code\n  var := (foo is null);\n  var := (foo is not null);\n  var := (foo = 'x');\n  var := (foo <> 'x');\n  var := (foo = 1);\nend;"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/concatenation_with_null.sql",
    "content": "begin\n  var := 'a'||null; -- Noncompliant {{Review this concatenation with NULL value.}}\n--            ^^^^\n\n  var := 'a'||''; -- Noncompliant\n--            ^^\n\n  var := 'a'||'1';\nend;"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/cursor_body_in_package_spec.sql",
    "content": "create package pkg is\n  cursor cur is -- Noncompliant {{Move the body of the cursor \"CUR\" to the package body.}}\n    select dummy from dual;\nend;\n/\ncreate package pkg is\n  type cur_type is record(dummy varchar2(1));\n  cursor cur return cur_type; -- Compliant\nend;\n/\ncreate package body pkg is\n  cursor cur is -- Compliant\n    select dummy from dual;\nend;\n/\n"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/dbms_output_put.sql",
    "content": "begin\n  dbms_output.put('x'); -- Noncompliant {{Avoid direct calls to DBMS_OUTPUT procedures.}}\n  dbms_output.put_line('x'); -- Noncompliant\n  sys.dbms_output.put_line('x'); -- Noncompliant\n  \n  my_output.put_line('x');\n  dbms_output.other('x');\n  put_line('x');\n  x.exists();\nend;"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/dead_code.sql",
    "content": "begin\n  return;\n  \n  var := 1; -- Noncompliant {{This code will never be executed.}}\nend;\n/\n\nbegin\n  raise_application_error(-20999, 'Custom error message');\n  \n  var := 1; -- Noncompliant\nend;\n/\n\nbegin\n  raise;\n\n  var := 1; -- Noncompliant\nend;\n/\n\nbegin\n  for i in 1..10 loop\n      continue;\n      var := 1; -- Noncompliant\n  end loop;\nend;\n/\n\nbegin\n  for i in 1..10 loop\n      exit;\n      var := 1; -- Noncompliant\n  end loop;\nend;\n/\n\nbegin\n  begin\n    return;\n  end;\n  \n  var := 1; -- Noncompliant\nend;\n/\n\nbegin\n  begin\n    begin\n      return;\n    end;\n  end;\n  \n  var := 1; -- Noncompliant\nend;\n/\n\n-- correct\nbegin\n  return;\nend;\n/\n\nbegin\n  raise;\nend;\n/\n\nbegin\n  raise_application_error(-20999, 'Custom error message');\nend;\n/\n\nbegin\n  for i in 1..10 loop\n      continue when i = 5;\n      var := 1;\n  end loop;\nend;\n/\n\nbegin\n  for i in 1..10 loop\n    exit when i = 5;\n    var := 1;\n  end loop;\nend;\n/\n\nbegin\n  begin\n    return;\n  exception\n    when others then\n      null;\n  end;\n  \n  var := 1;\nend;\n/\n\nbegin\n  begin\n    begin\n      return;\n    end;\n  exception\n    when others then\n      null;\n  end;\n  \n  var := 1; -- violation\nend;\n/\n"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/declare_section_without_declarations.sql",
    "content": "begin\n  declare -- Noncompliant {{Remove this DECLARE keyword.}}\n  begin\n    null;\n  end;\n  \n  declare\n    var number;\n  begin\n    null;\n  end;\nend;"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/disabled_test.sql",
    "content": "create or replace package testpkg is\n\n  -- %suite\n\n  -- Noncompliant@+2 {{Fix or remove this disabled unit test.}}\n  -- %test\n  -- %disabled\n  procedure test;\n\n  -- %test\n  -- %disabled with some reason\n  procedure test2;\n\nend testpkg;\n"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/duplicate_condition_if_elsif.sql",
    "content": "begin\n  if foo then\n    null;\n  elsif foo then -- Noncompliant {{This code can not be reached because the condition duplicates a previous condition in the same sequence of \"if/else if\" statements.}}\n    null;\n  end if;\n  \n  if foo then\n    null;\n  elsif bar then\n    null;\n  elsif bar then -- Noncompliant\n    null;\n  elsif (bar) then -- Noncompliant\n    null;\n  end if;\n  \n  -- correct\n  if foo then\n    null;\n  end if;\n  \n  if foo then\n    null;\n  elsif bar then\n    null;\n  elsif baz then\n    null;\n  end if;\nend;\n/"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/duplicated_value_in_in.sql",
    "content": "begin\n  var := (x in (1, 1, 2)); -- Noncompliant {{Remove or fix the duplicated value \"1\" in the IN condition.}} [[secondary=2]]\n--                 ^\n  \n  select col\n    into var\n    from tab\n   where col in (x, y, x); -- Noncompliant {{Remove or fix the duplicated value \"x\" in the IN condition.}} [[secondary=8]]\n--                     ^\n   \n  -- correct\n  var := (x in (1, 2, 3));\nend;"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/empty_block.sql",
    "content": "begin\n  null; -- Noncompliant {{Either remove or fill this block of code.}}\nend;\n/\ncreate type body t as\n  not overriding member procedure foo as\n  begin\n    null; -- Noncompliant\n  end;\n\n  overriding member procedure foo as\n  begin\n    null;  -- Compliant, don't report violation on overriding member\n  end;\n\n  overriding member procedure foo as\n  begin\n    begin\n      null; -- Noncompliant\n    end;\n  end;\nend;\n/\ndeclare\n  var number;\nbegin\n  null;\n  var := 1;\nend;\n/\ndeclare\n  var number;\nbegin\n  var := 1;\nend;\n/\n"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/empty_string_assignment.sql",
    "content": "begin\n  var := ''; -- Noncompliant {{Replace this empty string by NULL.}}\n  \n  -- correct\n  var := ' ';\n  var := 'x';\n  var := null;\nend;"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/explicit_in_parameter.sql",
    "content": "create or replace procedure foo(bar number) is -- Noncompliant {{Explicitly declare this parameter as IN.}}\n--                              ^^^^^^^^^^\nbegin\n  null;\nend;\n/\ncreate or replace procedure foo(p1 in number,\n                                p2 out number,\n                                p3 in out number) is\n  cursor cur(pcur number) is -- cursor parameters cannot raise a violation\n    select 1\n      from dual;\nbegin\n  null;\nend;\n/\n"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/function_with_out_parameter.sql",
    "content": "create function foo(x in number,\n                    y out number) -- Noncompliant {{Rewrite this function to not depend on OUT parameters.}}\n       return number is\nbegin\n  null;\nend;\n/\ncreate function foo(x in number,\n                    y in out number) -- Noncompliant\n       return number is\nbegin\n  null;\nend;\n/\n\ncreate package pck is\n  function foo(x in number,\n               y out number) -- Noncompliant\n         return number is\n  begin\n    null;\n  end;\n  function foo(x in number,\n               y in out number) -- Noncompliant\n         return number is\n  begin\n    null;\n  end;\nend;\n/\n\n-- correct\ncreate function foo return number is\nbegin\n  null;\nend;\n/"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/identical_expression.sql",
    "content": "begin\n  var := (a = a); -- Noncompliant {{Identical expressions on both sides of operator \"=\".}} [[secondary=2]]\n--        ^\n  \n  select 1\n    into var\n    from tab\n   where tab.col = tab.col; -- Noncompliant [[secondary=8]]\n--       ^^^^^^^\n  \n  var := not a = a; -- Noncompliant [[secondary=11]]\n--           ^\n\n  var := (a) = a; -- Noncompliant [[secondary=14]]\n--       ^^^\n\n  var := (a + b + (c)) = a + (b) + c; -- Noncompliant [[secondary=17]]\n--       ^^^^^^^^^^^^^\n  \n  -- valid\n  var := (a = b);\nend;"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/if_with_exit.sql",
    "content": "begin\n  if (x = y) then -- Noncompliant {{Replace this IF ... EXIT by a EXIT WHEN statement.}} [[sc=3;el=+2;ec=10]]\n    exit;\n  end if;\n  \n  if (x = y) then\n    foo := bar;\n    exit; -- ok\n  end if;\n  \n  if (x = y) then\n    exit; -- ok\n    foo := bar;\n  end if;\n  \n  if (x = y) then\n    exit; -- ok\n  elsif (x = z) then\n    null;\n  end if;\n  \n  if (x = y) then\n    exit; -- ok\n  else\n    null;\n  end if;\n  \n  loop\n    exit; -- ok\n  end loop;\nend;"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/inequality_usage_check.sql",
    "content": "begin\n  foo := (x != a); -- Noncompliant {{Replace \"!=\" by \"<>\".}}\n  foo := (x ^= a); -- Noncompliant {{Replace \"^=\" by \"<>\".}}\n  foo := (x ~= a); -- Noncompliant {{Replace \"~=\" by \"<>\".}}\n  \n  -- valid usage\n  foo := (x <> a);\nend;"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/insert_without_columns.sql",
    "content": "declare\n  var tab%rowtype;\n\n  subtype my_type is tab%rowtype;\n  v_my_type my_type;\n\n  type t_tab is table of tab%rowtype index by binary_integer;\n  v_tab t_tab;\nbegin\n  insert into tab values (1); -- Noncompliant {{Specify the columns in this INSERT.}}\n  \n  insert into tab (col) values (1);\n\n  insert into tab values var;\n\n  insert into tab values var returning id into v_id;\n\n  for r_t in (select * from mytable) loop\n      insert into mytable values r_t;\n  end loop;\n\n  forall idx in v_tab.first .. v_tab.last\n  insert into tab values v_tab(idx);\n\n  insert into tab values v_tab(idx);\n\n  insert into tab values v_my_type;\n\nend;\n"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/invalid_reference_to_object.sql",
    "content": "begin\n  ---------------\n  -- ALERT\n  ---------------\n  find_alert(var); -- ignore variables\n  find_alert('foo');\n  find_alert('invalid'); -- Noncompliant {{Invalid reference to the object \"invalid\" in this FIND_ALERT call.}}\n--           ^^^^^^^^^\n\n  set_alert_button_property('foo', alert_button1, label, 'label');\n  set_alert_button_property('invalid', alert_button1, label, 'label'); -- Noncompliant\n--                          ^^^^^^^^^\n\n  set_alert_property('foo', title, 'title');\n  set_alert_property('invalid', title, 'title'); -- Noncompliant\n--                   ^^^^^^^^^\n\n  show_alert('foo');\n  show_alert('invalid'); -- Noncompliant\n--           ^^^^^^^^^\n\n\n  ---------------\n  -- BLOCK\n  ---------------\n  find_block('foo');\n  find_block('invalid'); -- Noncompliant\n--           ^^^^^^^^^\n\n  get_block_property('foo', order_by);\n  get_block_property('invalid', order_by); -- Noncompliant\n--                   ^^^^^^^^^\n\n  go_block('foo');\n  go_block('invalid'); -- Noncompliant\n--         ^^^^^^^^^\n\n  set_block_property('foo', order_by, 'col');\n  set_block_property('invalid', order_by, 'col'); -- Noncompliant\n--                   ^^^^^^^^^\n\n  set_block_property('foo', blockscrollbar_position, x, y);\n  set_block_property('invalid', blockscrollbar_position, x, y); -- Noncompliant\n--                   ^^^^^^^^^\n\n\n  ---------------\n  -- ITEM\n  ---------------\n  checkbox_checked('foo.item1');\n  checkbox_checked('foo.invalid'); -- Noncompliant\n--                 ^^^^^^^^^^^^^\n  \n  convert_other_value('foo.item1');\n  convert_other_value('foo.invalid'); -- Noncompliant\n--                    ^^^^^^^^^^^^^\n\n  display_item('foo.item1', 'bar');\n  display_item('foo.invalid', 'bar'); -- Noncompliant\n--             ^^^^^^^^^^^^^\n\n  find_item('foo.item1');\n  find_item('foo.invalid'); -- Noncompliant\n--          ^^^^^^^^^^^^^\n\n  get_item_instance_property('foo.item1', current_record, visual_attribute);\n  get_item_instance_property('foo.invalid', current_record, visual_attribute); -- Noncompliant\n--                           ^^^^^^^^^^^^^\n\n  get_item_property('foo.item1', enabled);\n  get_item_property('foo.invalid', enabled); -- Noncompliant\n--                  ^^^^^^^^^^^^^\n\n  get_radio_button_property('foo.item1', 'bar', label);\n  get_radio_button_property('foo.invalid', 'bar', label); -- Noncompliant\n--                          ^^^^^^^^^^^^^\n\n  go_item('foo.item1');\n  go_item('foo.invalid'); -- Noncompliant\n--        ^^^^^^^^^^^^^\n\n  image_scroll('foo.item1', x, y);\n  image_scroll('foo.invalid', x, y); -- Noncompliant\n--             ^^^^^^^^^^^^^\n\n  image_zoom('foo.item1', adjust_to_fit);\n  image_zoom('foo.invalid', adjust_to_fit); -- Noncompliant\n--           ^^^^^^^^^^^^^\n\n  image_zoom('foo.item1', zoom_in_factor, 10);\n  image_zoom('foo.invalid', zoom_in_factor, 10); -- Noncompliant\n--           ^^^^^^^^^^^^^\n\n  play_sound('foo.item1');\n  play_sound('foo.invalid'); -- Noncompliant\n--           ^^^^^^^^^^^^^\n\n  read_image_file('file.jpg', 'jpg', 'foo.item1');\n  read_image_file('file.jpg', 'jpg', 'foo.invalid'); -- Noncompliant\n--                                   ^^^^^^^^^^^^^\n\n  read_sound_file('file.wav', 'wave', 'foo.item1');\n  read_sound_file('file.wav', 'wave', 'foo.invalid'); -- Noncompliant\n--                                    ^^^^^^^^^^^^^\n\n  recalculate('foo.item1');\n  recalculate('foo.invalid'); -- Noncompliant\n--            ^^^^^^^^^^^^^\n\n  set_item_instance_property('foo.item1', currrent_record, visual_attribute, 'bar');\n  set_item_instance_property('foo.invalid', currrent_record, visual_attribute, 'bar'); -- Noncompliant\n--                           ^^^^^^^^^^^^^\n\n  set_item_property('foo.item1', enabled, property_false);\n  set_item_property('foo.invalid', enabled, property_false); -- Noncompliant\n--                  ^^^^^^^^^^^^^\n\n  set_item_property('foo.item1', position, x, y);\n  set_item_property('foo.invalid', position, x, y); -- Noncompliant\n--                  ^^^^^^^^^^^^^\n\n  set_radio_button_property('foo.item1', 'bar', enabled, property_false);\n  set_radio_button_property('foo.invalid', 'bar', enabled, property_false); -- Noncompliant\n--                          ^^^^^^^^^^^^^\n\n  set_radio_button_property('foo.item1', 'bar', position, x, y);\n  set_radio_button_property('foo.invalid', 'bar', position, x, y); -- Noncompliant\n--                          ^^^^^^^^^^^^^\n\n  write_image_file('file.jpg', 'jpg', 'foo.item1', maximize_compression, original_depth);\n  write_image_file('file.jpg', 'jpg', 'foo.invalid', maximize_compression, original_depth); -- Noncompliant\n--                                    ^^^^^^^^^^^^^\n\n  write_sound_file('file.wav', 'wave', 'foo.item1', original_quality, original_setting);\n  write_sound_file('file.wav', 'wave', 'foo.invalid', original_quality, original_setting); -- Noncompliant\n--                                     ^^^^^^^^^^^^^\n\n  ---------------\n  -- LOV\n  ---------------\n  find_lov('foo');\n  find_lov('invalid'); -- Noncompliant\n--         ^^^^^^^^^\n\n  get_lov_property('foo', title);\n  get_lov_property('invalid', title); -- Noncompliant\n--                 ^^^^^^^^^\n\n  set_lov_column_property('foo', 1, title, 'title');\n  set_lov_column_property('invalid', 1, title, 'title'); -- Noncompliant\n--                        ^^^^^^^^^\n\n  set_lov_property('foo', title, 'title');\n  set_lov_property('invalid', title, 'title'); -- Noncompliant\n--                 ^^^^^^^^^\n\n  set_lov_property('foo', position, x, y);\n  set_lov_property('invalid', position, x, y); -- Noncompliant\n--                 ^^^^^^^^^\n\n  show_lov('foo');\n  show_lov('invalid'); -- Noncompliant\n--         ^^^^^^^^^\nend;"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/not_a_selected_expression.sql",
    "content": "select distinct emp.name\n  from emp\n order by emp.id; -- Noncompliant {{This value does not exists in the SELECT clause. Fix this expression or add this value in the SELECT.}}\n--        ^^^^^^\n\nselect distinct substr(emp.name, 0, 10) emp_name\n  from emp\n order by emp.name; -- Noncompliant\n--        ^^^^^^^^\n\n-- Compliant queries\nselect distinct substr(emp.name, 0, 10) emp_name\n  from emp\n order by substr(emp.name, 0, 10);\n\nselect distinct substr(emp.name, 0, 10) emp_name\n  from emp\n order by emp_name;\n\nselect distinct substr(emp.name, 0, 10) emp_name\n  from emp\n order by 1;\n\nselect distinct emp.name\n  from emp\n order by emp.name;\n\n select distinct name\n  from emp\n order by name;\n\nselect distinct emp.name\n  from emp\n order by name;\n\nselect emp.name\n  from emp\n order by emp.id;\n\nselect distinct emp.name\n  from emp;\n\nselect distinct emp.name emp_name\n  from emp\n order by name;\n\nselect distinct name\n  from emp\n order by emp.name;\n\nselect distinct emp.name\n  from emp\n order by length(emp.name);\n\nselect distinct (name)\n  from emp\n order by substr(name, 2);\n"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/not_found.sql",
    "content": "begin\n  var := not cur%found; -- Noncompliant {{Use %NOTFOUND instead of NOT ...%FOUND.}}\n  \n  var := cur%notfound;\n  var := not cur.found;\n  var := cur.found;\n  var := cur%found;\nend;"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/nvl_with_null_parameter.sql",
    "content": "begin\n  var := nvl(x, null); -- Noncompliant {{This NVL does not have any effect. Fix the NULL parameter or remove this NVL.}}\n--       ^^^^^^^^^^^^\n\n  var := nvl(null, x); -- Noncompliant\n--       ^^^^^^^^^^^^\n\n  var := nvl(x, ''); -- Noncompliant {{This NVL does not have any effect. Fix the '' parameter or remove this NVL.}}\n--       ^^^^^^^^^^\n\n  var := nvl('', x); -- Noncompliant\n--       ^^^^^^^^^^\n  \n  var := nvl(x, y);\n  var := nvl(x, 'y');\n  var := func(x, null);\n  var := pack.func(x, null);\nend;"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/parsing_error.sql",
    "content": "; invalid\n"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/query_without_exception_handling.sql",
    "content": "begin \n  select 1 -- Noncompliant {{Handle exceptions of this query.}}\n    into var\n    from dual;\nend;\n/\n\nbegin\n  -- This is not valid code as it causes \"PLS-00428: an INTO clause is expected in this SELECT statement\" when compiling on\n  -- the database, but I'll keep this example here because the file is being parser correctly and the check shouldn't crash.\n  select 1 -- Noncompliant {{Handle exceptions of this query.}}\n    from dual;\nend;\n/\n\nbegin\n  if (true) then \n    select 1 -- Noncompliant\n      into var\n      from dual;\n  end if;\nend;\n/\n\nbegin\n\n    begin\n      select 1 -- Noncompliant, inner block without exception handling\n        into var\n        from dual;\n    end;\n\nexception\n  when others then\n    null;\nend;\n/\n\ncreate procedure foo is\nbegin\n  select 1 -- Noncompliant\n    into var\n    from dual;\nend;\n/\n\ncreate function foo return number is\nbegin\n  select 1 -- Noncompliant\n    into var\n    from dual;\nend;\n/\n\ncreate package body pack is\n    procedure foo is\n    begin\n      select 1 -- Noncompliant\n        into var\n        from dual;\n    end;\n    \n    function foo return number is\n    begin\n      select 1 -- Noncompliant\n        into var\n        from dual;\n    end;\nend;\n/\n\n-- correct code\nbegin \n  select 1\n    into var\n    from dual;\nexception\n  when others then\n    null;\nend;\n/\n\nbegin -- outer block doesn't require an exception handling block\n    begin \n      select 1\n        into var\n        from dual;\n    exception\n      when others then\n        null;\n    end;\nend;\n/\n\ncreate trigger foo\nbefore insert on tab\nbegin\n  select 1\n    into var\n    from dual;\nexception\n  when others then\n    null;\nend;\n/\n\n-- queries with bulk collect should be ignored because they don't throw no_data_found/too_many_rows\nbegin\n  select 1\n    bulk collect into var\n    from dual;\nend;\n/\n"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/query_without_exception_handling_no_strict.sql",
    "content": "begin\n  select 1 -- Noncompliant {{Handle exceptions of this query.}}\n    into var\n    from dual;\nend;\n/\n\nbegin\n  if (true) then\n    select 1 -- Noncompliant\n      into var\n      from dual;\n  end if;\nend;\n/\n\nbegin\n\n    begin\n      select 1 -- Compliant, because strict mode is disabled\n        into var\n        from dual;\n    end;\n\nexception\n  when others then\n    null;\nend;\n/\n\ncreate procedure foo is\nbegin\n  select 1 -- Noncompliant\n    into var\n    from dual;\nend;\n/\n\ncreate function foo return number is\nbegin\n  select 1 -- Noncompliant\n    into var\n    from dual;\nend;\n/\n\ncreate package body pack is\n    procedure foo is\n    begin\n      select 1 -- Noncompliant\n        into var\n        from dual;\n    end;\n\n    function foo return number is\n    begin\n      select 1 -- Noncompliant\n        into var\n        from dual;\n    end;\nend;\n/\n\n-- correct code\nbegin\n  select 1\n    into var\n    from dual;\nexception\n  when others then\n    null;\nend;\n/\n\nbegin -- outer block doesn't require an exception handling block\n    begin\n      select 1\n        into var\n        from dual;\n    exception\n      when others then\n        null;\n    end;\nend;\n/\n\ncreate trigger foo\nbefore insert on tab\nbegin\n  select 1\n    into var\n    from dual;\nexception\n  when others then\n    null;\nend;\n/\n"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/raise_standard_exception.sql",
    "content": "declare\n  e_custom exception;\nbegin\n  raise no_data_found; -- Noncompliant {{Avoid raising the standard exception NO_DATA_FOUND.}}\n  raise too_many_rows; -- Noncompliant {{Avoid raising the standard exception TOO_MANY_ROWS.}}\n  raise e_custom;\n  raise;\nend;\n"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/redundant_expectation.sql",
    "content": "declare\n  x number;\n  y number;\nbegin\n  ut.expect(x).to_be_equal(x); -- Noncompliant\n--          ^\n\n  ut.expect(x).to_be_equal(y);\n\n  ut.expect(x).to_be_null();\nend;\n"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/return_of_boolean_expression.sql",
    "content": "begin\n  if (a = b) then -- Noncompliant {{Replace this if-then-else statement by a single return statement.}}\n    return true;\n  else\n    return false;\n  end if;\n  \n  if (a = b) then -- Noncompliant\n    return false;\n  else\n    return true;\n  end if;\n  \n  -- correct\n  if (a = b) then\n    return true;\n  elsif (a = c) then\n    return false;\n  else\n    return true;\n  end if;\n  \n  if (a = b) then\n    return true;\n  else\n    return true;\n  end if;\n  \n  if (a = b) then\n    return foo;\n  else\n    return false;\n  end if;\n  \n  if (a = b) then\n    a := 1;\n    return true;\n  else\n    return false;\n  end if;\n  \n  if (a = b) then\n    return true;\n  else\n    a := 1;\n    return false;\n  end if;\nend;"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/same_branch.sql",
    "content": "begin\n  if x then\n    var := 1;\n  elsif y then\n    var := 1; -- Noncompliant {{Either merge this branch with the identical one on line 3 or change one of the implementations.}} [[secondary=3]]\n--  ^^^^^^^^^\n  end if;\n  \n  if x then\n    var := 1;\n  else\n    var := 1; -- Noncompliant [[secondary=10]]\n--  ^^^^^^^^^\n  end if;\n  \n  if x then\n    var := 1;\n  else\n    var := (1); -- Noncompliant [[secondary=17]]\n--  ^^^^^^^^^^^\n  end if;\n\n  -- compliant\n  if x then\n    var := 1;\n  elsif y then\n    var := 2;\n  elsif z then\n    var := 1;\n  end if;\nend;\n"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/same_condition.sql",
    "content": "begin\n  -- violations\n  var := (x = 1 and x = 1); -- Noncompliant {{This condition duplicates the one on line 3.}} [[secondary=3]]\n--                  ^^^^^\n\n  var := (x = 1 or x = 1); -- Noncompliant [[secondary=6]]\n--                 ^^^^^\n\n  var := (x = 1 or (x = 1)); -- Noncompliant [[secondary=9]]\n--                 ^^^^^^^\n\n  var := (x or nvl(x, null)); -- Noncompliant [[secondary=12]]\n--             ^^^^^^^^^^^^\n  \n  select tab.col\n    into var\n    from tab\n   where tab.col = 1\n     and tab.col = 1; -- Noncompliant [[secondary=18]]\n--       ^^^^^^^^^^^\n     \n  select tab.col\n    into var\n    from tab\n   where (tab.col = 1 and tab.col2 = 2)\n      or (tab.col = 1 and tab.col2 = 2); -- Noncompliant [[secondary=25]]\n--       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  \n  -- correct\n  var := (x = 1 and y = 2);\n  var := (x = 1 or y = 2);\n  \n  -- no violation because it is equivalent to ((x = 1 or y = 2) and x = 1)\n  -- but we could report a violation someday\n  var := (x = 1 or y = 2 and x = 1);\n  \n  -- we could report a violation someday in this case too\n  var := (x = 1 and 1 = x);\nend;"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/select_all_columns.sql",
    "content": "declare\n  cursor cur is\n    select * -- Noncompliant {{SELECT * should not be used.}}\n      from emp;\n\n  row emp%rowtype;\n\n  type my_array is table of emp%rowtype;\n  row_table my_array;\nbegin\n  -- violations\n  select * -- Noncompliant {{SELECT * should not be used.}}\n    into var\n    from emp;\n\n  select emp.* -- Noncompliant\n    into var\n    from emp;\n\n  select distinct emp.* -- Noncompliant\n    into var\n    from emp;\n\n  select user.emp.* -- Noncompliant\n    into var\n    from user.emp;\n\n  select * -- Noncompliant\n    into pkg.var\n    from emp;\n\n  select *\n    into row_table(1)\n    from emp;\n\n  -- valid code\n  select emp.empno\n    into var\n    from emp;\n\n  select emp.sal * 2 -- does not match the multiplication operator\n    into var\n    from emp;\n\n  select count(*) -- count is acceptable\n    into var\n    from emp;\n\n  select emp.sal\n    into var\n    from emp\n   where exists (select * from e); -- in a exists expression is acceptable too\n\n  select *\n    into row\n    from emp;\n\n  select *\n    bulk collect into row_table\n    from emp;\nend;\n/\ndeclare\n  v_foo emp%rowtype;\n\n  cursor cur is\n    select * -- Compliant\n      from emp;\nbegin\n  open cur;\n  fetch cur into v_foo;\n  close cur;\nend;\n/\n"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/select_with_rownum_and_order_by.sql",
    "content": "begin\n  select name\n    into var\n    from user\n   where rownum <= 1 -- Noncompliant {{Move this ROWNUM comparation to a more external level to guarantee the ordering.}}\n   order by date;\n   \n  select name\n    into var\n    from user\n   where (rownum <= 1) -- Noncompliant\n   order by date;\n   \n  -- valid code\n  select name\n    into var\n    from user\n   where func(rownum) = filter\n   order by date;\n   \n  select name\n    into var\n    from user\n   where rownum = 1;\n   \n  select name\n    into var\n    from user\n   order by date;\n   \n  select name\n    into var\n    from user\n   where foo = (select foo from bar where rownum = 1)\n   order by date;\nend;"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/to_char_in_order_by.sql",
    "content": "select *\nfrom emp\norder by to_char(empno); -- Noncompliant\n--       ^^^^^^^^^^^^^^\n\nselect to_char(empno)\nfrom emp\norder by 1; -- Noncompliant\n--       ^\n\nselect *\nfrom emp\norder by empno; -- Compliant\n\nselect empno\nfrom emp\norder by 1; -- Compliant\n\nselect empno, row_number() over (order by 0) -- Compliant\nfrom emp\norder by empno;\n\n/* Actually this code causes the error \"ORA-01785: ORDER BY item must be the number of a SELECT-list expression\".\n * It's still compliant as this is not the purpose of this rule.\n */\nselect empno\nfrom emp\norder by 0; -- Compliant\n\ndeclare\n  my_empno number;\nbegin\n  select *\n  into foo\n  from emp\n  order by my_empno; -- Compliant\nend;\n"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/to_date_without_format.sql",
    "content": "begin\n  mydate := to_date('2015-01-01'); -- Noncompliant {{Specify the date format in this TO_DATE.}}\n--          ^^^^^^^^^^^^^^^^^^^^^\n  to_date(null);\n  to_date('');\n  mydate := to_date('2015-01-01', 'rrrr-mm-dd');\n  mydate := my_to_date('2015-01-01');\n  mydate := pkg.to_date('2015-01-01');\nend;"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/too_many_rows_handler.sql",
    "content": "begin\n  select empno\n    into var\n    from emp;\nexception\n  when too_many_rows then -- Noncompliant {{Handle the variables used in the SELECT INTO statements here so their values do not become undefined.}}\n    null;\nend;\n\nbegin\n  select empno\n    into var\n    from emp;\nexception\n  when no_data_found or too_many_rows then -- Noncompliant\n    null;\nend;\n\n-- compliant\nbegin\n  select empno\n    into var\n    from emp;\nexception\n  when too_many_rows then\n    var := null;\nend;\n\nbegin\n  select empno\n    into var\n    from emp;\nexception\n  when too_many_rows then\n    log(sqlerrm);\n    raise myexception;\nend;\n\nbegin\n  select empno\n    into var\n    from emp;\nexception\n  when no_data_found then\n    null;\n  when pkg.error then\n    var := null;\n  when others then\n    null;\nend;"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/unhandled_user_defined_exception.sql",
    "content": "declare\n  ex exception;\n  ex_handled exception;\nbegin\n  raise ex; -- Noncompliant {{There is no exception handler for \"EX\" here. This will cause an \"user-defined exception\" error.}}\n  \n  raise ex_handled; -- ok\n  raise ex_unknown; -- ok, we don't have any information about the excepton\n  raise pkg.ex; -- ok\nexception\n  when ex_handled then\n    null;\nend;\n/\n\ndeclare\n  ex exception;\nbegin\n  raise ex; -- Noncompliant, there is an \"others\" handler for this but we will report a violation becase there is a reference to sqlerrm in others   \nexception\n  when others then\n    log(sqlerrm);\nend;\n/\n\ndeclare\n  ex exception;\nbegin\n  begin\n    raise ex; -- Noncompliant   \n  exception\n    when others then\n      log(sqlerrm);\n  end;\nend;\n/\n\ndeclare\n  ex exception;\nbegin\n  begin\n    raise ex;   \n  exception\n    when ex then\n      null;\n  end;\n  \n  if (x) then\n    raise ex; -- Noncompliant\n  end if;\nend;\n/\n\ncreate package body pack is\n  ex exception;\n  \n  procedure test is\n  begin\n    raise ex; -- we won't report a violation here because we don't have enough information to know if another method in this package handles this exception\n  end;\nend;\n/\n\ndeclare\n  ex exception;\nbegin\n  raise ex;   \nexception\n  when others then\n    null;\nend;\n/\n\ndeclare\n  ex exception;\nbegin\n  begin\n    raise ex;\n  end;   \nexception\n  when ex then\n    null;\n  when others then\n    log(sqlerrm);\nend;\n/\n\n"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/unnecessary_alias_in_query.sql",
    "content": "begin\n  select *\n    from tab x; -- Noncompliant {{This statement has only one reference to the table \"tab\". Remove the alias \"x\" to improve the readability.}}\n--           ^\n    \n  select * from tab x, tab2; -- Noncompliant\n--                  ^\n  \n  select * from tab x where exists (select 1 from tab2); -- Noncompliant\n--                  ^\n   \n  select (select 1 from tab x) from tab2; -- Noncompliant\n--                          ^\n    \n  update tab x set foo = bar where exists (select 1 from tab2); -- Noncompliant\n--           ^\n   \n  delete tab x where exists (select 1 from tab2); -- Noncompliant\n--           ^\n\n  select *\n    from tab x -- Noncompliant\n--           ^\n  union\n  select *\n    from tab x; -- Noncompliant\n    \n  -- correct\n  select *\n    from tab x,\n         tab;\n  \n  select *\n    from tab x,\n         tab y;\n  \n  select *\n    from tab,\n         tab2;\n         \n  select *\n    from tab\n   where exists (select 1 from tab x);\n   \n  update tab\n     set foo = bar\n   where exists (select 1 from tab x);\n   \n  delete tab\n   where exists (select 1 from tab x);\nend;\n/\n"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/unnecessary_alias_in_query_custom_length.sql",
    "content": "begin\n  select *\n    from tab x; -- Noncompliant {{This statement has only one reference to the table \"tab\". Remove the alias \"x\" to improve the readability.}}\n--           ^\n    \n  select *\n    from tab xxxx, -- should be ignored because the accepted length is 4\n         tab2;\nend;\n/"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/unnecessary_else.sql",
    "content": "begin\n  if (foo = bar) then\n    return;\n  else -- Noncompliant {{This ELSE can be replaced by an END IF. When the corresponding IF is executed, the code execution will be stopped. Either way, the code within this ELSE will always run, regardless of the ELSE block.}}\n    foo := null;\n  end if;\n  \n  if (foo = bar) then\n    exit;\n  else -- Noncompliant\n    foo := null;\n  end if;\n  \n  if (foo = bar) then\n    continue;\n  else -- Noncompliant\n    foo := null;\n  end if;\n  \n  if (foo = bar) then\n    raise;\n  else -- Noncompliant\n    foo := null;\n  end if;\n\n  if (foo = bar) then\n    raise_application_error(-20999, 'Custom error message');\n  else -- Noncompliant\n    foo := null;\n  end if;\nend;\n\n\n-- correct\nbegin\n  if (foo = bar) then\n    get_data;\n  else\n    foo := null;\n  end if;\n  \n  if (foo = bar) then\n    exit when baz;\n  else\n    foo := null;\n  end if;\n  \n  if (foo = bar) then\n    continue when baz;\n  else\n    foo := null;\n  end if;\n  \n  if (foo = bar) then\n    return;\n  elsif baz then\n    null;\n  else\n    foo := null;\n  end if;\nend;"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/unnecessary_like.sql",
    "content": "begin\n  var := x like 'a'; -- Noncompliant\n--       ^^^^^^^^^^\n  var := x like 'a\\%' escape '\\'; -- Noncompliant\n  var := x like 'a\\_' escape '\\';  -- Noncompliant\n  var := x like '%a';\n  var := x like 'a_';\n  var := x like '%a\\%' escape '\\';\n  var := x like '%a\\_' escape '\\';\n  var := x like y;\n  var := x like y escape z;\n  var := x like x escape '\\';\nend;\n"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/unnecessary_null_statement.sql",
    "content": "begin\n  v := 0;\n  null; -- Noncompliant {{This NULL statement does not have any effect here.}}\nend;\n/\nbegin\n  null; -- Noncompliant\n  v := 0;\nend;\n/\n\n-- correct\nbegin\n  null;\nend;\n/"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/unused_cursor.sql",
    "content": "declare\n  cursor cur is -- Noncompliant {{Remove this unused \"CUR\" cursor.}}\n    select 1 from dual;\n    \n  cursor \"cur2\" is\n    select 1 from dual;\nbegin\n  open \"cur2\";\nend;\n\ncreate package pkg is\n  cursor cur is -- compliant, this is a package specification, we don't know if there are any usages\n    select 1 from dual;\nend;\n\ncreate package body pkg is\n  cursor cur return custom_type is -- compliant, let's assume that cursors with return type are declared in package spec\n    select 1 from dual;\nend;\n"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/unused_parameter.sql",
    "content": "create procedure foo(a number, b number, \"c\" number) is -- Noncompliant {{Remove this unused \"B\" parameter.}}\n--                             ^^^^^^^^\nbegin\n  print(a);\n  print(\"c\");\nend;\n/\n\ncreate function bar(a number, b number) return number is  -- Noncompliant\n--                            ^^^^^^^^\nbegin\n  return a;\nend;\n/\n\ncreate package test is\n  procedure foo(a number, b number); -- don't report violation on declaration\n  cursor bar(a number) return my_type; -- don't report violation on declaration\n\n   procedure foo(a number, b number) is -- Noncompliant\n--                         ^^^^^^^^\n     cursor cur(x number) is -- Noncompliant {{Remove this unused \"X\" parameter.}}\n--              ^^^^^^^^\n       select 1 from dual;\n   begin\n     print(a);\n   end;\nend;\n/\ncreate type foo as object ( -- don't report violation on declarations\n  constructor function foo(x number) return self as result,\n  member procedure foo(a number, b number);\n)\n/\ncreate type t under super_t (\n  overriding member procedure foo(a number, b number); -- don't report violation on declaration\n)\n/\ncreate type body t as\n  not overriding member procedure foo(a number) as -- Noncompliant\n--                                    ^^^^^^^^\n  begin\n    null;\n  end;\n\n  overriding member procedure foo(a number, b number) as -- don't report violation on overriding member\n  begin\n    null;\n  end;\n\n  member procedure print(self in out nocopy t) is -- don't report violation on SELF parameter\n  begin\n    null;\n  end;\nend;\n/\nprocedure foo is\n  cursor cur(x number) is\n  select 1 from dual where cur.x = 1; -- don't report violation because \"cur.x\" refers to the cursor parameter\nbegin\n  null;\nend;\n/\n"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/unused_parameter_ignore_methods.sql",
    "content": "create procedure on_event(a number, b number) is \n--                             \nbegin\n  print(a);\nend;\n/\ncreate procedure fullmatch(a number, b number) is \n--                             \nbegin\n  print(a);\nend;\n/\ncreate function on_event(p_event in integer)\n    return integer\nas\nbegin\n   return 1;\nend;\n/\ncreate function bar(a number, b number) return number is  -- Noncompliant\n--                            ^^^^^^^^\nbegin\n  return a;\nend;\n/\n\n"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/unused_variable.sql",
    "content": "declare\n  var number; -- Noncompliant {{Remove this unused \"VAR\" local variable.}}\n  i number; -- Noncompliant {{Remove this unused \"I\" local variable.}}\n  \n  procedure proc is\n    proc_var number;  -- Noncompliant {{Remove this unused \"PROC_VAR\" local variable.}}\n  begin\n    null;\n  end;\n  \n  function func return number is\n    func_var number;  -- Noncompliant {{Remove this unused \"FUNC_VAR\" local variable.}}\n  begin\n    null;\n  end;\nbegin\n  null;\n  \n  declare\n    var2 number; -- Noncompliant {{Remove this unused \"VAR2\" local variable.}}\n  begin\n    null;\n  end;\n  \n  for i in 1..2 loop -- this \"i\" variable is not the same as the one in declaration section\n    func(i);\n  end loop;\nend;\n/\n\ncreate or replace package body test is\n  package_body_var number;  -- Noncompliant {{Remove this unused \"PACKAGE_BODY_VAR\" local variable.}}\n  hidden_var number;  -- Noncompliant {{Remove this unused \"HIDDEN_VAR\" local variable.}}\n  \"VAR\" number; -- Noncompliant {{Remove this unused \"VAR\" local variable.}}\n  \"var\" number;\n  \n  procedure proc is\n    hidden_var number; -- this declaration hides the previous one\n    var number; -- this declaration hides the previous \"VAR\"\n  begin\n    hidden_var := 0;\n    var := 0;\n    \"var\" := 0;\n  end;\nend;\n/\n\n-- correct\ndeclare\n  simple_var number;\n  into_var number;\n  insert_var number;\n  comparision_var number;\n  case_insensitive_test number;\n  record_variable rectype;\n  error exception;\nbegin\n  simple_var := 0;\n  CASE_INSENSITIVE_TEST := 0;\n  record_variable.field := 0;\n  \n  select 1\n    into into_var\n    from dual;\n    \n  insert into tab (x) values (insert_var);\n  \n  if (comparision_var = 1) then\n    null;\n  end if;\n  \n  for i in 1..2 loop -- \"i\" variable is not used, but it is required here\n    null;\n  end loop;\n  \n  raise error;\nend;\n/\n\ncreate or replace package test is\n  package_body_var number; -- do not report error on package specifications\nend;\n/\n\ncreate or replace package body test is\n  package_body_var number;\n  qualified_var number;\n  \n  procedure proc is\n  begin\n    package_body_var := 0;\n    test.qualified_var := 0;\n    test.var := 0;\n  end;\nend;\n/\n"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/useless_parenthesis.sql",
    "content": "begin\n  var := ((x = 1)); -- Noncompliant {{Remove those useless parenthesis.}}\n--        ^^^^^^^\n  \n  -- valid\n  var := (x = 1);\n  var := ((x = 1) or (y = 2));\nend;"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/variable_hiding.sql",
    "content": "declare\n  var number;\n  var2 number;\n  var3 number;\n  exc exception;\n  \"QUOTEDVAR\" number;\n  \n  procedure test is\n    var number; -- Noncompliant {{This variable \"VAR\" hides the declaration on line 2.}} [[secondary=2]]\n--  ^^^\n  begin\n    null;\n  end;\n  \n  function test return number is\n    var2 number; -- Noncompliant {{This variable \"VAR2\" hides the declaration on line 3.}} [[secondary=3]]\n--  ^^^^\n  begin\n    null;\n  end;\n\n  procedure test2 is\n    exc exception; -- Noncompliant {{This variable \"EXC\" hides the declaration on line 5.}} [[secondary=5]]\n--  ^^^\n  begin\n    null;\n  end;\n\nbegin\n  declare\n    var3 number; -- Noncompliant {{This variable \"VAR3\" hides the declaration on line 4.}} [[secondary=4]]\n--  ^^^^\n    quotedvar number; -- Noncompliant {{This variable \"QUOTEDVAR\" hides the declaration on line 6.}} [[secondary=6]]\n    \"QuotedVar\" number; -- this is a different variable\n  begin\n    null;\n  end;\nend;\n/\n\ncreate package body test is\n  var number;\n  \n  procedure test is\n    var number; -- Noncompliant {{This variable \"VAR\" hides the declaration on line 42.}} [[secondary=42]]\n--  ^^^\n  begin\n    for i in 1..10 loop\n      declare\n        i number; -- Noncompliant {{This variable \"I\" hides the declaration on line 48.}} [[secondary=48]]\n--      ^\n      begin\n        null;\n      end;\n    end loop;\n  end;\nend;\n/\n\ncreate package test2 is\n  var number;\n  exc exception;\nend;\n/\ncreate package body test2 is\n  var number; -- Noncompliant {{This variable \"VAR\" hides the declaration on line 61.}} [[secondary=61]]\n  exc exception; -- Noncompliant {{This variable \"EXC\" hides the declaration on line 62.}} [[secondary=62]]\nend;\n/\n\n-- correct\ndeclare\n  outer_var number;\n  \"VAR2\" number; --|\n  \"Var2\" number; --| These variables are not the same\n  \"var2\" number; --|\nbegin\n  declare\n    var number;\n  begin\n    null;\n  end;\n  \n  declare\n    var number;\n  begin\n    null;\n  end;\nend;\n/\n"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/variable_in_count.sql",
    "content": "declare\n  foo number;\nbegin\n\n  select count(foo) -- Noncompliant {{Looks like there is a \"foo\" variable in this context. Review if this COUNT is correct.}}\n--       ^^^^^^^^^^\n    from tab;\n    \n  -- don't report an error here, we don't have enough information to know if \"bar\" is a variable or a column of table \"tab\"\n  select count(bar)\n    from tab;\n\n  select count(foo, bar), -- the COUNT function has only 1 parameter, so this isn't the Oracle built-in\n         my_count(foo),\n         pack.count(foo)\n    from tab;\n    \n  bar := count(foo); -- the Oracle built-in can't be used here\nend;\n\nselect count(foo) from dual; -- we don't have a scope here\n"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/variable_initialization_with_function_call.sql",
    "content": "create procedure foo(bar in varchar2 default func(x)) is\n  var1 varchar2(1) default func(x); -- Noncompliant {{Move this initialization to the BEGIN...END block.}}\n  var2 varchar2(1) := func(x); -- Noncompliant\n  var3 json := json(); -- Compliant\n  \n  type rec is record (field varchar2(1) default func(x));\n  \n  cursor cur(param in varchar2 default func(x)) is\n    select 1 from dual;\nbegin\n  null;\nend;\n"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/variable_initialization_with_null.sql",
    "content": "create procedure foo(bar in varchar2 default null) is -- parameter declaration, no issue\n  var1 varchar2(1) default null; -- Noncompliant {{Remove this unnecessary initialization to NULL.}}\n  var2 varchar2(1) default ''; -- Noncompliant\n  var3 varchar2(1) := null; -- Noncompliant\n  var4 varchar2(1) := ''; -- Noncompliant\n  \n  type rec is record (field varchar2(1) default null); -- Noncompliant\n  \n  cursor cur(param in varchar2 default null) is -- cursor parameter, no issue\n    select 1 from dual;\nbegin\n  null;\nend;"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/variable_name.sql",
    "content": "declare\n  employee_name varchar2(100);\n  employee_name_ varchar2(100); -- Noncompliant\n--^^^^^^^^^^^^^^\nbegin\n  null;\nend;\n"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/variable_name_alternative.sql",
    "content": "declare\n  employee_name varchar2(100);\n  e varchar2(100); -- Noncompliant\n--^\nbegin\n  null;\nend;\n"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/xpath.sql",
    "content": "begin\n  null;\nend;\n"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/xpath_count_statement.sql",
    "content": "-- Noncompliant@-1 {{Avoid statements}}\nbegin\n  null;\nend;\n"
  },
  {
    "path": "zpa-checks/src/test/resources/checks/xpath_statement.sql",
    "content": "begin\n  null; -- Noncompliant {{Avoid statements}}\n--^^^^^\nend;\n"
  },
  {
    "path": "zpa-checks-testkit/build.gradle.kts",
    "content": "plugins {\n    id(\"com.felipebz.zpa.build-conventions\")\n}\n\ndependencies {\n    compileOnly(project(\":zpa-core\"))\n}\n\ndescription = \"ZPA Checks TestKit\"\n"
  },
  {
    "path": "zpa-checks-testkit/src/main/kotlin/com/felipebz/zpa/checks/verifier/PlSqlCheckVerifier.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks.verifier\n\nimport com.felipebz.flr.api.Trivia\nimport com.felipebz.zpa.TestPlSqlVisitorRunner\nimport com.felipebz.zpa.metadata.FormsMetadata\nimport com.felipebz.zpa.symbols.DefaultTypeSolver\nimport com.felipebz.zpa.symbols.ScopeImpl\nimport com.felipebz.zpa.symbols.SymbolVisitor\nimport com.felipebz.zpa.api.checks.PlSqlCheck\nimport java.io.File\n\nclass PlSqlCheckVerifier : PlSqlCheck() {\n\n    private val expectedIssues = ArrayList<TestIssue>()\n\n    override fun visitComment(trivia: Trivia, content: String) {\n        val text = content.trim { it <= ' ' }\n        val marker = \"Noncompliant\"\n\n        if (text.startsWith(marker)) {\n            var issueLine = trivia.token.line\n            var paramsAndMessage = text.substring(marker.length).trim { it <= ' ' }\n\n            if (paramsAndMessage.startsWith(\"@\")) {\n                val spaceSplit = paramsAndMessage.split(\"[\\\\s\\\\[{]\".toRegex(), 2).toTypedArray()\n\n                val shiftValue = spaceSplit[0]\n\n                if (shiftValue[1] != '+' && shiftValue[1] != '-') {\n                    throw AssertionError(\"Use only '@+N' or '@-N' to shifts messages.\")\n                }\n\n                issueLine += Integer.valueOf(shiftValue.substring(1))\n                paramsAndMessage = if (spaceSplit.size > 1) spaceSplit[1] else \"\"\n            }\n\n            val issue = TestIssue(null, issueLine)\n\n            if (paramsAndMessage.startsWith(\"{{\")) {\n                val endIndex = paramsAndMessage.indexOf(\"}}\")\n                val message = paramsAndMessage.substring(2, endIndex)\n                issue.message = message\n                paramsAndMessage = paramsAndMessage.substring(endIndex + 2).trim { it <= ' ' }\n            }\n\n            if (paramsAndMessage.startsWith(\"[[\")) {\n                val endIndex = paramsAndMessage.indexOf(\"]]\")\n                addParams(issue, paramsAndMessage.substring(2, endIndex))\n            }\n\n            expectedIssues.add(issue)\n\n        } else if (text.startsWith(\"^\")) {\n            addPreciseLocation(trivia)\n        }\n    }\n\n    private fun addPreciseLocation(trivia: Trivia) {\n        val token = trivia.token\n        val line = token.line\n        val text = token.value\n        if (token.column > 1) {\n            throw IllegalStateException(\"Line $line: comments asserting a precise location should start at column 1\")\n        }\n        val missingAssertionMessage = \"Invalid test file: a precise location is provided at line $line but no issue is asserted at line ${line - 1}\"\n        if (expectedIssues.isEmpty()) {\n            throw IllegalStateException(missingAssertionMessage)\n        }\n        val issue = expectedIssues[expectedIssues.size - 1]\n        if (issue.line != line - 1) {\n            throw IllegalStateException(missingAssertionMessage)\n        }\n        issue.endLine = issue.line\n        issue.startColumn = text.indexOf('^') + 1\n        issue.endColumn = text.lastIndexOf('^') + 2\n    }\n\n    companion object {\n\n        @JvmStatic\n        @JvmOverloads\n        fun verify(path: String, check: PlSqlCheck, metadata: FormsMetadata? = null) {\n            val verifier = PlSqlCheckVerifier()\n            val file = File(path)\n\n            TestPlSqlVisitorRunner.scanFile(file, metadata, SymbolVisitor(DefaultTypeSolver(), ScopeImpl()), verifier, check)\n            val issues = check.issues()\n\n            val actualIssues = issues.sortedBy { it.primaryLocation().startLine() }.iterator()\n            val expectedIssues = verifier.expectedIssues.sortedBy { it.line }\n\n            for (expected in expectedIssues) {\n                if (actualIssues.hasNext()) {\n                    verifyIssue(expected, actualIssues.next())\n                } else {\n                    throw AssertionError(\"Missing issue at line ${expected.line}\")\n                }\n            }\n\n            if (actualIssues.hasNext()) {\n                val issue = actualIssues.next()\n                throw AssertionError(\"Unexpected issue at line ${line(issue)}: \\\"${issue.primaryLocation().message()}\\\"\")\n            }\n\n        }\n\n        private fun verifyIssue(expected: TestIssue, actual: PreciseIssue) {\n            if (line(actual) > expected.line) {\n                throw AssertionError(\"Missing issue at line ${expected.line}\")\n            }\n            if (line(actual) < expected.line) {\n                throw AssertionError(\"Unexpected issue at line ${line(actual)}: \\\"${actual.primaryLocation().message()}\\\"\")\n            }\n            assertEquals(expected.message, actual.primaryLocation().message(), \"Bad message at line ${expected.line}\")\n            assertEquals(expected.effortToFix, actual.cost(), \"Bad effortToFix at line ${expected.line}\")\n            assertEquals(expected.startColumn, actual.primaryLocation().startLineOffset() + 1, \"Bad start column at line ${expected.line}\")\n            assertEquals(expected.endColumn, actual.primaryLocation().endLineOffset() + 1, \"Bad end column at line ${expected.line}\")\n            assertEquals(expected.endLine, actual.primaryLocation().endLine(), \"Bad end line at line ${expected.line}\")\n            assertEquals(expected.secondaryLines, secondary(actual), \"Bad secondary locations at line ${expected.line}\")\n        }\n\n        private fun assertEquals(expected: Any?, actual: Any?, message: String) {\n            if (expected != null && expected != actual) {\n                throw AssertionError(\"$message ==> expected: \\\"${expected}\\\" but was: \\\"${actual}\\\"\")\n            }\n        }\n\n        private fun secondary(issue: PreciseIssue): List<Int> {\n            val result = ArrayList<Int>()\n\n            for (issueLocation in issue.secondaryLocations()) {\n                result.add(issueLocation.startLine())\n            }\n\n            return result.sorted()\n        }\n\n        private fun line(issue: PreciseIssue): Int {\n            return issue.primaryLocation().startLine()\n        }\n\n        private fun addParams(issue: TestIssue, params: String) {\n            for (param in params.split(';')) {\n                val equalIndex = param.indexOf('=')\n                if (equalIndex == -1) {\n                    throw IllegalStateException(\"Invalid param at line 1: $param\")\n                }\n                val name = param.substring(0, equalIndex)\n                val value = param.substring(equalIndex + 1)\n\n                when {\n                    \"effortToFix\".equals(name, ignoreCase = true) -> issue.effortToFix = Integer.valueOf(value)\n                    \"sc\".equals(name, ignoreCase = true) -> issue.startColumn = Integer.valueOf(value)\n                    \"ec\".equals(name, ignoreCase = true) -> issue.endColumn = Integer.valueOf(value)\n                    \"el\".equals(name, ignoreCase = true) -> issue.endLine = lineValue(issue.line, value)\n                    \"secondary\".equals(name, ignoreCase = true) -> addSecondaryLines(issue, value)\n                    else -> throw IllegalStateException(\"Invalid param at line 1: $name\")\n                }\n            }\n        }\n\n        private fun addSecondaryLines(issue: TestIssue, value: String) {\n            val secondaryLines = ArrayList<Int>()\n            if (\"\" != value) {\n                for (secondary in value.split(',')) {\n                    secondaryLines.add(lineValue(issue.line, secondary))\n                }\n            }\n            issue.secondaryLines = secondaryLines\n        }\n\n        private fun lineValue(baseLine: Int, shift: String): Int {\n            if (shift.startsWith(\"+\")) {\n                return baseLine + Integer.valueOf(shift.substring(1))\n            }\n            return if (shift.startsWith(\"-\")) {\n                baseLine - Integer.valueOf(shift.substring(1))\n            } else Integer.valueOf(shift)\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks-testkit/src/main/kotlin/com/felipebz/zpa/checks/verifier/TestIssue.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks.verifier\n\ninternal class TestIssue constructor(var message: String?, val line: Int) {\n    var effortToFix: Int? = null\n    var startColumn: Int? = null\n    var endColumn: Int? = null\n    var endLine: Int? = null\n    var secondaryLines: List<Int>? = null\n\n    override fun toString() = \"$message[line=$line]\"\n}\n"
  },
  {
    "path": "zpa-checks-testkit/src/test/kotlin/com/felipebz/zpa/checks/verifier/PlSqlCheckVerifierTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks.verifier\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.flr.api.GenericTokenType\nimport com.felipebz.flr.api.Token\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.fail\nimport com.felipebz.zpa.checks.IssueLocation\nimport com.felipebz.zpa.squid.AnalysisException\nimport com.felipebz.zpa.api.checks.PlSqlCheck\n\nclass PlSqlCheckVerifierTest {\n\n    @Test\n    fun verify_line_issues() {\n        val visitor = FakeCheck().withDefaultIssues()\n        PlSqlCheckVerifier.verify(FILENAME_ISSUES, visitor)\n    }\n\n    @Test\n    fun verify_unexpected_issue() {\n        val visitor = FakeCheck().withDefaultIssues().withIssue(4, \"extra message\")\n\n        try {\n            PlSqlCheckVerifier.verify(FILENAME_ISSUES, visitor)\n            fail(\"Test should fail\")\n        } catch (e: AssertionError) {\n            assertThat(e).hasMessage(\"Unexpected issue at line 4: \\\"extra message\\\"\")\n        }\n    }\n\n    @Test\n    fun verify_combined_missing_expected_and_unexpected_issues() {\n        val visitor = FakeCheck().withDefaultIssues().withIssue(4, \"extra message\")\n                .withoutIssue(1)\n\n        try {\n            PlSqlCheckVerifier.verify(FILENAME_ISSUES, visitor)\n            fail(\"Test should fail\")\n        } catch (e: AssertionError) {\n            assertThat(e).hasMessage(\"Missing issue at line 1\")\n        }\n    }\n\n    @Test\n    fun verify_missing_expected_issue() {\n        val visitor = FakeCheck().withDefaultIssues().withoutIssue(1)\n\n        try {\n            PlSqlCheckVerifier.verify(FILENAME_ISSUES, visitor)\n            fail(\"Test should fail\")\n        } catch (e: AssertionError) {\n            assertThat(e).hasMessage(\"Missing issue at line 1\")\n        }\n    }\n\n\n    @Test\n    fun verify_no_issue() {\n        PlSqlCheckVerifier.verify(FILENAME_NO_ISSUE, noEffectCheck)\n    }\n\n    @Test\n    fun verify_should_fail_when_using_incorrect_shift() {\n        try {\n            PlSqlCheckVerifier.verify(\"src/test/resources/check_verifier_incorrect_shift.sql\", noEffectCheck)\n            fail(\"Test should fail\")\n        } catch (e: AssertionError) {\n            assertThat(e).hasMessage(\"Use only '@+N' or '@-N' to shifts messages.\")\n        }\n    }\n\n    @Test\n    fun verify_should_fail_when_using_incorrect_attribute() {\n        try {\n            PlSqlCheckVerifier.verify(\"src/test/resources/check_verifier_incorrect_attribute.sql\",\n                    noEffectCheck)\n            fail(\"Test should fail\")\n        } catch (e: AnalysisException) {\n            assertThat(e).hasMessage(\"Error executing checks on file check_verifier_incorrect_attribute.sql: Invalid param at line 1: invalid\")\n        }\n    }\n\n    @Test\n    fun verify_should_fail_when_using_incorrect_attribute2() {\n        try {\n            PlSqlCheckVerifier.verify(\"src/test/resources/check_verifier_incorrect_attribute2.sql\",\n                    noEffectCheck)\n            fail(\"Test should fail\")\n        } catch (e: AnalysisException) {\n            assertThat(e).hasMessage(\"Error executing checks on file check_verifier_incorrect_attribute2.sql: Invalid param at line 1: invalid\")\n        }\n    }\n\n    @Test\n    fun verify_should_fail_when_using_incorrect_secondaryLocation() {\n        val visitor = FakeCheck().withDefaultIssues()\n        try {\n            PlSqlCheckVerifier.verify(\"src/test/resources/check_verifier_incorrect_secondary_location.sql\", visitor)\n            fail(\"Test should fail\")\n        } catch (e: AssertionError) {\n            assertThat(e).hasMessage(\"Bad secondary locations at line 8 ==> expected: \\\"[4]\\\" but was: \\\"[3, 4]\\\"\")\n        }\n    }\n\n    @Test\n    fun verify_should_fail_when_using_incorrect_secondaryLocation2() {\n        val visitor = FakeCheck().withDefaultIssues()\n        try {\n            PlSqlCheckVerifier.verify(\"src/test/resources/check_verifier_incorrect_secondary_location2.sql\", visitor)\n            fail(\"Test should fail\")\n        } catch (e: AssertionError) {\n            assertThat(e).hasMessage(\"Bad secondary locations at line 8 ==> expected: \\\"[3, 4, 5]\\\" but was: \\\"[3, 4]\\\"\")\n        }\n    }\n\n    @Test\n    fun verify_should_fail_when_precision_location_comment_is_invalid() {\n        try {\n            PlSqlCheckVerifier.verify(\"src/test/resources/check_verifier_incorrect_comment.sql\", FakeCheck())\n            fail(\"Test should fail\")\n        } catch (e: AnalysisException) {\n            assertThat(e).hasMessage(\"Error executing checks on file check_verifier_incorrect_comment.sql: Line 3: comments asserting a precise location should start at column 1\")\n        }\n    }\n\n    @Test\n    fun verify_unexpected_precise_location() {\n        try {\n            PlSqlCheckVerifier.verify(\"src/test/resources/check_verifier_unexpected_precise_location.sql\", FakeCheck())\n        } catch (e: AnalysisException) {\n            assertThat(e).hasMessage(\"Error executing checks on file check_verifier_unexpected_precise_location.sql: Invalid test file: a precise location is provided at line 3 but no issue is asserted at line 2\")\n        }\n    }\n\n    @Test\n    fun verify_unexpected_precise_location2() {\n        try {\n            PlSqlCheckVerifier.verify(\"src/test/resources/check_verifier_unexpected_precise_location2.sql\", FakeCheck())\n        } catch (e: AnalysisException) {\n            assertThat(e).hasMessage(\"Error executing checks on file check_verifier_unexpected_precise_location2.sql: Invalid test file: a precise location is provided at line 3 but no issue is asserted at line 2\")\n        }\n    }\n\n    private class FakeCheck : PlSqlCheck() {\n\n        var issues = hashMapOf<Int, MutableList<String>>()\n        var preciseIssues = linkedMapOf<Int, MutableList<IssueLocation>>()\n\n        fun withDefaultIssues(): FakeCheck {\n            return this.withIssue(1, \"message\")\n                    .withIssue(2, \"message1\")\n                    .withIssue(5, \"message2\")\n                    .withIssue(6, \"message3\")\n                    .withIssue(6, \"message3\")\n                    .withPreciseIssue(\n                            IssueLocation.preciseLocation(mockNode(8, 9, 8, 10), \"message4\"),\n                            IssueLocation.atLineLevel(\"no message\", 3),\n                            IssueLocation.atLineLevel(\"no message\", 4)\n                    )\n                    .withPreciseIssue(IssueLocation.atLineLevel(\"no message\", 9))\n                    .withPreciseIssue(IssueLocation.preciseLocation(mockNode(11, 5, 12, 11), \"message12\"))\n                    .withIssue(14, \"message17\")\n                    .withPreciseIssue(IssueLocation.preciseLocation(mockNode(15, 5, 15, 9), \"baseline\"))\n        }\n\n        fun withIssue(line: Int, message: String) = apply {\n            issues.getOrPut(line) { mutableListOf() }.add(message)\n        }\n\n        fun withPreciseIssue(vararg message: IssueLocation) = apply {\n            preciseIssues.getOrPut(message[0].startLine()) { mutableListOf() }.addAll(message.toList())\n        }\n\n        fun withoutIssue(line: Int) = apply {\n            issues.remove(line)\n            preciseIssues.remove(line)\n        }\n\n        override fun visitFile(node: AstNode) {\n            for ((line, messages) in issues) {\n                for (message in messages) {\n                    addLineIssue(message, line)\n                }\n            }\n\n            for (locations in preciseIssues.values) {\n                var issue: PreciseIssue? = null\n                for (location in locations) {\n                    if (issue == null) {\n                        issue = addIssue(location).withCost(3)\n                    } else {\n                        issue.secondary(location)\n                    }\n                }\n            }\n        }\n\n        fun mockNode(startLine: Int, startCharacter: Int, endLine: Int, endCharacter: Int): AstNode {\n            val token = Token.builder()\n                    .setLine(startLine)\n                    .setColumn(startCharacter - 1)\n                    .setValueAndOriginalValue(\"\")\n                    .setType(GenericTokenType.IDENTIFIER)\n                    .build()\n\n            val lastToken = Token.builder()\n                    .setLine(endLine)\n                    .setColumn(endCharacter - 1)\n                    .setValueAndOriginalValue(\"\")\n                    .setType(GenericTokenType.IDENTIFIER)\n                    .build()\n\n            val node = AstNode(token)\n            node.addChild(AstNode(token))\n            node.addChild(AstNode(lastToken))\n\n            return node\n        }\n\n    }\n\n    companion object {\n        private const val FILENAME_ISSUES = \"src/test/resources/check_verifier.sql\"\n        private const val FILENAME_NO_ISSUE = \"src/test/resources/check_verifier_no_issue.sql\"\n\n        private val noEffectCheck: PlSqlCheck\n            get() = object : PlSqlCheck() { }\n    }\n\n}\n"
  },
  {
    "path": "zpa-checks-testkit/src/test/resources/check_verifier.sql",
    "content": "create procedure a is -- Noncompliant {{message}}\n  i integer; -- Noncompliant {{message1}}\nbegin -- test method\n    -- Noncompliant@+1 {{message2}}\n    null;\n    null;\n    -- Noncompliant@-1 {{message3}}\n    null; -- Noncompliant {{message4}} [[sc=9;ec=10;secondary=3,4]] bla bla bla\n    null; -- Noncompliant\n    -- Noncompliant@-4\n    func(foo, -- Noncompliant [[sc=5;el=+1;ec=11;effortToFix=3]]\n      bar);\n    -- Noncompliant@+1 blabla\n    null;\n    null; -- Noncompliant {{baseline}}\n--  ^^^^\nend;\n/\n"
  },
  {
    "path": "zpa-checks-testkit/src/test/resources/check_verifier_incorrect_attribute.sql",
    "content": "begin\n  null; -- Noncompliant [[invalid=1]] {{message}}\nend;\n/\n"
  },
  {
    "path": "zpa-checks-testkit/src/test/resources/check_verifier_incorrect_attribute2.sql",
    "content": "begin\n  null; -- Noncompliant [[invalid=1=2]] {{message}}\nend;\n/\n"
  },
  {
    "path": "zpa-checks-testkit/src/test/resources/check_verifier_incorrect_comment.sql",
    "content": "begin\n  null; -- Noncompliant\n  --  ^\nend;\n/\n"
  },
  {
    "path": "zpa-checks-testkit/src/test/resources/check_verifier_incorrect_secondary_location.sql",
    "content": "create procedure a is -- Noncompliant {{message}}\n  i integer; -- Noncompliant {{message1}}\nbegin -- test method\n    -- Noncompliant@+1 {{message2}}\n    null;\n    null;\n    -- Noncompliant@-1 {{message3}}\n    null; -- Noncompliant {{message4}} [[sc=9;ec=10;secondary=4]] bla bla bla\n    null; -- Noncompliant\n    -- Noncompliant@-4\n    func(foo, -- Noncompliant [[sc=5;el=+1;ec=11]]\n      bar);\n    -- Noncompliant@+1 blabla\n    null;\nend;\n/\n"
  },
  {
    "path": "zpa-checks-testkit/src/test/resources/check_verifier_incorrect_secondary_location2.sql",
    "content": "create procedure a is -- Noncompliant {{message}}\n  i integer; -- Noncompliant {{message1}}\nbegin -- test method\n    -- Noncompliant@+1 {{message2}}\n    null;\n    null;\n    -- Noncompliant@-1 {{message3}}\n    null; -- Noncompliant {{message4}} [[sc=9;ec=10;secondary=3,4,5]] bla bla bla\n    null; -- Noncompliant\n    -- Noncompliant@-4\n    func(foo, -- Noncompliant [[sc=5;el=+1;ec=11]]\n      bar);\n    -- Noncompliant@+1 blabla\n    null;\nend;\n/\n"
  },
  {
    "path": "zpa-checks-testkit/src/test/resources/check_verifier_incorrect_shift.sql",
    "content": "begin\n  null; -- Noncompliant@#1 {{message}}\nend;\n/\n"
  },
  {
    "path": "zpa-checks-testkit/src/test/resources/check_verifier_no_issue.sql",
    "content": "begin\n  null;\nend;\n/"
  },
  {
    "path": "zpa-checks-testkit/src/test/resources/check_verifier_unexpected_precise_location.sql",
    "content": "begin\n  null;\n--^^^^\nend;\n/\n"
  },
  {
    "path": "zpa-checks-testkit/src/test/resources/check_verifier_unexpected_precise_location2.sql",
    "content": "begin -- Noncompliant\n  null;\n--^^^^\nend;\n/\n"
  },
  {
    "path": "zpa-core/build.gradle.kts",
    "content": "plugins {\n    id(\"com.felipebz.zpa.build-conventions\")\n}\n\ndependencies {\n    api(libs.flr.core)\n    implementation(libs.jackson)\n    testImplementation(libs.flr.testing.harness)\n}\n\ndescription = \"ZPA Core\"\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/AstNodeExtensions.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.flr.api.AstNodeType\nimport com.felipebz.zpa.sslr.Tree\nimport com.felipebz.zpa.api.squid.SemanticAstNode\n\n\nfun AstNode?.typeIs(type: AstNodeType): Boolean = this?.type == type\n\nfun AstNode?.typeIs(types: Array<out AstNodeType>): Boolean  =\n    types.any { it == this?.type }\n\ninline fun <reified T : Tree> AstNode.asTree(): T =\n    this.asSemantic().tree as T\n\ninline fun <reified T : Tree?> AstNode.tryGetAsTree(): T? =\n    this.asSemantic().tree as? T\n\ninline fun <reified T : Tree> List<AstNode>.asTree(): List<T> =\n    this.asSemantic().map { it.tree as T }\n\ninline fun <reified T : Tree> AstNode.isOf(): Boolean =\n    this.asSemantic().tree is T\n\nfun AstNode.asSemantic(): SemanticAstNode = (this as SemanticAstNode)\n\nfun List<AstNode>.asSemantic(): List<SemanticAstNode> =\n    this.map { it.asSemantic() }\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/CustomAnnotationBasedRulesDefinition.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa\n\nimport com.felipebz.zpa.rules.RuleMetadataLoader\nimport com.felipebz.zpa.rules.RulesDefinitionAnnotationLoader\nimport com.felipebz.zpa.rules.ZpaRepository\nimport com.felipebz.zpa.rules.ZpaRule\nimport com.felipebz.zpa.utils.getAnnotation\nimport com.felipebz.zpa.api.annotations.ActivatedByDefault\nimport com.felipebz.zpa.api.annotations.ConstantRemediation\nimport com.felipebz.zpa.api.annotations.RuleInfo\nimport com.felipebz.zpa.api.annotations.RuleTemplate\nimport java.io.IOException\nimport java.net.URL\nimport java.util.*\n\nclass CustomAnnotationBasedRulesDefinition(private val repository: ZpaRepository,\n                                           private val languageKey: String,\n                                           private val ruleMetadataLoader: RuleMetadataLoader) {\n    private val locale: Locale = Locale.getDefault()\n    private val externalDescriptionBasePath: String = String.format(\"%s/rules/plsql\",\n        getLocalizedFolderName(String.format(\"/org/sonar/l10n/%s\", languageKey), locale))\n\n    fun addRuleClasses(ruleClasses: Iterable<Class<*>>) {\n        val loader = RulesDefinitionAnnotationLoader(ruleMetadataLoader)\n        for (annotatedClass in ruleClasses) {\n            loader.load(repository, annotatedClass)\n        }\n\n        val newRules = ArrayList<ZpaRule>()\n        for (ruleClass in ruleClasses) {\n            val rule = newRule(ruleClass)\n            addHtmlDescription(rule)\n            rule.template = getAnnotation(ruleClass, RuleTemplate::class.java) != null\n\n            try {\n                val constant = getAnnotation(ruleClass, ConstantRemediation::class.java)\n                if (constant != null) {\n                    rule.remediationConstant = constant.value\n                }\n            } catch (e: RuntimeException) {\n                throw IllegalArgumentException(\"Invalid remediation constant on $ruleClass\", e)\n            }\n\n            val ruleInfo = getAnnotation(ruleClass, RuleInfo::class.java)\n            if (ruleInfo != null) {\n                rule.scope = ruleInfo.scope\n            }\n\n            val activatedByDefault = getAnnotation(ruleClass, ActivatedByDefault::class.java)\n            if (activatedByDefault != null) {\n                rule.isActivatedByDefault = true\n            }\n\n            newRules.add(rule)\n        }\n        setupExternalNames(newRules)\n    }\n\n    private fun addHtmlDescription(rule: ZpaRule) {\n        val resource = CustomAnnotationBasedRulesDefinition::class.java.getResource(\"$externalDescriptionBasePath/${rule.key}.html\")\n        if (resource != null) {\n            addHtmlDescription(rule, resource)\n        }\n    }\n\n    private fun addHtmlDescription(rule: ZpaRule, resource: URL) {\n        try {\n            rule.htmlDescription = resource.readText()\n        } catch (e: IOException) {\n            throw IllegalStateException(\"Failed to read: $resource\", e)\n        }\n\n    }\n\n    private fun newRule(ruleClass: Class<*>): ZpaRule {\n        val ruleKey = getRuleKey(ruleMetadataLoader, ruleClass)\n        return repository.rule(ruleKey) ?: throw IllegalStateException(\"Rule $ruleKey was not created\")\n    }\n\n    private fun setupExternalNames(rules: Collection<ZpaRule>) {\n        val bundle: ResourceBundle\n        try {\n            bundle = ResourceBundle.getBundle(\"org.sonar.l10n.$languageKey\", locale)\n        } catch (e: MissingResourceException) {\n            return\n        }\n\n        for (rule in rules) {\n            val baseKey = rule.key\n            val nameKey = \"$baseKey.name\"\n            if (bundle.containsKey(nameKey)) {\n                rule.name = bundle.getString(nameKey)\n            }\n            for (param in rule.params) {\n                val paramDescriptionKey = baseKey + \".param.\" + param.key\n                if (bundle.containsKey(paramDescriptionKey)) {\n                    param.description = bundle.getString(paramDescriptionKey)\n                }\n            }\n        }\n    }\n\n    companion object {\n        /**\n         * Adds annotated rule classes to an instance of NewRepository. Fails if one of\n         * the classes has no SQALE annotation.\n         * @param repository repository of rules\n         * @param languageKey language identifier\n         * @param ruleClasses classes to add\n         */\n        fun load(repository: ZpaRepository, languageKey: String, ruleClasses: Iterable<Class<*>>, ruleMetadataLoader: RuleMetadataLoader) {\n            CustomAnnotationBasedRulesDefinition(repository, languageKey, ruleMetadataLoader).addRuleClasses(ruleClasses)\n        }\n\n        fun getLocalizedFolderName(baseName: String, locale: Locale): String {\n            val control = ResourceBundle.Control.getControl(ResourceBundle.Control.FORMAT_DEFAULT)\n\n            var path = control.toBundleName(baseName, locale)\n            var url: URL? = CustomAnnotationBasedRulesDefinition::class.java.getResource(path)\n\n            if (url == null) {\n                val localeWithoutCountry = if (locale.country == null) locale else Locale(locale.language)\n                path = control.toBundleName(baseName, localeWithoutCountry)\n                url = CustomAnnotationBasedRulesDefinition::class.java.getResource(path)\n\n                if (url == null) {\n                    path = baseName\n                    CustomAnnotationBasedRulesDefinition::class.java.getResource(path)\n                }\n            }\n\n            return path\n        }\n\n        fun convertCheckClassName(ruleClass: Class<*>): String {\n            var name = ruleClass.simpleName\n            if (name.endsWith(\"Check\")) {\n                name = name.substring(0, name.length - 5)\n            }\n            return name\n        }\n\n        fun getRuleKey(ruleMetadataLoader: RuleMetadataLoader, ruleClass: Class<*>): String {\n            val ruleAnnotation = ruleMetadataLoader.getRuleAnnotation(ruleClass)\n                ?: throw IllegalArgumentException(\"No Rule annotation was found on $ruleClass\")\n            return ruleAnnotation.key.ifEmpty { convertCheckClassName(ruleClass) }\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/FormsMetadataAwareCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa\n\n// Marker interface to define checks that require Oracle Forms metadata\ninterface FormsMetadataAwareCheck\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/PlSqlChecks.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa\n\nimport com.felipebz.zpa.rules.RuleMetadataLoader\nimport com.felipebz.zpa.rules.ZpaActiveRules\nimport com.felipebz.zpa.rules.ZpaChecks\nimport com.felipebz.zpa.rules.ZpaRuleKey\nimport com.felipebz.zpa.api.ZpaRulesDefinition\nimport com.felipebz.zpa.api.checks.PlSqlVisitor\n\nclass PlSqlChecks private constructor(private val activeRules: ZpaActiveRules, private val ruleMetadataLoader: RuleMetadataLoader) {\n    private val checksByRepository = hashSetOf<ZpaChecks>()\n\n    val checks: Set<ZpaChecks> = checksByRepository\n\n    fun addChecks(repositoryKey: String, checkClass: Iterable<Class<*>>): PlSqlChecks {\n        checksByRepository.add(ZpaChecks(activeRules, repositoryKey, ruleMetadataLoader)\n                .addAnnotatedChecks(checkClass))\n\n        return this\n    }\n\n    fun addCustomChecks(customRulesDefinitions: Array<ZpaRulesDefinition>?): PlSqlChecks {\n        if (customRulesDefinitions != null) {\n\n            for (rulesDefinition in customRulesDefinitions) {\n                addChecks(rulesDefinition.repositoryKey(), rulesDefinition.checkClasses().toList())\n            }\n        }\n\n        return this\n    }\n\n    fun all(): List<PlSqlVisitor> {\n        val allVisitors = ArrayList<PlSqlVisitor>()\n\n        for (checks in checksByRepository) {\n            allVisitors.addAll(checks.all())\n        }\n\n        return allVisitors\n    }\n\n    fun ruleKey(check: PlSqlVisitor): ZpaRuleKey? {\n        var ruleKey: ZpaRuleKey?\n\n        for (checks in checksByRepository) {\n            ruleKey = checks.ruleKey(check)\n\n            if (ruleKey != null) {\n                return ruleKey\n            }\n        }\n        return null\n    }\n\n    companion object {\n        fun createPlSqlCheck(activeRules: ZpaActiveRules, ruleMetadataLoader: RuleMetadataLoader): PlSqlChecks {\n            return PlSqlChecks(activeRules, ruleMetadataLoader)\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/TestPlSqlVisitorRunner.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa\n\nimport com.felipebz.zpa.metadata.FormsMetadata\nimport com.felipebz.zpa.parser.PlSqlParser\nimport com.felipebz.zpa.squid.PlSqlAstWalker\nimport com.felipebz.zpa.squid.PlSqlConfiguration\nimport com.felipebz.zpa.api.PlSqlFile\nimport com.felipebz.zpa.api.PlSqlVisitorContext\nimport com.felipebz.zpa.api.checks.PlSqlVisitor\nimport java.io.File\nimport java.io.IOException\nimport java.nio.charset.StandardCharsets\nimport java.nio.file.Path\n\nobject TestPlSqlVisitorRunner {\n\n    fun scanFile(file: File, metadata: FormsMetadata?, vararg visitors: PlSqlVisitor) {\n        val context = createContext(TestPlSqlFile(file), metadata)\n        val walker = PlSqlAstWalker(visitors.toList())\n        walker.walk(context)\n    }\n\n    private fun createContext(plSqlFile: PlSqlFile, metadata: FormsMetadata?): PlSqlVisitorContext {\n        val parser = PlSqlParser.create(PlSqlConfiguration(StandardCharsets.UTF_8))\n        val rootTree = parser.parse(plSqlFile.contents())\n        return PlSqlVisitorContext(rootTree, plSqlFile, metadata)\n    }\n\n    private class TestPlSqlFile(private val file: File) : PlSqlFile {\n        override fun contents(): String =\n            try {\n                file.readText()\n            } catch (e: IOException) {\n                throw IllegalStateException(\"Cannot read $file\", e)\n            }\n\n        override fun fileName(): String = file.name\n\n        override fun path(): Path = file.toPath()\n\n        override fun type(): PlSqlFile.Type = PlSqlFile.Type.MAIN\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/AggregateSqlFunctionsGrammar.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api\n\nimport com.felipebz.flr.grammar.GrammarRuleKey\nimport com.felipebz.zpa.sslr.PlSqlGrammarBuilder\nimport com.felipebz.zpa.api.DmlGrammar.ORDER_BY_CLAUSE\nimport com.felipebz.zpa.api.PlSqlGrammar.EXPRESSION\nimport com.felipebz.zpa.api.PlSqlKeyword.*\nimport com.felipebz.zpa.api.PlSqlPunctuator.*\n\nenum class AggregateSqlFunctionsGrammar : GrammarRuleKey {\n\n    LISTAGG_EXPRESSION,\n    XMLAGG_EXPRESSION,\n    COLLECT_EXPRESSION,\n    JSON_ARRAYAGG_EXPRESSION,\n    JSON_OBJECTAGG_EXPRESSION,\n    AGGREGATE_SQL_FUNCTION;\n\n    companion object {\n        fun buildOn(b: PlSqlGrammarBuilder) {\n            b.rule(LISTAGG_EXPRESSION).define(\n                    LISTAGG,\n                    LPARENTHESIS, b.optional(b.firstOf(ALL, DISTINCT)), EXPRESSION, b.optional(COMMA, EXPRESSION),\n                    b.optional(ON, OVERFLOW, b.firstOf(\n                            ERROR,\n                            b.sequence(TRUNCATE, b.optional(EXPRESSION), b.optional(b.firstOf(WITH, WITHOUT), COUNT)))),\n                    RPARENTHESIS,\n                    WITHIN, GROUP, LPARENTHESIS, DmlGrammar.ORDER_BY_CLAUSE, RPARENTHESIS)\n\n            b.rule(XMLAGG_EXPRESSION).define(\n                XMLAGG, LPARENTHESIS,\n                EXPRESSION, b.optional(ORDER_BY_CLAUSE),\n                RPARENTHESIS\n            )\n\n            b.rule(COLLECT_EXPRESSION).define(\n                COLLECT, LPARENTHESIS,\n                b.optional(b.firstOf(DISTINCT, UNIQUE)),\n                EXPRESSION,\n                b.optional(ORDER, BY, EXPRESSION),\n                RPARENTHESIS\n            )\n\n            b.rule(JSON_ARRAYAGG_EXPRESSION).define(\n                JSON_ARRAYAGG, LPARENTHESIS,\n                EXPRESSION, b.optional(FORMAT, JSON),\n                b.optional(ORDER_BY_CLAUSE),\n                b.optional(SingleRowSqlFunctionsGrammar.JSON_ON_NULL_CLAUSE),\n                b.optional(SingleRowSqlFunctionsGrammar.JSON_RETURNING_CLAUSE),\n                b.optional(STRICT),\n                RPARENTHESIS\n            )\n\n            b.rule(JSON_OBJECTAGG_EXPRESSION).define(\n                JSON_OBJECTAGG, LPARENTHESIS,\n                b.optional(KEY), EXPRESSION, VALUE, EXPRESSION,\n                b.optional(FORMAT, JSON),\n                b.optional(SingleRowSqlFunctionsGrammar.JSON_ON_NULL_CLAUSE),\n                b.optional(SingleRowSqlFunctionsGrammar.JSON_RETURNING_CLAUSE),\n                b.optional(STRICT),\n                b.optional(WITH, UNIQUE, KEYS),\n                RPARENTHESIS\n            )\n\n            b.rule(AGGREGATE_SQL_FUNCTION).define(\n                b.firstOf(\n                    LISTAGG_EXPRESSION,\n                    XMLAGG_EXPRESSION,\n                    COLLECT_EXPRESSION,\n                    JSON_ARRAYAGG_EXPRESSION,\n                    JSON_OBJECTAGG_EXPRESSION\n                )\n            )\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/ConditionsGrammar.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api\n\nimport com.felipebz.flr.grammar.GrammarRuleKey\nimport com.felipebz.zpa.sslr.PlSqlGrammarBuilder\nimport com.felipebz.zpa.api.PlSqlGrammar.*\nimport com.felipebz.zpa.api.PlSqlKeyword.*\n\nenum class ConditionsGrammar : GrammarRuleKey {\n\n    // internal\n    RELATIONAL_OPERATOR,\n    IS_JSON_ARGS,\n    JSON_MODIFIER_LIST,\n    JSON_COLUMN_MODIFIER,\n    JSON_SCALAR_MODIFIER,\n    JSON_EQUAL_ON_ERROR_CLAUSE,\n    JSON_EXISTS_ON_EMPTY_CLAUSE,\n    JSON_EXISTS_ON_ERROR_CLAUSE,\n\n    // conditions\n    RELATIONAL_CONDITION,\n    BOOLEAN_TEST_CONDITION,\n    LIKE_CONDITION,\n    BETWEEN_CONDITION,\n    MULTISET_CONDITION,\n    IS_A_SET_CONDITION,\n    IS_EMPTY_CONDITION,\n    MEMBER_CONDITION,\n    SUBMULTISET_CONDITION,\n    IS_OF_CONDITION,\n    IS_JSON_CONDITION,\n    JSON_EQUAL_CONDITION,\n    JSON_EXISTS_CONDITION,\n    JSON_TEXTCONTAINS_CONDITION,\n    CONDITION;\n\n    companion object {\n        fun buildOn(b: PlSqlGrammarBuilder) {\n            b.rule(RELATIONAL_OPERATOR).define(\n                b.firstOf(\n                    PlSqlGrammar.EQUALS_OPERATOR,\n                    PlSqlGrammar.NOTEQUALS_OPERATOR,\n                    PlSqlGrammar.LESSTHANOREQUALS_OPERATOR,\n                    PlSqlGrammar.LESSTHAN_OPERATOR,\n                    PlSqlGrammar.GREATERTHANOREQUALS_OPERATOR,\n                    PlSqlGrammar.GREATERTHAN_OPERATOR\n                ),\n                b.optional(b.firstOf(ANY, SOME, ALL))\n            )\n\n            b.rule(RELATIONAL_CONDITION).define(\n                CONCATENATION_EXPRESSION, RELATIONAL_OPERATOR, CONCATENATION_EXPRESSION\n            ).skip()\n\n            b.rule(BOOLEAN_TEST_CONDITION).define(\n                CONCATENATION_EXPRESSION, IS, b.optional(NOT), b.firstOf(NULL_LITERAL, PlSqlGrammar.BOOLEAN_LITERAL)\n            )\n\n            b.rule(LIKE_CONDITION).define(\n                CONCATENATION_EXPRESSION,\n                b.optional(NOT), LIKE,\n                CONCATENATION_EXPRESSION,\n                b.optional(ESCAPE, CONCATENATION_EXPRESSION)\n            )\n\n            b.rule(BETWEEN_CONDITION).define(\n                CONCATENATION_EXPRESSION,\n                b.optional(NOT), BETWEEN,\n                CONCATENATION_EXPRESSION, AND, CONCATENATION_EXPRESSION\n            ).skip()\n\n            b.rule(IS_A_SET_CONDITION).define(CONCATENATION_EXPRESSION, IS, b.optional(NOT), A, SET)\n\n            b.rule(IS_EMPTY_CONDITION).define(CONCATENATION_EXPRESSION, IS, b.optional(NOT), EMPTY)\n\n            b.rule(MEMBER_CONDITION)\n                .define(CONCATENATION_EXPRESSION, b.optional(NOT), MEMBER, b.optional(OF), CONCATENATION_EXPRESSION)\n                .skip()\n\n            b.rule(SUBMULTISET_CONDITION).define(\n                CONCATENATION_EXPRESSION,\n                b.optional(NOT),\n                SUBMULTISET,\n                b.optional(OF),\n                CONCATENATION_EXPRESSION\n            )\n\n            //https://docs.oracle.com/cloud/latest/db112/SQLRF/conditions006.htm#SQLRF52128\n            b.rule(MULTISET_CONDITION).define(\n                b.firstOf(\n                    IS_A_SET_CONDITION,\n                    IS_EMPTY_CONDITION,\n                    MEMBER_CONDITION,\n                    SUBMULTISET_CONDITION\n                )\n            )\n\n            b.rule(IS_OF_CONDITION).define(\n                CONCATENATION_EXPRESSION,\n                IS,\n                b.optional(NOT),\n                OF,\n                b.optional(TYPE),\n                PlSqlPunctuator.LPARENTHESIS,\n                b.optional(ONLY),\n                OBJECT_REFERENCE,\n                b.zeroOrMore(PlSqlPunctuator.COMMA, b.optional(ONLY), OBJECT_REFERENCE),\n                PlSqlPunctuator.RPARENTHESIS\n            )\n\n            b.rule(IS_JSON_CONDITION).define(\n                CONCATENATION_EXPRESSION,\n                IS,\n                b.optional(NOT),\n                JSON,\n                b.optional(JSON_MODIFIER_LIST),\n                IS_JSON_ARGS\n            )\n\n            b.rule(IS_JSON_ARGS).define(\n                b.firstOf(\n                    b.sequence(\n                        VALIDATE, b.optional(CAST), b.optional(USING), PlSqlTokenType.STRING_LITERAL\n                    ),\n                    b.sequence(\n                        b.optional(FORMAT, JSON),\n                        b.optional(b.firstOf(STRICT, LAX)),\n                        b.optional(b.firstOf(ALLOW, DISALLOW), SCALARS),\n                        b.optional(b.firstOf(WITH, WITHOUT), UNIQUE, KEYS)\n                    )\n                )\n            ).skip()\n\n            b.rule(JSON_MODIFIER_LIST).define(\n                b.firstOf(\n                    b.sequence(\n                        PlSqlPunctuator.LPARENTHESIS,\n                        JSON_COLUMN_MODIFIER,\n                        b.zeroOrMore(PlSqlPunctuator.COMMA, JSON_COLUMN_MODIFIER),\n                        PlSqlPunctuator.RPARENTHESIS\n                    ),\n                    JSON_COLUMN_MODIFIER\n                )\n            )\n\n            b.rule(JSON_COLUMN_MODIFIER).define(\n                b.firstOf(\n                    VALUE,\n                    ARRAY,\n                    OBJECT,\n                    b.sequence(SCALAR, b.optional(JSON_SCALAR_MODIFIER))\n                )\n            )\n\n            b.rule(JSON_SCALAR_MODIFIER).define(\n                b.firstOf(\n                    NUMBER,\n                    STRING,\n                    BINARY_DOUBLE,\n                    BINARY_FLOAT,\n                    DATE,\n                    b.sequence(TIMESTAMP, b.optional(WITH, TIME, ZONE)),\n                    NULL,\n                    BOOLEAN,\n                    BINARY,\n                    b.sequence(INTERVAL, b.firstOf(b.sequence(YEAR, TO, MONTH), b.sequence(DAY, TO, SECOND)))\n                )\n            )\n\n            b.rule(JSON_EQUAL_CONDITION).define(\n                JSON_EQUAL,\n                PlSqlPunctuator.LPARENTHESIS,\n                PlSqlGrammar.EXPRESSION,\n                PlSqlPunctuator.COMMA,\n                PlSqlGrammar.EXPRESSION,\n                b.optional(JSON_EQUAL_ON_ERROR_CLAUSE),\n                PlSqlPunctuator.RPARENTHESIS\n            )\n\n            b.rule(JSON_EQUAL_ON_ERROR_CLAUSE).define(\n                b.firstOf(\n                    ERROR,\n                    TRUE,\n                    FALSE\n                ), ON, ERROR\n            )\n\n            b.rule(JSON_EXISTS_CONDITION).define(\n                JSON_EXISTS,\n                PlSqlPunctuator.LPARENTHESIS,\n                PlSqlGrammar.EXPRESSION,\n                b.optional(FORMAT, JSON),\n                PlSqlPunctuator.COMMA,\n                SingleRowSqlFunctionsGrammar.JSON_BASIC_PATH_EXPRESSION,\n                b.optional(SingleRowSqlFunctionsGrammar.JSON_PASSING_CLAUSE),\n                b.optional(JSON_EXISTS_ON_ERROR_CLAUSE),\n                b.optional(TYPE, b.firstOf(STRICT, LAX)),\n                b.optional(JSON_EXISTS_ON_EMPTY_CLAUSE),\n                PlSqlPunctuator.RPARENTHESIS\n            )\n\n            b.rule(JSON_EXISTS_ON_ERROR_CLAUSE).define(\n                b.firstOf(\n                    ERROR,\n                    TRUE,\n                    FALSE\n                ), ON, ERROR\n            )\n\n            b.rule(JSON_EXISTS_ON_EMPTY_CLAUSE).define(\n                b.firstOf(\n                    ERROR,\n                    TRUE,\n                    FALSE\n                ), ON, EMPTY\n            )\n\n            b.rule(JSON_TEXTCONTAINS_CONDITION).define(\n                JSON_TEXTCONTAINS,\n                PlSqlPunctuator.LPARENTHESIS,\n                PlSqlGrammar.EXPRESSION,\n                PlSqlPunctuator.COMMA,\n                SingleRowSqlFunctionsGrammar.JSON_BASIC_PATH_EXPRESSION,\n                PlSqlPunctuator.COMMA,\n                PlSqlGrammar.EXPRESSION,\n                PlSqlPunctuator.RPARENTHESIS\n            )\n\n            b.rule(CONDITION).define(\n                b.firstOf(\n                    RELATIONAL_CONDITION,\n                    BOOLEAN_TEST_CONDITION,\n                    LIKE_CONDITION,\n                    BETWEEN_CONDITION,\n                    MULTISET_CONDITION,\n                    IS_JSON_CONDITION,\n                    IS_OF_CONDITION,\n                    JSON_EQUAL_CONDITION,\n                    JSON_EXISTS_CONDITION,\n                    JSON_TEXTCONTAINS_CONDITION\n                )\n            ).skip()\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/DclGrammar.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api\n\nimport com.felipebz.flr.api.GenericTokenType\nimport com.felipebz.flr.grammar.GrammarRuleKey\nimport com.felipebz.zpa.sslr.PlSqlGrammarBuilder\nimport com.felipebz.zpa.api.PlSqlGrammar.IDENTIFIER_NAME\nimport com.felipebz.zpa.api.PlSqlGrammar.UNIT_NAME\nimport com.felipebz.zpa.api.PlSqlKeyword.*\nimport com.felipebz.zpa.api.PlSqlPunctuator.*\n\nenum class DclGrammar : GrammarRuleKey {\n\n    IDENTIFIER_OR_KEYWORD,\n    GRANT_STATEMENT,\n    PRIVILEGE_PART,\n    PRIVILEGE_COLUMNS,\n    GRANT_SYSTEM_PRIVILEGES,\n    GRANT_OBJECT_PRIVILEGES,\n    GRANT_ROLES_TO_PROGRAMS,\n    DCL_COMMAND;\n\n    companion object {\n        fun buildOn(b: PlSqlGrammarBuilder) {\n            createDclCommands(b)\n        }\n\n        private fun createDclCommands(b: PlSqlGrammarBuilder) {\n            val keywords = PlSqlKeyword.entries\n            val rest = keywords.subList(1, keywords.size).toTypedArray()\n            b.rule(IDENTIFIER_OR_KEYWORD).define(b.firstOf(GenericTokenType.IDENTIFIER, keywords[0], *rest))\n\n            b.rule(PRIVILEGE_PART).define(b.nextNot(b.firstOf(COMMA, ON, TO, LPARENTHESIS)), IDENTIFIER_OR_KEYWORD)\n\n            b.rule(PRIVILEGE_COLUMNS).define(LPARENTHESIS, IDENTIFIER_NAME, b.zeroOrMore(COMMA, IDENTIFIER_NAME), RPARENTHESIS)\n\n            b.rule(GRANT_SYSTEM_PRIVILEGES).define(\n                    b.oneOrMore(PRIVILEGE_PART),\n                    b.zeroOrMore(COMMA, b.oneOrMore(PRIVILEGE_PART)),\n                    TO, IDENTIFIER_OR_KEYWORD, b.zeroOrMore(COMMA, IDENTIFIER_OR_KEYWORD),\n                    b.optional(IDENTIFIED, BY, b.anyToken(), b.zeroOrMore(COMMA, b.anyToken())),\n                    b.optional(WITH, b.firstOf(ADMIN, DELEGATE), OPTION),\n                    b.optional(CONTAINER, EQUALS, b.firstOf(CURRENT, ALL)))\n\n            b.rule(GRANT_OBJECT_PRIVILEGES).define(\n                    b.oneOrMore(PRIVILEGE_PART), b.optional(PRIVILEGE_COLUMNS),\n                    b.zeroOrMore(COMMA, b.oneOrMore(PRIVILEGE_PART, b.optional(PRIVILEGE_COLUMNS))),\n                    b.optional(ON, b.oneOrMore(b.anyTokenButNot(TO))),\n                    TO, IDENTIFIER_OR_KEYWORD, b.zeroOrMore(COMMA, IDENTIFIER_OR_KEYWORD),\n                    b.optional(WITH, HIERARCHY, OPTION),\n                    b.optional(WITH, GRANT, OPTION))\n\n            b.rule(GRANT_ROLES_TO_PROGRAMS).define(\n                    b.oneOrMore(PRIVILEGE_PART),\n                    b.zeroOrMore(COMMA, b.oneOrMore(PRIVILEGE_PART)),\n                    TO, b.firstOf(FUNCTION, PROCEDURE, PACKAGE), UNIT_NAME,\n                    b.zeroOrMore(COMMA, b.firstOf(FUNCTION, PROCEDURE, PACKAGE), UNIT_NAME)\n            )\n\n            b.rule(GRANT_STATEMENT).define(GRANT, b.firstOf(GRANT_ROLES_TO_PROGRAMS, GRANT_SYSTEM_PRIVILEGES, GRANT_OBJECT_PRIVILEGES), b.optional(SEMICOLON))\n\n            b.rule(DCL_COMMAND).define(GRANT_STATEMENT)\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/DdlGrammar.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api\n\nimport com.felipebz.flr.api.GenericTokenType.EOF\nimport com.felipebz.flr.grammar.GrammarRuleKey\nimport com.felipebz.zpa.sslr.PlSqlGrammarBuilder\nimport com.felipebz.zpa.api.PlSqlGrammar.*\nimport com.felipebz.zpa.api.PlSqlKeyword.*\nimport com.felipebz.zpa.api.PlSqlPunctuator.*\nimport com.felipebz.zpa.api.PlSqlTokenType.INTEGER_LITERAL\n\nenum class DdlGrammar : GrammarRuleKey {\n\n    DDL_COMMENT,\n    DDL_COMMAND,\n    ONE_OR_MORE_IDENTIFIERS,\n    REFERENCES_CLAUSE,\n    INLINE_CONSTRAINT,\n    OUT_OF_LINE_CONSTRAINT,\n    TABLE_COLUMN_DEFINITION,\n    TABLE_RELATIONAL_PROPERTIES,\n    CREATE_TABLE,\n    ALTER_TABLE,\n    COMPILE_CLAUSE,\n    COMPILER_PARAMETERS_CLAUSE,\n    ALTER_PROCEDURE,\n    ALTER_FUNCTION,\n    ALTER_TRIGGER,\n    ALTER_PACKAGE,\n    PACKAGE_COMPILE_CLAUSE,\n    DROP_COMMAND,\n    CREATE_SYNONYM,\n    CREATE_SEQUENCE,\n    PARTITION_BY_RANGE,\n    PARTITION_BY_HASH,\n    RANGE_VALUES_CLAUSE,\n    TABLE_PARTITION_DESCRIPTION,\n    SEGMENT_ATTRIBUTES_CLAUSE,\n    PHISICAL_ATRIBUTES_CLAUSE,\n    TABLE_COMPRESSION,\n    KEY_COMPRESSION,\n    LOB_STORAGE_CLAUSE,\n    VARRAY_COL_PROPERTIES,\n    PARTITION_LEVEL_SUBPARTITION,\n    //    HASH_SUBPARTITION_QUANTITY,\n    SUBPARTITION_SPEC,\n    LIST_VALUES_CLAUSE,\n    PARTITIONING_STORAGE_CLAUSE,\n    SUBSTITUTABLE_COLUMN_CLAUSE,\n    LOB_PARAMETERS,\n    STORAGE_CLAUSE,\n    LOGGING_CLAUSE,\n    SIZE_CLAUSE,\n    INDIVIDUAL_HASH_PARTITIONS,\n    HASH_PARTITIONS_BY_QUANTITY,\n    PARTITION_BY_LIST,\n    PARTITION_COMPOSITE,\n    SUBPARTITION_BY_LIST,\n    SUBPARTITION_BY_HASH,\n    SUBPARTITION_TEMPLATE,\n    CREATE_DIRECTORY,\n    DROP_DIRECTORY,\n    TRUNCATE_TABLE,\n    CONSTRAINT_STATE,\n    PRECHECK_STATE,\n    EXCEPTIONS_CLAUSE;\n\n    companion object {\n        fun buildOn(b: PlSqlGrammarBuilder) {\n            createDdlCommands(b)\n        }\n\n        private fun createDdlCommands(b: PlSqlGrammarBuilder) {\n            b.rule(DDL_COMMENT).define(\n                    COMMENT, ON,\n                    b.firstOf(\n                            b.sequence(\n                                    COLUMN,\n                                    IDENTIFIER_NAME,\n                                    b.optional(DOT, IDENTIFIER_NAME),\n                                    b.optional(DOT, IDENTIFIER_NAME)),\n                            b.sequence(\n                                    b.firstOf(\n                                            TABLE,\n                                            COLUMN,\n                                            OPERATOR,\n                                            INDEXTYPE,\n                                            b.sequence(MATERIALIZED, VIEW),\n                                            b.sequence(MINING, MODEL)),\n                                    IDENTIFIER_NAME, b.optional(DOT, IDENTIFIER_NAME))\n                    ),\n                    IS, CHARACTER_LITERAL, b.optional(SEMICOLON))\n\n            b.rule(ONE_OR_MORE_IDENTIFIERS).define(LPARENTHESIS, IDENTIFIER_NAME, b.zeroOrMore(COMMA, IDENTIFIER_NAME), RPARENTHESIS).skip()\n\n            b.rule(REFERENCES_CLAUSE).define(\n                    REFERENCES, MEMBER_EXPRESSION,\n                    b.optional(ONE_OR_MORE_IDENTIFIERS),\n                    b.optional(ON, DELETE, b.firstOf(CASCADE, b.sequence(SET, NULL)))\n            )\n\n            b.rule(INLINE_CONSTRAINT).define(\n                b.optional(b.firstOf(CONSTRAINT, CONSTRAINTS), IDENTIFIER_NAME),\n                b.firstOf(\n                    b.sequence(\n                        b.firstOf(\n                            b.sequence(b.optional(NOT), NULL),\n                            UNIQUE,\n                            b.sequence(PRIMARY, KEY),\n                            REFERENCES_CLAUSE\n                        ), b.optional(CONSTRAINT_STATE)\n                    ),\n                    b.sequence(\n                        CHECK, LPARENTHESIS, EXPRESSION, RPARENTHESIS,\n                        b.optional(CONSTRAINT_STATE),\n                        b.optional(PRECHECK_STATE)\n                    )\n                )\n            )\n\n            b.rule(CONSTRAINT_STATE).define(\n                b.optional(b.firstOf(\n                    b.sequence(INITIALLY, b.firstOf(DEFERRED, IMMEDIATE), b.optional(b.optional(NOT), DEFERRABLE)),\n                    b.sequence(b.optional(NOT), DEFERRABLE, b.optional(INITIALLY, b.firstOf(DEFERRED, IMMEDIATE))),\n                )),\n                b.optional(b.firstOf(RELY, NORELY)),\n                // TODO b.optional(USING_INDEX_CLAUSE),\n                b.optional(b.firstOf(ENABLE, DISABLE)),\n                b.optional(b.firstOf(VALIDATE, NOVALIDATE)),\n                b.optional(EXCEPTIONS_CLAUSE)\n            )\n\n            b.rule(PRECHECK_STATE).define(b.firstOf(PRECHECK, NOPRECHECK))\n\n            b.rule(EXCEPTIONS_CLAUSE).define(EXCEPTIONS, INTO, UNIT_NAME)\n\n            b.rule(TABLE_COLUMN_DEFINITION).define(\n                    IDENTIFIER_NAME, DATATYPE,\n                    \n                    b.optional(SORT),\n                    b.optional(DEFAULT, b.optional(\n                        b.sequence(ON, NULL,\n                            b.optional(FOR, INSERT,\n                                b.firstOf(ONLY, b.sequence(AND, UPDATE))))), EXPRESSION),\n                    b.optional(ENCRYPT),\n                    b.zeroOrMore(INLINE_CONSTRAINT))\n\n            b.rule(OUT_OF_LINE_CONSTRAINT).define(\n                b.optional(b.firstOf(CONSTRAINT, CONSTRAINTS), IDENTIFIER_NAME),\n                b.firstOf(\n                    b.sequence(\n                        b.firstOf(\n                            b.sequence(UNIQUE, ONE_OR_MORE_IDENTIFIERS),\n                            b.sequence(PRIMARY, KEY, ONE_OR_MORE_IDENTIFIERS, b.optional(b.sequence(USING, INDEX))),\n                            b.sequence(FOREIGN, KEY, ONE_OR_MORE_IDENTIFIERS, REFERENCES_CLAUSE)\n                        ), b.optional(CONSTRAINT_STATE)\n                    ),\n                    b.sequence(\n                        CHECK, LPARENTHESIS, EXPRESSION, RPARENTHESIS,\n                        b.optional(CONSTRAINT_STATE),\n                        b.optional(PRECHECK_STATE)\n                    )\n                )\n            )\n\n            b.rule(TABLE_RELATIONAL_PROPERTIES).define(\n                    b.oneOrMore(b.firstOf(OUT_OF_LINE_CONSTRAINT, TABLE_COLUMN_DEFINITION), b.optional(COMMA)))\n\n            b.rule(PHISICAL_ATRIBUTES_CLAUSE).define(\n                    b.oneOrMore(b.firstOf(\n                            b.sequence(PCTFREE, INTEGER_LITERAL),\n                            b.sequence(PCTUSED, INTEGER_LITERAL),\n                            b.sequence(INITRANS, INTEGER_LITERAL),\n                            STORAGE_CLAUSE)))\n\n            b.rule(SEGMENT_ATTRIBUTES_CLAUSE).define(\n                    b.oneOrMore(b.firstOf(\n                            PHISICAL_ATRIBUTES_CLAUSE,\n                            b.sequence(TABLESPACE, IDENTIFIER_NAME),\n                            LOGGING_CLAUSE)))\n\n            b.rule(TABLE_COMPRESSION).define(\n                    b.firstOf(COMPRESS, NOCOMPRESS))\n\n            b.rule(KEY_COMPRESSION).define(\n                    b.firstOf(\n                            b.sequence(MAPPING, TABLE),\n                            NOMAPPING))\n\n            b.rule(LOB_STORAGE_CLAUSE).define(\n                    b.sequence(LOB,\n                            b.firstOf(\n                                    b.sequence(\n                                            LPARENTHESIS,\n                                            b.oneOrMore(\n                                                    IDENTIFIER_NAME,\n                                                    b.optional(COMMA)),\n                                            RPARENTHESIS,\n                                            STORE,\n                                            AS,\n                                            LPARENTHESIS,\n                                            LOB_PARAMETERS,\n                                            RPARENTHESIS),\n                                    b.sequence(\n                                            LPARENTHESIS,\n                                            IDENTIFIER_NAME,\n                                            RPARENTHESIS,\n                                            STORE,\n                                            AS,\n                                            IDENTIFIER_NAME,\n                                            b.optional(b.sequence(\n                                                    LPARENTHESIS,\n                                                    LOB_PARAMETERS,\n                                                    RPARENTHESIS))))))\n\n            b.rule(SUBSTITUTABLE_COLUMN_CLAUSE).define(\n                    b.firstOf(\n                            b.sequence(\n                                    b.optional(ELEMENT),\n                                    IS,\n                                    OF,\n                                    b.optional(TYPE),\n                                    LPARENTHESIS,\n                                    ONLY,\n                                    DATATYPE,\n                                    RPARENTHESIS),\n                            b.sequence(\n                                    b.optional(NOT),\n                                    SUBSTITUTABLE,\n                                    AT,\n                                    ALL,\n                                    LEVELS)))\n\n            b.rule(SIZE_CLAUSE).define(\n                    b.sequence(INTEGER_LITERAL, b.firstOf(\"K\", \"M\", \"G\", \"T\", \"P\", \"E\")))\n\n            b.rule(STORAGE_CLAUSE).define(\n                    b.sequence(STORAGE,\n                            LPARENTHESIS,\n                            b.firstOf(\n                                    b.sequence(INITIAL, SIZE_CLAUSE),\n                                    b.sequence(NEXT, SIZE_CLAUSE),\n                                    b.sequence(MINEXTENTS, INTEGER_LITERAL),\n                                    b.sequence(MAXEXTENTS, b.firstOf(INTEGER_LITERAL, UNLIMITED)),\n                                    b.sequence(PCTINCREASE, INTEGER_LITERAL),\n                                    b.sequence(FREELISTS, INTEGER_LITERAL),\n                                    b.sequence(FREELIST, GROUPS, INTEGER_LITERAL),\n                                    b.sequence(OPTIMAL, b.optional(b.firstOf(SIZE_CLAUSE, NULL))),\n                                    b.sequence(BUFFER_POOL, b.firstOf(KEEP, RECYCLE, DEFAULT))),\n                            RPARENTHESIS))\n\n            b.rule(LOGGING_CLAUSE).define(\n                    b.firstOf(LOGGING, NOLOGGING))\n\n            b.rule(LOB_PARAMETERS).define(\n                    b.oneOrMore(b.firstOf(\n                            b.sequence(\n                                    TABLESPACE,\n                                    IDENTIFIER_NAME),\n                            b.sequence(\n                                    b.firstOf(\n                                            ENABLE,\n                                            DISABLE),\n                                    STORAGE,\n                                    IN,\n                                    NOW),\n                            STORAGE_CLAUSE,\n                            b.sequence(\n                                    CHUNK,\n                                    INTEGER_LITERAL),\n                            b.sequence(\n                                    PCTVERSION,\n                                    INTEGER_LITERAL),\n                            RETENTION,\n                            b.sequence(\n                                    FREEPOOLS,\n                                    INTEGER_LITERAL),\n                            b.firstOf(\n                                    b.sequence(CACHE,\n                                            b.optional(b.sequence(\n                                                    READS,\n                                                    b.optional(LOGGING_CLAUSE)))),\n                                    b.sequence(\n                                            NOCACHE,\n                                            b.optional(LOGGING_CLAUSE))))))\n\n            b.rule(VARRAY_COL_PROPERTIES).define(\n                    b.sequence(VARRAY,\n                            IDENTIFIER_NAME,\n                            b.firstOf(b.sequence(\n                                    b.optional(SUBSTITUTABLE_COLUMN_CLAUSE),\n                                    STORE,\n                                    AS,\n                                    LOB,\n                                    b.firstOf(b.sequence(\n                                            b.optional(IDENTIFIER_NAME),\n                                            LPARENTHESIS,\n                                            LOB_PARAMETERS,\n                                            RPARENTHESIS),\n                                            IDENTIFIER_NAME)),\n                                    SUBSTITUTABLE_COLUMN_CLAUSE)))\n\n            b.rule(LIST_VALUES_CLAUSE).define(\n                    b.sequence(\n                            VALUES,\n                            LPARENTHESIS,\n                            b.firstOf(\n                                    b.oneOrMore(\n                                            b.firstOf(\n                                                    LITERAL,\n                                                    NULL),\n                                            b.optional(COMMA)),\n                                    DEFAULT),\n                            RPARENTHESIS))\n\n            b.rule(PARTITIONING_STORAGE_CLAUSE).define(\n                    b.optional(\n                            b.oneOrMore(\n                                    b.firstOf(\n                                            b.sequence(\n                                                    TABLESPACE,\n                                                    IDENTIFIER_NAME),\n                                            b.sequence(\n                                                    OVERFLOW,\n                                                    b.optional(\n                                                            b.sequence(\n                                                                    TABLESPACE,\n                                                                    IDENTIFIER_NAME))),\n                                            //\t\t\t\t        \t\t\t\tb.sequence(\n                                            //\t\t\t\t        \t\t\t\t\t\tLOB,\n                                            //\t\t\t\t        \t\t\t\t\t\tLPARENTHESIS,\n                                            //\t\t\t\t        \t\t\t\t\t\tIDENTIFIER_NAME,\n                                            //\t\t\t\t        \t\t\t\t\t\tRPARENTHESIS,\n                                            //\t\t\t\t        \t\t\t\t\t\tSTORE,\n                                            //\t\t\t\t        \t\t\t\t\t\tAS,\n                                            //\t\t\t\t        \t\t\t\t\t\tb.firstOf(\n                                            //\t\t\t\t        \t\t\t\t\t\t\t\tb.sequence(\n                                            //\t\t\t\t        \t\t\t\t\t\t\t\t\t\tIDENTIFIER_NAME,\n                                            //\t\t\t\t        \t\t\t\t\t\t\t\t\t\tb.optional(\n                                            //\t\t\t\t        \t\t\t\t\t\t\t\t\t\t\t\tb.sequence(\n                                            //\t\t\t\t\t\t        \t\t\t\t\t\t\t\t\t\t\t\tLPARENTHESIS,\n                                            //\t\t\t\t\t\t        \t\t\t\t\t\t\t\t\t\t\t\tTABLESPACE,\n                                            //\t\t\t\t\t\t        \t\t\t\t\t\t\t\t\t\t\t\tIDENTIFIER_NAME,\n                                            //\t\t\t\t\t\t        \t\t\t\t\t\t\t\t\t\t\t\tRPARENTHESIS))),\n                                            //\t\t\t\t\t\t        \t\t\t\t\t\tb.sequence(\n                                            //\t\t\t\t\t\t        \t\t\t\t\t\t\t\tLPARENTHESIS,\n                                            //\t\t\t\t\t\t        \t\t\t\t\t\t\t\tTABLESPACE,\n                                            //\t\t\t\t\t\t        \t\t\t\t\t\t\t\tIDENTIFIER_NAME,\n                                            //\t\t\t\t\t\t        \t\t\t\t\t\t\t\tRPARENTHESIS))),\n                                            LOB_STORAGE_CLAUSE,\n                                            //\t\t\t\t        \t\t\t\tb.sequence(\n                                            //\t\t\t\t        \t\t\t\t\t\tVARRAY,\n                                            //\t\t\t\t        \t\t\t\t\t\tIDENTIFIER_NAME,\n                                            //\t\t\t\t        \t\t\t\t\t\tSTORE,\n                                            //\t\t\t\t        \t\t\t\t\t\tAS,\n                                            //\t\t\t\t        \t\t\t\t\t\tLOB,\n                                            //\t\t\t\t        \t\t\t\t\t\tIDENTIFIER_NAME)))));\n                                            VARRAY_COL_PROPERTIES))))\n\n            b.rule(SUBPARTITION_SPEC).define(\n                    b.sequence(SUBPARTITION, b.optional(IDENTIFIER_NAME), b.optional(LIST_VALUES_CLAUSE), b.optional(PARTITIONING_STORAGE_CLAUSE)))\n\n            b.rule(PARTITION_LEVEL_SUBPARTITION).define(\n                    b.firstOf(\n                            b.sequence(\n                                    SUBPARTITIONS,\n                                    INTEGER_LITERAL,\n                                    b.optional(\n                                            b.sequence(\n                                                    STORE,\n                                                    IN,\n                                                    b.sequence(\n                                                            LPARENTHESIS,\n                                                            b.oneOrMore(\n                                                                    IDENTIFIER_NAME,\n                                                                    b.optional(COMMA)),\n                                                            RPARENTHESIS)))),\n                            b.sequence(\n                                    LPARENTHESIS,\n                                    b.oneOrMore(\n                                            SUBPARTITION_SPEC,\n                                            b.optional(COMMA)),\n                                    RPARENTHESIS)))\n\n            b.rule(RANGE_VALUES_CLAUSE).define(\n                    b.sequence(VALUES, LESS, THAN,\n                            b.sequence(\n                                    LPARENTHESIS,\n                                    b.oneOrMore(\n                                            b.firstOf(\n                                                    METHOD_CALL,\n                                                    IDENTIFIER_NAME,\n                                                    MAXVALUE),\n                                            b.optional(COMMA)),\n                                    RPARENTHESIS)))\n\n            b.rule(TABLE_PARTITION_DESCRIPTION).define(\n                    b.sequence(\n                            b.optional(SEGMENT_ATTRIBUTES_CLAUSE),\n                            b.optional(\n                                    b.firstOf(\n                                            TABLE_COMPRESSION,\n                                            KEY_COMPRESSION)),\n                            b.optional(\n                                    b.sequence(\n                                            OVERFLOW,\n                                            b.optional(SEGMENT_ATTRIBUTES_CLAUSE))),\n                            b.optional(\n                                    b.oneOrMore(\n                                            b.firstOf(\n                                                    LOB_STORAGE_CLAUSE,\n                                                    VARRAY_COL_PROPERTIES))),\n                            b.optional(PARTITION_LEVEL_SUBPARTITION)))\n\n            b.rule(INDIVIDUAL_HASH_PARTITIONS).define(\n                    b.sequence(\n                            LPARENTHESIS,\n                            b.oneOrMore(\n                                    b.sequence(\n                                            PARTITION,\n                                            b.optional(\n                                                    b.sequence(\n                                                            IDENTIFIER_NAME,\n                                                            PARTITIONING_STORAGE_CLAUSE)),\n                                            b.optional(COMMA))),\n                            RPARENTHESIS))\n\n            b.rule(HASH_PARTITIONS_BY_QUANTITY).define(\n                    b.sequence(\n                            PARTITIONS,\n                            INTEGER_LITERAL,\n                            b.optional(\n                                    b.sequence(\n                                            STORE,\n                                            IN,\n                                            LPARENTHESIS,\n                                            b.oneOrMore(b.sequence(\n                                                    IDENTIFIER_NAME,\n                                                    b.optional(COMMA))),\n                                            RPARENTHESIS)),\n                            b.optional(\n                                    b.sequence(\n                                            OVERFLOW,\n                                            STORE,\n                                            IN,\n                                            LPARENTHESIS,\n                                            b.oneOrMore(b.sequence(\n                                                    IDENTIFIER_NAME,\n                                                    b.optional(COMMA))),\n                                            RPARENTHESIS))))\n\n            b.rule(SUBPARTITION_TEMPLATE).define(\n                    b.sequence(\n                            SUBPARTITION,\n                            TEMPLATE,\n                            b.firstOf(\n                                    b.sequence(\n                                            LPARENTHESIS,\n                                            b.oneOrMore(\n                                                    b.sequence(\n                                                            SUBPARTITION,\n                                                            IDENTIFIER_NAME,\n                                                            b.optional(LIST_VALUES_CLAUSE),\n                                                            b.optional(PARTITIONING_STORAGE_CLAUSE),\n                                                            b.optional(COMMA))),\n                                            RPARENTHESIS),\n                                    INTEGER_LITERAL)))\n\n            b.rule(SUBPARTITION_BY_LIST).define(\n                    b.sequence(SUBPARTITION, BY, LIST, LPARENTHESIS, IDENTIFIER_NAME, RPARENTHESIS, b.optional(SUBPARTITION_TEMPLATE)))\n\n            b.rule(SUBPARTITION_BY_HASH).define(\n                    b.sequence(\n                            SUBPARTITION,\n                            BY,\n                            HASH,\n                            LPARENTHESIS,\n                            b.oneOrMore(\n                                    IDENTIFIER_NAME,\n                                    b.optional(COMMA)),\n                            RPARENTHESIS,\n                            b.optional(\n                                    b.firstOf(\n                                            b.sequence(\n                                                    SUBPARTITIONS,\n                                                    INTEGER_LITERAL,\n                                                    b.optional(\n                                                            b.sequence(\n                                                                    STORE,\n                                                                    IN,\n                                                                    LPARENTHESIS,\n                                                                    b.oneOrMore(\n                                                                            IDENTIFIER_NAME,\n                                                                            b.optional(COMMA)),\n                                                                    RPARENTHESIS))),\n                                            SUBPARTITION_TEMPLATE))))\n\n            b.rule(PARTITION_BY_RANGE).define(\n                    b.sequence(\n                            PARTITION,\n                            BY,\n                            RANGE_KEYWORD,\n                            LPARENTHESIS,\n                            b.oneOrMore(\n                                    IDENTIFIER_NAME,\n                                    b.optional(COMMA)),\n                            RPARENTHESIS,\n                            LPARENTHESIS,\n                            b.oneOrMore(\n                                    PARTITION,\n                                    b.optional(IDENTIFIER_NAME),\n                                    RANGE_VALUES_CLAUSE,\n                                    TABLE_PARTITION_DESCRIPTION,\n                                    b.optional(COMMA)),\n                            RPARENTHESIS))\n\n            b.rule(PARTITION_BY_HASH).define(\n                    b.sequence(\n                            PARTITION,\n                            BY,\n                            HASH,\n                            LPARENTHESIS,\n                            b.oneOrMore(\n                                    b.sequence(\n                                            IDENTIFIER_NAME,\n                                            b.optional(COMMA))),\n                            RPARENTHESIS,\n                            b.firstOf(\n                                    INDIVIDUAL_HASH_PARTITIONS,\n                                    HASH_PARTITIONS_BY_QUANTITY)))\n\n            b.rule(PARTITION_BY_LIST).define(\n                    b.sequence(\n                            PARTITION,\n                            BY,\n                            LIST,\n                            LPARENTHESIS,\n                            IDENTIFIER_NAME,\n                            RPARENTHESIS,\n                            LPARENTHESIS,\n                            b.oneOrMore(\n                                    b.sequence(\n                                            PARTITION,\n                                            b.optional(IDENTIFIER_NAME),\n                                            LIST_VALUES_CLAUSE,\n                                            TABLE_PARTITION_DESCRIPTION,\n                                            b.optional(COMMA))),\n                            RPARENTHESIS))\n\n            b.rule(PARTITION_COMPOSITE).define(\n                    b.sequence(\n                            PARTITION,\n                            BY,\n                            RANGE_KEYWORD,\n                            b.oneOrMore(\n                                    LPARENTHESIS,\n                                    IDENTIFIER_NAME,\n                                    b.optional(COMMA),\n                                    RPARENTHESIS),\n                            b.firstOf(\n                                    SUBPARTITION_BY_LIST,\n                                    SUBPARTITION_BY_HASH),\n                            LPARENTHESIS,\n                            b.oneOrMore(\n                                    b.sequence(\n                                            PARTITION,\n                                            b.optional(IDENTIFIER_NAME),\n                                            RANGE_VALUES_CLAUSE,\n                                            TABLE_PARTITION_DESCRIPTION,\n                                            b.optional(COMMA))),\n                            RPARENTHESIS))\n\n            b.rule(CREATE_TABLE).define(\n                    CREATE,\n                    b.optional(\n                            GLOBAL,\n                            TEMPORARY),\n                    TABLE,\n                    UNIT_NAME,\n                    b.optional(\n                            LPARENTHESIS,\n                            TABLE_RELATIONAL_PROPERTIES,\n                            RPARENTHESIS),\n                    b.optional(b.firstOf(\n                            PARTITION_BY_RANGE,\n                            PARTITION_BY_HASH,\n                            PARTITION_BY_LIST,\n                            PARTITION_COMPOSITE)),\n                    b.optional(\n                            TABLESPACE,\n                            IDENTIFIER_NAME),\n                    b.optional(\n                            ON,\n                            COMMIT,\n                            b.firstOf(\n                                    DELETE,\n                                    PRESERVE),\n                            ROWS),\n                    b.optional(SEMICOLON))\n\n            b.rule(ALTER_TABLE).define(\n                    ALTER, TABLE, UNIT_NAME, b.firstOf(ADD, DROP), TABLE_RELATIONAL_PROPERTIES, b.optional(SEMICOLON))\n\n            b.rule(COMPILE_CLAUSE).define(\n                COMPILE, b.optional(DEBUG),\n                b.zeroOrMore(COMPILER_PARAMETERS_CLAUSE),\n                b.optional(REUSE, SETTINGS))\n\n            b.rule(COMPILER_PARAMETERS_CLAUSE).define(\n                    IDENTIFIER_NAME, EQUALS_OPERATOR, CHARACTER_LITERAL)\n\n            b.rule(ALTER_TRIGGER).define(\n                    ALTER, TRIGGER, b.optional(IF, EXISTS), UNIT_NAME,\n                    b.firstOf(\n                            ENABLE,\n                            DISABLE,\n                            b.sequence(RENAME, TO, IDENTIFIER_NAME),\n                            EDITIONABLE,\n                            NONEDITIONABLE,\n                            COMPILE_CLAUSE),\n                    b.optional(SEMICOLON))\n\n            b.rule(ALTER_PROCEDURE).define(\n                ALTER, PROCEDURE, b.optional(IF, EXISTS), UNIT_NAME,\n                b.firstOf(\n                    EDITIONABLE,\n                    NONEDITIONABLE,\n                    COMPILE_CLAUSE),\n                b.optional(SEMICOLON))\n\n            b.rule(ALTER_FUNCTION).define(\n                ALTER, FUNCTION, b.optional(IF, EXISTS), UNIT_NAME,\n                b.firstOf(\n                    EDITIONABLE,\n                    NONEDITIONABLE,\n                    COMPILE_CLAUSE),\n                b.optional(SEMICOLON))\n\n            b.rule(ALTER_PACKAGE).define(\n                    ALTER, PACKAGE, b.optional(IF, EXISTS), UNIT_NAME,\n                    b.firstOf(\n                        EDITIONABLE,\n                        NONEDITIONABLE,\n                        PACKAGE_COMPILE_CLAUSE),\n                    b.optional(SEMICOLON))\n\n            b.rule(PACKAGE_COMPILE_CLAUSE).define(\n                    COMPILE, b.optional(DEBUG),\n                    b.optional(b.firstOf(PACKAGE, SPECIFICATION, BODY)),\n                    b.zeroOrMore(COMPILER_PARAMETERS_CLAUSE),\n                    b.optional(REUSE, SETTINGS))\n\n            b.rule(DROP_COMMAND).define(DROP, b.oneOrMore(b.anyTokenButNot(b.firstOf(SEMICOLON, DIVISION, EOF))), b.optional(SEMICOLON))\n\n            b.rule(CREATE_SYNONYM).define(\n                    CREATE, b.optional(OR, REPLACE), b.optional(b.firstOf(EDITIONABLE, NONEDITIONABLE)),\n                    b.optional(PUBLIC), SYNONYM, UNIT_NAME,\n                    b.optional(SHARING, EQUALS, b.firstOf(METADATA, NONE)),\n                    FOR, DmlGrammar.TABLE_REFERENCE, b.optional(SEMICOLON))\n\n            b.rule(CREATE_SEQUENCE).define(\n                    CREATE, SEQUENCE, UNIT_NAME,\n                    b.optional(START, WITH, NUMERIC_LITERAL),\n                    b.optional(MAXVALUE, NUMERIC_LITERAL),\n                    b.optional(MINVALUE, NUMERIC_LITERAL),\n                    b.optional(INCREMENT, BY, NUMERIC_LITERAL),\n                    b.optional(b.firstOf(CYCLE, NOCYCLE)),\n                    b.optional(b.firstOf(NOCACHE, b.sequence(CACHE, NUMERIC_LITERAL)),\n                            b.optional(b.firstOf(ORDER, NOORDER))),\n                    b.optional(SEMICOLON))\n\n            b.rule(CREATE_DIRECTORY).define(\n                    CREATE, b.optional(OR, REPLACE), DIRECTORY,\n                    b.optional(IF, NOT, EXISTS), IDENTIFIER_NAME,\n                    b.optional(SHARING, EQUALS_OPERATOR, b.firstOf(METADATA, NONE)),\n                    AS, CHARACTER_LITERAL,\n                    b.optional(SEMICOLON))\n\n            b.rule(DROP_DIRECTORY).define(\n                    DROP, DIRECTORY, b.optional(IF, EXISTS), IDENTIFIER_NAME, b.optional(SEMICOLON))\n\n            b.rule(TRUNCATE_TABLE).define(\n                TRUNCATE, TABLE, UNIT_NAME,\n                b.optional(\n                    b.firstOf(\n                        PRESERVE, PURGE\n                    ),\n                    MATERIALIZED, VIEW, LOG\n                ),\n                b.optional(\n                    b.firstOf(\n                        b.sequence(\n                            DROP, b.optional(ALL)\n                        ),\n                        REUSE\n                    ),\n                    STORAGE\n                ),\n                b.optional(CASCADE),\n                b.optional(SEMICOLON)\n            )\n\n            b.rule(DDL_COMMAND).define(b.firstOf(\n                DDL_COMMENT,\n                CREATE_TABLE,\n                ALTER_TABLE,\n                ALTER_TRIGGER,\n                ALTER_PROCEDURE,\n                ALTER_FUNCTION,\n                ALTER_PACKAGE,\n                CREATE_SYNONYM,\n                CREATE_SEQUENCE,\n                CREATE_DIRECTORY,\n                DROP_DIRECTORY,\n                DROP_COMMAND,\n                TRUNCATE_TABLE))\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/DmlGrammar.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api\n\nimport com.felipebz.flr.grammar.GrammarRuleKey\nimport com.felipebz.zpa.sslr.PlSqlGrammarBuilder\nimport com.felipebz.zpa.api.PlSqlGrammar.*\nimport com.felipebz.zpa.api.PlSqlKeyword.*\nimport com.felipebz.zpa.api.PlSqlPunctuator.*\nimport com.felipebz.zpa.api.PlSqlTokenType.INTEGER_LITERAL\nimport com.felipebz.zpa.api.SingleRowSqlFunctionsGrammar.*\n\nenum class DmlGrammar : GrammarRuleKey {\n\n    TABLE_REFERENCE,\n    DML_TABLE_EXPRESSION_CLAUSE,\n    ALIAS,\n    VALUES_EXPRESSION_CLAUSE,\n    PARTITION_BY_CLAUSE,\n    WINDOWING_LIMIT,\n    WINDOWING_CLAUSE,\n    KEEP_CLAUSE,\n    ANALYTIC_CLAUSE,\n    ON_OR_USING_EXPRESSION,\n    INNER_CROSS_JOIN_CLAUSE,\n    OUTER_JOIN_TYPE,\n    QUERY_PARTITION_CLAUSE,\n    OUTER_JOIN_CLAUSE,\n    NESTED_CLAUSE,\n    JOIN_CLAUSE,\n    SELECT_COLUMN,\n    FROM_CLAUSE,\n    WHERE_CLAUSE,\n    INTO_CLAUSE,\n    GROUP_BY_CLAUSE,\n    HAVING_CLAUSE,\n    ORDER_BY_ITEM,\n    ORDER_BY_CLAUSE,\n    OFFSET_CLAUSE,\n    FETCH_ROW_CLAUSE,\n    ROW_LIMITING_CLAUSE,\n    FOR_UPDATE_CLAUSE,\n    CONNECT_BY_CLAUSE,\n    START_WITH_CLAUSE,\n    HIERARCHICAL_QUERY_CLAUSE,\n    WITH_CLAUSE,\n    SUBQUERY_FACTORING_CLAUSE,\n    SEARCH_CLAUSE,\n    CYCLE_CLAUSE,\n    RETURNING_INTO_CLAUSE,\n    QUERY_BLOCK,\n    SELECT_EXPRESSION,\n    DELETE_EXPRESSION,\n    UPDATE_COLUMN,\n    UPDATE_EXPRESSION,\n    INSERT_COLUMNS,\n    INSERT_EXPRESSION,\n    SINGLE_TABLE_INSERT,\n    INSERT_INTO_CLAUSE,\n    VALUES_CLAUSE,\n    MULTI_TABLE_INSERT,\n    CONDITIONAL_INSERT_CLAUSE,\n    MERGE_EXPRESSION,\n    MERGE_UPDATE_CLAUSE,\n    MERGE_INSERT_CLAUSE,\n    ERROR_LOGGING_CLAUSE,\n    DML_COMMAND,\n    GROUPING_EXPRESSION_LIST,\n    ROLLUP_CUBE_CLAUSE,\n    GROUPING_SETS_CLAUSE,\n\n    BACKED_LIST,\n    PIVOT_CLAUSE,\n    UNPIVOT_CLAUSE,\n    PIVOT_FOR_CLAUSE,\n    PIVOT_IN_CLAUSE,\n    UNPIVOT_IN_CLAUSE;\n\n    companion object {\n        fun buildOn(b: PlSqlGrammarBuilder) {\n            createSelectExpression(b)\n            createDeleteExpression(b)\n            createUpdateExpression(b)\n            createInsertExpression(b)\n            createMergeExpression(b)\n\n            b.rule(DML_COMMAND).define(\n                    b.firstOf(\n                            SELECT_EXPRESSION,\n                            DELETE_EXPRESSION,\n                            UPDATE_EXPRESSION,\n                            INSERT_EXPRESSION,\n                            MERGE_EXPRESSION),\n                    b.optional(SEMICOLON))\n        }\n\n        private fun createSelectExpression(b: PlSqlGrammarBuilder) {\n\n            b.rule(TABLE_REFERENCE).define(\n                    b.optional(IDENTIFIER_NAME, DOT),\n                    IDENTIFIER_NAME,\n                    b.optional(REMOTE, IDENTIFIER_NAME, b.zeroOrMore(DOT, IDENTIFIER_NAME)))\n\n            b.rule(ALIAS).define(IDENTIFIER_NAME)\n\n            b.rule(PARTITION_BY_CLAUSE).define(PARTITION, BY, EXPRESSION, b.zeroOrMore(COMMA, EXPRESSION))\n\n            b.rule(WINDOWING_LIMIT).define(b.firstOf(\n                    b.sequence(UNBOUNDED, b.firstOf(PRECEDING, FOLLOWING)),\n                    b.sequence(CURRENT, ROW),\n                    b.sequence(EXPRESSION, b.firstOf(PRECEDING, FOLLOWING))))\n\n            b.rule(WINDOWING_CLAUSE).define(\n                    b.firstOf(ROWS, RANGE_KEYWORD),\n                    b.firstOf(\n                            b.sequence(BETWEEN, WINDOWING_LIMIT, AND, WINDOWING_LIMIT),\n                            WINDOWING_LIMIT))\n\n            b.rule(KEEP_CLAUSE).define(\n                    KEEP, LPARENTHESIS,\n                    DENSE_RANK, b.firstOf(FIRST, LAST), ORDER_BY_CLAUSE,\n                    RPARENTHESIS)\n\n            b.rule(ANALYTIC_CLAUSE).define(\n                    OVER, LPARENTHESIS,\n                    b.optional(PARTITION_BY_CLAUSE), b.optional(ORDER_BY_CLAUSE, b.optional(WINDOWING_CLAUSE)),\n                    RPARENTHESIS)\n\n            b.rule(ON_OR_USING_EXPRESSION).define(\n                    b.firstOf(\n                            b.sequence(ON, EXPRESSION),\n                            b.sequence(USING, LPARENTHESIS, IDENTIFIER_NAME, b.zeroOrMore(COMMA, IDENTIFIER_NAME), RPARENTHESIS)))\n\n            b.rule(OUTER_JOIN_TYPE).define(b.firstOf(FULL, LEFT, RIGHT), b.optional(OUTER))\n\n            b.rule(QUERY_PARTITION_CLAUSE).define(\n                    PARTITION, BY,\n                    b.firstOf(\n                            b.sequence(EXPRESSION, b.zeroOrMore(COMMA, EXPRESSION)),\n                            b.sequence(LPARENTHESIS, EXPRESSION, b.zeroOrMore(COMMA, EXPRESSION), RPARENTHESIS)))\n\n            b.rule(INNER_CROSS_JOIN_CLAUSE).define(b.firstOf(\n                    b.sequence(b.optional(INNER), JOIN, DML_TABLE_EXPRESSION_CLAUSE, ON_OR_USING_EXPRESSION),\n                    b.sequence(\n                            b.firstOf(\n                                    CROSS,\n                                    b.sequence(NATURAL, b.optional(INNER))),\n                            JOIN, DML_TABLE_EXPRESSION_CLAUSE)\n            ))\n\n            b.rule(OUTER_JOIN_CLAUSE).define(\n                    b.optional(QUERY_PARTITION_CLAUSE),\n                    b.firstOf(\n                            b.sequence(OUTER_JOIN_TYPE, JOIN),\n                            b.sequence(NATURAL, b.optional(OUTER_JOIN_TYPE), JOIN)),\n                    b.sequence(DML_TABLE_EXPRESSION_CLAUSE, b.optional(QUERY_PARTITION_CLAUSE),\n                            b.optional(ON_OR_USING_EXPRESSION)))\n\n            b.rule(NESTED_CLAUSE).define(\n                NESTED, b.optional(PATH), IDENTIFIER_NAME,\n                b.optional(b.firstOf(\n                    b.sequence(DOT, JSON_RELATIVE_OBJECT_ACCESS),\n                    b.sequence(COMMA, JSON_BASIC_PATH_EXPRESSION)\n                )),\n                b.optional(JSON_TABLE_ON_ERROR_CLAUSE),\n                b.optional(JSON_TABLE_ON_EMPTY_CLAUSE),\n                JSON_COLUMNS_CLAUSE\n            )\n\n            b.rule(JOIN_CLAUSE).define(\n                b.firstOf(\n                    b.sequence(\n                        b.firstOf(\n                            b.sequence(LPARENTHESIS, JOIN_CLAUSE, RPARENTHESIS),\n                            DML_TABLE_EXPRESSION_CLAUSE),\n                        b.oneOrMore(b.firstOf(INNER_CROSS_JOIN_CLAUSE, OUTER_JOIN_CLAUSE))),\n                    b.sequence(LPARENTHESIS, JOIN_CLAUSE, RPARENTHESIS)\n                ))\n\n            b.rule(SELECT_COLUMN).define(EXPRESSION, b.optional(b.optional(AS), IDENTIFIER_NAME, b.nextNot(COLLECT)))\n\n            b.rule(DML_TABLE_EXPRESSION_CLAUSE).define(\n                b.firstOf(\n                    b.sequence(\n                        b.firstOf(\n                            b.sequence(LPARENTHESIS, SELECT_EXPRESSION, b.optional(\n                                b.firstOf(\n                                    PIVOT_CLAUSE,\n                                    UNPIVOT_CLAUSE\n                                )\n                            ), RPARENTHESIS),\n                            b.sequence(TABLE_REFERENCE, b.nextNot(LPARENTHESIS)),\n                            OBJECT_REFERENCE\n                        ),\n                        b.optional(NESTED_CLAUSE),\n                        b.optional(\n                            b.oneOrMore(\n                                b.firstOf(\n                                    PIVOT_CLAUSE,\n                                    UNPIVOT_CLAUSE\n                                )\n                            )\n                        ),\n                        b.optional(\n                            b.nextNot(\n                                b.firstOf(\n                                    PARTITION,\n                                    CROSS,\n                                    USING,\n                                    FULL,\n                                    NATURAL,\n                                    INNER,\n                                    LEFT,\n                                    RIGHT,\n                                    OUTER,\n                                    JOIN,\n                                    RETURN,\n                                    RETURNING,\n                                    LOG,\n                                    EXCEPT,\n                                    SET\n                                )\n                            ),\n                            b.optional(AS),\n                            ALIAS\n                        )\n                    ),\n                    VALUES_EXPRESSION_CLAUSE\n                )\n            )\n\n            b.rule(VALUES_EXPRESSION_CLAUSE).define(\n                LPARENTHESIS,\n                VALUES,\n                b.oneOrMore(LPARENTHESIS, EXPRESSION, b.zeroOrMore(COMMA, EXPRESSION), RPARENTHESIS, b.optional(COMMA)),\n                RPARENTHESIS,\n                b.optional(AS),\n                IDENTIFIER_NAME,\n                b.optional(LPARENTHESIS, IDENTIFIER_NAME, b.zeroOrMore(COMMA, IDENTIFIER_NAME), RPARENTHESIS)\n            )\n\n            b.rule(FROM_CLAUSE).define(\n                    FROM,\n                    b.firstOf(JOIN_CLAUSE, DML_TABLE_EXPRESSION_CLAUSE),\n                    b.optional(\n                        b.firstOf(\n                            PIVOT_CLAUSE,\n                            UNPIVOT_CLAUSE\n                        )\n                    ),\n                    b.zeroOrMore(COMMA,\n                        b.firstOf(JOIN_CLAUSE, DML_TABLE_EXPRESSION_CLAUSE),\n                        b.optional(\n                            b.firstOf(\n                                PIVOT_CLAUSE,\n                                UNPIVOT_CLAUSE\n                            )\n                        )\n                    )\n            )\n\n            b.rule(WHERE_CLAUSE).define(WHERE, EXPRESSION)\n\n            b.rule(INTO_CLAUSE).define(\n                    b.optional(BULK, COLLECT), INTO,\n                    OBJECT_REFERENCE, b.zeroOrMore(COMMA, OBJECT_REFERENCE))\n\n            b.rule(GROUPING_EXPRESSION_LIST).define(\n                b.firstOf(\n                    b.sequence(LPARENTHESIS, b.optional(EXPRESSION, b.zeroOrMore(COMMA, EXPRESSION)), RPARENTHESIS),\n                    EXPRESSION, b.zeroOrMore(COMMA, EXPRESSION))\n                )\n\n            b.rule(ROLLUP_CUBE_CLAUSE).define(\n                b.firstOf(ROLLUP, CUBE), LPARENTHESIS, GROUPING_EXPRESSION_LIST, RPARENTHESIS)\n\n            b.rule(GROUPING_SETS_CLAUSE).define(\n                GROUPING, SETS, LPARENTHESIS,\n                b.firstOf(ROLLUP_CUBE_CLAUSE, GROUPING_EXPRESSION_LIST),\n                b.zeroOrMore(COMMA, b.firstOf(ROLLUP_CUBE_CLAUSE, GROUPING_EXPRESSION_LIST)),\n                RPARENTHESIS)\n\n            b.rule(GROUP_BY_CLAUSE).define(\n                GROUP, BY,\n                b.firstOf(ROLLUP_CUBE_CLAUSE, GROUPING_SETS_CLAUSE, EXPRESSION),\n                b.zeroOrMore(COMMA, b.firstOf(ROLLUP_CUBE_CLAUSE, GROUPING_SETS_CLAUSE, EXPRESSION)))\n\n            b.rule(HAVING_CLAUSE).define(HAVING, EXPRESSION)\n\n\n            b.rule(BACKED_LIST).define(\n                b.firstOf(\n                    b.oneOrMore(EXPRESSION, b.optional(b.optional(AS), b.firstOf(ALIAS,LITERAL)), b.optional(COMMA)),\n                    b.oneOrMore(\n                        LPARENTHESIS,\n                        b.oneOrMore(b.firstOf(LITERAL, IDENTIFIER_NAME), b.optional(COMMA)),\n                        RPARENTHESIS,\n                        b.optional(AS, b.oneOrMore(b.firstOf(LITERAL, IDENTIFIER_NAME), b.optional(COMMA))),\n                        b.optional(COMMA)\n                    ))\n            )\n\n            b.rule(PIVOT_FOR_CLAUSE).define(\n                FOR,\n                b.firstOf(\n                    b.sequence(LPARENTHESIS, b.oneOrMore(VARIABLE_NAME, b.optional(COMMA)), RPARENTHESIS),\n                    VARIABLE_NAME\n                )\n            )\n            b.rule(PIVOT_IN_CLAUSE).define(\n                IN,\n                LPARENTHESIS,\n                b.firstOf(\n                    b.oneOrMore(\n                        b.firstOf(\n                            EXPRESSION,\n                            b.sequence(LPARENTHESIS, b.oneOrMore(EXPRESSION, b.optional(COMMA)), RPARENTHESIS)\n                        ),\n                        b.optional(b.optional(AS), b.firstOf(ALIAS,LITERAL)),\n                        b.optional(COMMA)),\n                    SELECT_EXPRESSION,\n                    b.oneOrMore(ANY, b.optional(COMMA))),\n                RPARENTHESIS\n            )\n\n            b.rule(UNPIVOT_IN_CLAUSE).define(\n                IN,\n                LPARENTHESIS,\n                b.oneOrMore(\n                    b.firstOf(\n                        b.sequence(LPARENTHESIS, b.oneOrMore(VARIABLE_NAME, b.optional(COMMA)), RPARENTHESIS),\n                        VARIABLE_NAME\n                    ),\n                    b.optional(\n                        b.optional(AS),\n                        b.firstOf(\n                            b.sequence(LPARENTHESIS, b.oneOrMore(b.firstOf(ALIAS, LITERAL), b.optional(COMMA)), RPARENTHESIS),\n                            b.firstOf(ALIAS, LITERAL)\n                        )\n                    ),\n                    b.optional(COMMA)\n                ),\n                RPARENTHESIS\n            )\n\n            b.rule(PIVOT_CLAUSE).define(\n                b.sequence(\n                    PIVOT,\n                    b.optional(XML),\n                    LPARENTHESIS,\n                    b.oneOrMore(\n                        b.firstOf(\n                            b.sequence(LPARENTHESIS, b.optional(EXPRESSION), RPARENTHESIS),\n                            EXPRESSION\n                        ),\n                        b.optional(b.optional(AS), b.firstOf(ALIAS,LITERAL)),\n                        b.optional(COMMA)\n                    ),\n                    PIVOT_FOR_CLAUSE,\n                    PIVOT_IN_CLAUSE,\n                    RPARENTHESIS\n                )\n            )\n\n            b.rule(UNPIVOT_CLAUSE).define(\n                b.sequence(\n                    UNPIVOT,\n                    b.optional(b.firstOf(INCLUDE, EXCLUDE), NULLS),\n                    LPARENTHESIS,\n                    b.firstOf(\n                        b.sequence(LPARENTHESIS, b.oneOrMore(VARIABLE_NAME, b.optional(COMMA)), RPARENTHESIS),\n                        VARIABLE_NAME\n                    ),\n                    PIVOT_FOR_CLAUSE,\n                    UNPIVOT_IN_CLAUSE,\n                    RPARENTHESIS\n                )\n            )\n\n            b.rule(ORDER_BY_ITEM).define(EXPRESSION, b.optional(b.firstOf(ASC, DESC)), b.optional(NULLS, b.firstOf(FIRST, LAST)))\n\n            b.rule(ORDER_BY_CLAUSE).define(\n                    ORDER, b.optional(SIBLINGS), BY, ORDER_BY_ITEM, b.zeroOrMore(COMMA, ORDER_BY_ITEM))\n\n            b.rule(OFFSET_CLAUSE).define(OFFSET, EXPRESSION, b.firstOf(ROW, ROWS))\n\n            b.rule(FETCH_ROW_CLAUSE).define(FETCH, b.firstOf(FIRST, NEXT), b.optional(EXPRESSION, b.optional(PERCENT)), b.firstOf(ROW, ROWS), b.firstOf(ONLY, b.sequence(WITH, TIES)))\n\n            b.rule(ROW_LIMITING_CLAUSE).define(b.firstOf(\n                    b.sequence(OFFSET_CLAUSE, b.optional(FETCH_ROW_CLAUSE)),\n                    FETCH_ROW_CLAUSE))\n\n            b.rule(FOR_UPDATE_CLAUSE).define(\n                    FOR, UPDATE,\n                    b.optional(OF, OBJECT_REFERENCE, b.zeroOrMore(COMMA, OBJECT_REFERENCE)),\n                    b.optional(b.firstOf(NOWAIT, b.sequence(WAIT, INTEGER_LITERAL), b.sequence(SKIP, LOCKED))))\n\n            b.rule(CONNECT_BY_CLAUSE).define(CONNECT, BY, b.optional(NOCYCLE), EXPRESSION)\n\n            b.rule(START_WITH_CLAUSE).define(START, WITH, EXPRESSION)\n\n            b.rule(HIERARCHICAL_QUERY_CLAUSE).define(b.firstOf(\n                    b.sequence(CONNECT_BY_CLAUSE, b.optional(START_WITH_CLAUSE)),\n                    b.sequence(START_WITH_CLAUSE, CONNECT_BY_CLAUSE)))\n\n            b.rule(WITH_CLAUSE).define(\n                WITH,\n                b.firstOf(\n                    b.sequence(\n                        b.oneOrMore(b.firstOf(FUNCTION_DECLARATION, PROCEDURE_DECLARATION)),\n                        b.zeroOrMore(SUBQUERY_FACTORING_CLAUSE, b.zeroOrMore(COMMA, SUBQUERY_FACTORING_CLAUSE))\n                    ),\n                    b.oneOrMore(SUBQUERY_FACTORING_CLAUSE, b.zeroOrMore(COMMA, SUBQUERY_FACTORING_CLAUSE))\n                )\n            )\n\n            b.rule(SUBQUERY_FACTORING_CLAUSE).define(\n                IDENTIFIER_NAME,\n                b.optional(LPARENTHESIS, IDENTIFIER_NAME, b.zeroOrMore(COMMA, IDENTIFIER_NAME), RPARENTHESIS),\n                AS,\n                b.firstOf(\n                    b.sequence(LPARENTHESIS, SELECT_EXPRESSION, RPARENTHESIS),\n                    VALUES_EXPRESSION_CLAUSE),\n                b.optional(SEARCH_CLAUSE),\n                b.optional(CYCLE_CLAUSE)\n            )\n\n            b.rule(SEARCH_CLAUSE).define(\n                SEARCH, b.firstOf(BREADTH, DEPTH),\n                FIRST, BY, ORDER_BY_ITEM, b.zeroOrMore(COMMA, ORDER_BY_ITEM),\n                SET, IDENTIFIER_NAME\n            )\n\n            b.rule(CYCLE_CLAUSE).define(\n                CYCLE, IDENTIFIER_NAME, b.zeroOrMore(COMMA, IDENTIFIER_NAME),\n                SET, IDENTIFIER_NAME, TO, EXPRESSION, DEFAULT, EXPRESSION\n            )\n\n            b.rule(QUERY_BLOCK).define(\n                b.firstOf(\n                    b.sequence(\n                        SELECT, b.optional(b.firstOf(ALL, DISTINCT, UNIQUE)), SELECT_COLUMN, b.zeroOrMore(COMMA, SELECT_COLUMN),\n                        b.optional(INTO_CLAUSE),\n                        b.optional(FROM_CLAUSE),\n                        b.optional(WHERE_CLAUSE),\n                        b.optional(b.firstOf(\n                            b.sequence(GROUP_BY_CLAUSE, b.optional(HAVING_CLAUSE)),\n                            b.sequence(HAVING_CLAUSE, b.optional(GROUP_BY_CLAUSE)))),\n                        b.optional(HAVING_CLAUSE),\n                        b.optional(HIERARCHICAL_QUERY_CLAUSE)),\n                    b.sequence(LPARENTHESIS, SELECT_EXPRESSION, RPARENTHESIS)))\n\n            b.rule(SELECT_EXPRESSION).define(\n                b.optional(WITH_CLAUSE),\n                QUERY_BLOCK,\n                b.zeroOrMore(b.firstOf(MINUS_KEYWORD, INTERSECT, UNION, EXCEPT), b.optional(ALL), QUERY_BLOCK),\n                b.optional(b.firstOf(\n                    b.sequence(ORDER_BY_CLAUSE, b.optional(b.firstOf(FOR_UPDATE_CLAUSE, ROW_LIMITING_CLAUSE))),\n                    ROW_LIMITING_CLAUSE,\n                    b.sequence(FOR_UPDATE_CLAUSE, b.optional(ORDER_BY_CLAUSE)))))\n        }\n\n        private fun createDeleteExpression(b: PlSqlGrammarBuilder) {\n            b.rule(RETURNING_INTO_CLAUSE).define(\n                    b.firstOf(RETURNING, RETURN),\n                    b.optional(EXPRESSION, b.zeroOrMore(COMMA, EXPRESSION)),\n                    INTO_CLAUSE)\n\n            b.rule(DELETE_EXPRESSION).define(\n                    DELETE, b.optional(FROM),\n                    DML_TABLE_EXPRESSION_CLAUSE,\n                    b.optional(b.firstOf(\n                            b.sequence(WHERE, CURRENT, OF, IDENTIFIER_NAME),\n                            WHERE_CLAUSE)),\n                    b.optional(RETURNING_INTO_CLAUSE))\n        }\n\n        private fun createUpdateExpression(b: PlSqlGrammarBuilder) {\n            b.rule(UPDATE_COLUMN).define(OBJECT_REFERENCE, EQUALS, b.firstOf(EXPRESSION, DEFAULT))\n\n            b.rule(UPDATE_EXPRESSION).define(\n                    UPDATE, DML_TABLE_EXPRESSION_CLAUSE, SET, UPDATE_COLUMN, b.zeroOrMore(COMMA, UPDATE_COLUMN),\n                    b.optional(b.firstOf(\n                            b.sequence(WHERE, CURRENT, OF, IDENTIFIER_NAME),\n                            WHERE_CLAUSE)),\n                    b.optional(RETURNING_INTO_CLAUSE))\n        }\n\n        private fun createInsertExpression(b: PlSqlGrammarBuilder) {\n            b.rule(INSERT_COLUMNS).define(LPARENTHESIS, MEMBER_EXPRESSION, b.zeroOrMore(COMMA, MEMBER_EXPRESSION), RPARENTHESIS)\n\n            b.rule(INSERT_EXPRESSION).define(INSERT, b.firstOf(SINGLE_TABLE_INSERT, MULTI_TABLE_INSERT))\n\n            b.rule(SINGLE_TABLE_INSERT).define(\n                INSERT_INTO_CLAUSE,\n                b.firstOf(\n                    b.sequence(VALUES_CLAUSE, b.optional(RETURNING_INTO_CLAUSE)),\n                    SELECT_EXPRESSION),\n                b.optional(ERROR_LOGGING_CLAUSE))\n\n            b.rule(INSERT_INTO_CLAUSE).define(INTO,\n                b.firstOf(b.sequence(LPARENTHESIS, SELECT_EXPRESSION, RPARENTHESIS), b.firstOf(\n                    TABLE_EXPRESSION, THE_EXPRESSION, TABLE_REFERENCE)),\n                b.optional(IDENTIFIER_NAME), b.optional(INSERT_COLUMNS))\n\n            b.rule(VALUES_CLAUSE).define(\n                VALUES,\n                b.firstOf(\n                    b.sequence(LPARENTHESIS, b.firstOf(EXPRESSION, DEFAULT), b.zeroOrMore(b.sequence(COMMA, b.firstOf(EXPRESSION, DEFAULT))), RPARENTHESIS),\n                    EXPRESSION))\n\n            b.rule(MULTI_TABLE_INSERT).define(\n                b.firstOf(\n                    b.sequence(ALL, b.oneOrMore(b.sequence(INSERT_INTO_CLAUSE, b.optional(VALUES_CLAUSE), b.optional(ERROR_LOGGING_CLAUSE)))),\n                    CONDITIONAL_INSERT_CLAUSE),\n                SELECT_EXPRESSION)\n\n            b.rule(CONDITIONAL_INSERT_CLAUSE).define(\n                b.optional(b.firstOf(ALL, FIRST)),\n                WHEN, EXPRESSION, THEN, INSERT_INTO_CLAUSE,\n                b.optional(VALUES_CLAUSE),\n                b.optional(ERROR_LOGGING_CLAUSE),\n                b.zeroOrMore(INSERT_INTO_CLAUSE, b.optional(VALUES_CLAUSE), b.optional(ERROR_LOGGING_CLAUSE)),\n                b.zeroOrMore(WHEN, EXPRESSION, THEN, INSERT_INTO_CLAUSE,\n                    b.optional(VALUES_CLAUSE),\n                    b.optional(ERROR_LOGGING_CLAUSE),\n                    b.zeroOrMore(INSERT_INTO_CLAUSE, b.optional(VALUES_CLAUSE), b.optional(ERROR_LOGGING_CLAUSE))),\n                b.optional(ELSE, INSERT_INTO_CLAUSE,\n                    b.optional(VALUES_CLAUSE),\n                    b.optional(ERROR_LOGGING_CLAUSE),\n                    b.zeroOrMore(INSERT_INTO_CLAUSE, b.optional(VALUES_CLAUSE), b.optional(ERROR_LOGGING_CLAUSE))))\n\n        }\n\n        private fun createMergeExpression(b: PlSqlGrammarBuilder) {\n\n            b.rule(MERGE_UPDATE_CLAUSE).define(WHEN, MATCHED, THEN, UPDATE, SET, UPDATE_COLUMN, b.zeroOrMore(COMMA, UPDATE_COLUMN),\n                    b.optional(WHERE_CLAUSE), b.optional(DELETE, WHERE_CLAUSE))\n\n            b.rule(MERGE_INSERT_CLAUSE).define(WHEN, NOT, MATCHED, THEN, INSERT,\n                    b.optional(LPARENTHESIS, OBJECT_REFERENCE, b.zeroOrMore(COMMA, OBJECT_REFERENCE), RPARENTHESIS),\n                    VALUES, b.firstOf(\n                    b.sequence(LPARENTHESIS, b.firstOf(EXPRESSION, DEFAULT), b.zeroOrMore(COMMA, b.firstOf(EXPRESSION, DEFAULT)), RPARENTHESIS),\n                    IDENTIFIER_NAME),\n                    b.optional(WHERE_CLAUSE))\n\n            b.rule(ERROR_LOGGING_CLAUSE).define(\n                    LOG, ERRORS,\n                    b.optional(INTO, TABLE_REFERENCE),\n                    b.optional(LPARENTHESIS, EXPRESSION, RPARENTHESIS),\n                    b.optional(REJECT, LIMIT, b.firstOf(EXPRESSION, UNLIMITED)))\n\n            //https://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_9016.htm#SQLRF01606\n            b.rule(MERGE_EXPRESSION).define(\n                    MERGE, INTO, TABLE_REFERENCE, b.optional(b.nextNot(USING), IDENTIFIER_NAME),\n                    USING, DML_TABLE_EXPRESSION_CLAUSE, ON, LPARENTHESIS, BOOLEAN_EXPRESSION, RPARENTHESIS,\n                    b.firstOf(\n                            b.sequence(MERGE_UPDATE_CLAUSE, b.optional(MERGE_INSERT_CLAUSE), b.optional(ERROR_LOGGING_CLAUSE)),\n                            b.sequence(MERGE_INSERT_CLAUSE, b.optional(MERGE_UPDATE_CLAUSE), b.optional(ERROR_LOGGING_CLAUSE))))\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/GrammarRuleBuilderExtensions.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api\n\nimport com.felipebz.flr.grammar.GrammarRuleBuilder\n\ninternal fun GrammarRuleBuilder.define(e: Any): GrammarRuleBuilder =\n    this.`is`(e)\n\ninternal fun GrammarRuleBuilder.define(e: Any, vararg rest: Any): GrammarRuleBuilder =\n    this.`is`(e, *rest)\n\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/PlSqlFile.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api\n\nimport java.nio.file.Path\n\ninterface PlSqlFile {\n\n    fun contents(): String\n\n    fun fileName(): String\n\n    fun path(): Path\n\n    fun type(): Type\n\n    enum class Type {\n        MAIN, TEST\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/PlSqlGrammar.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api\n\nimport com.felipebz.flr.api.GenericTokenType.EOF\nimport com.felipebz.flr.api.GenericTokenType.IDENTIFIER\nimport com.felipebz.flr.grammar.GrammarRuleKey\nimport com.felipebz.flr.grammar.LexerfulGrammarBuilder\nimport com.felipebz.zpa.grammar.ExecuteBufferExpression\nimport com.felipebz.zpa.sslr.ElseClause\nimport com.felipebz.zpa.sslr.ElsifClause\nimport com.felipebz.zpa.sslr.IfStatement\nimport com.felipebz.zpa.sslr.NullStatement\nimport com.felipebz.zpa.sslr.PlSqlGrammarBuilder\nimport com.felipebz.zpa.sslr.RaiseStatement\nimport com.felipebz.zpa.sslr.Statements\nimport com.felipebz.zpa.squid.PlSqlConfiguration\nimport com.felipebz.zpa.api.DclGrammar.DCL_COMMAND\nimport com.felipebz.zpa.api.DdlGrammar.DDL_COMMAND\nimport com.felipebz.zpa.api.DmlGrammar.*\nimport com.felipebz.zpa.api.PlSqlKeyword.*\nimport com.felipebz.zpa.api.PlSqlPunctuator.*\nimport com.felipebz.zpa.api.PlSqlTokenType.*\nimport com.felipebz.zpa.api.SessionControlGrammar.SESSION_CONTROL_COMMAND\nimport com.felipebz.zpa.api.SqlPlusGrammar.SQLPLUS_COMMAND\nimport com.felipebz.zpa.api.TclGrammar.*\n\nenum class PlSqlGrammar : GrammarRuleKey {\n\n    // Data types\n    DATATYPE,\n    DATATYPE_LENGTH,\n    CHARACTER_SET_CLAUSE,\n    NUMERIC_PRECISION,\n    NUMERIC_SCALE,\n    NUMERIC_DATATYPE_CONSTRAINT,\n    NUMERIC_DATATYPE,\n    LOB_DATATYPE,\n    CHARACTER_DATATYPE_CONSTRAINT,\n    CHARACTER_DATAYPE,\n    BOOLEAN_DATATYPE,\n    DATE_DATATYPE,\n    CUSTOM_SUBTYPE,\n    ANCHORED_DATATYPE,\n    CUSTOM_DATATYPE,\n    REF_DATATYPE,\n    JSON_DATATYPE,\n    DATATYPE_NULL_CONSTRAINT,\n\n    // Literals\n    LITERAL,\n    BOOLEAN_LITERAL,\n    NULL_LITERAL,\n    NUMERIC_LITERAL,\n    FLOATING_POINT_LITERAL,\n    CHARACTER_LITERAL,\n    INTERVAL_YEAR_TO_MONTH_LITERAL,\n    INTERVAL_DAY_TO_SECOND_LITERAL,\n    INTERVAL_LITERAL,\n    INQUIRY_DIRECTIVE,\n\n    // Operators\n    CONCATENATION_OPERATOR,\n    EQUALS_OPERATOR,\n    NOTEQUALS_STANDARD_OPERATOR,\n    NOTEQUALS_NONSTANDARD_OPERATOR,\n    NOTEQUALS_OPERATOR,\n    LESSTHAN_OPERATOR,\n    LESSTHANOREQUALS_OPERATOR,\n    GREATERTHAN_OPERATOR,\n    GREATERTHANOREQUALS_OPERATOR,\n\n    // Expressions\n    EXPRESSION,\n    AND_EXPRESSION,\n    OR_EXPRESSION,\n    NOT_EXPRESSION,\n    BOOLEAN_EXPRESSION,\n    PRIMARY_EXPRESSION,\n    BRACKED_EXPRESSION,\n    MULTIPLE_VALUE_EXPRESSION,\n    MEMBER_EXPRESSION,\n    OUTER_JOIN_PLUS_SIGN,\n    OBJECT_REFERENCE,\n    POSTFIX_EXPRESSION,\n    IN_EXPRESSION,\n    EXISTS_EXPRESSION,\n    UNARY_EXPRESSION,\n    MULTIPLICATIVE_EXPRESSION,\n    ADDITIVE_EXPRESSION,\n    CONCATENATION_EXPRESSION,\n    COMPARISON_EXPRESSION,\n    EXPONENTIATION_EXPRESSION,\n    ARGUMENT,\n    ARGUMENTS,\n    METHOD_CALL,\n    SEQUENCE_ITERATOR_CHOICE,\n    POSITIONAL_CHOICE_OPTION,\n    POSITIONAL_CHOICE_LIST,\n    NAMED_CHOICE_LIST,\n    INDEXED_CHOICE_LIST,\n    BASIC_ITERATOR_CHOICE,\n    INDEX_ITERATOR_CHOICE,\n    EXPLICIT_CHOICE_OPTION,\n    EXPLICIT_CHOICE_LIST,\n    QUALIFIED_EXPRESSION,\n    CALL_EXPRESSION,\n    CASE_EXPRESSION,\n    AT_TIME_ZONE_EXPRESSION,\n    VARIABLE_NAME,\n    NEW_OBJECT_EXPRESSION,\n    MULTISET_EXPRESSION,\n\n    // Statements\n    LABEL,\n    STATEMENTS_SECTION,\n    BLOCK_STATEMENT,\n    NULL_STATEMENT,\n    ASSIGNMENT_STATEMENT,\n    ELSIF_CLAUSE,\n    ELSE_CLAUSE,\n    IF_STATEMENT,\n    LOOP_STATEMENT,\n    EXIT_STATEMENT,\n    CONTINUE_STATEMENT,\n    GOTO_STATEMENT,\n    ITERATOR,\n    ITERAND_DECLARATION,\n    ITERATION_CTL_SEQ,\n    QUAL_ITERATION_CTL,\n    PRED_CLAUSE_SEQ,\n    ITERATION_CONTROL,\n    STEPPED_CONTROL,\n    SINGLE_EXPRESSION_CONTROL,\n    VALUES_OF_CONTROL,\n    INDICES_OF_CONTROL,\n    PAIRS_OF_CONTROL,\n    DYNAMIC_SQL,\n    FOR_STATEMENT,\n    WHILE_STATEMENT,\n    RETURN_STATEMENT,\n    COMMIT_STATEMENT,\n    ROLLBACK_STATEMENT,\n    SAVEPOINT_STATEMENT,\n    RAISE_STATEMENT,\n    SELECT_STATEMENT,\n    INSERT_STATEMENT,\n    UPDATE_STATEMENT,\n    DELETE_STATEMENT,\n    CALL_STATEMENT,\n    UNNAMED_ACTUAL_PAMETER,\n    EXECUTE_IMMEDIATE_STATEMENT,\n    OPEN_STATEMENT,\n    OPEN_FOR_STATEMENT,\n    FETCH_STATEMENT,\n    CLOSE_STATEMENT,\n    PIPE_ROW_STATEMENT,\n    CASE_STATEMENT,\n    STATEMENT,\n    STATEMENTS,\n    FORALL_STATEMENT,\n    SET_TRANSACTION_STATEMENT,\n    MERGE_STATEMENT,\n    INLINE_PRAGMA_STATEMENT,\n\n    // Declarations\n    DEFAULT_VALUE_ASSIGNMENT,\n    VARIABLE_DECLARATION,\n    EXCEPTION_DECLARATION,\n    PARAMETER_DECLARATIONS,\n    PARAMETER_DECLARATION,\n    CURSOR_PARAMETER_DECLARATIONS,\n    CURSOR_PARAMETER_DECLARATION,\n    CURSOR_DECLARATION,\n    RECORD_FIELD_DECLARATION,\n    RECORD_DECLARATION,\n    NESTED_TABLE_DEFINITION,\n    TABLE_OF_DECLARATION,\n    VARRAY_TYPE_DEFINITION,\n    VARRAY_DECLARATION,\n    REF_CURSOR_DECLARATION,\n    AUTONOMOUS_TRANSACTION_PRAGMA,\n    EXCEPTION_INIT_PRAGMA,\n    SERIALLY_REUSABLE_PRAGMA,\n    INTERFACE_PRAGMA,\n    RESTRICT_REFERENCES_PRAGMA,\n    UDF_PRAGMA,\n    DEPRECATE_PRAGMA,\n    SUPPRESSES_WARNING_6009_PRAGMA,\n    COVERAGE_PRAGMA,\n    PRAGMA_DECLARATION,\n    HOST_AND_INDICATOR_VARIABLE,\n    JAVA_DECLARATION,\n    C_DECLARATION,\n    EXTERNAL_PARAMETER_PROPERTY,\n    EXTERNAL_PARAMETER,\n    CALL_SPECIFICATION,\n\n    DECLARE_SECTION,\n    EXCEPTION_HANDLERS,\n    EXCEPTION_HANDLER,\n    IDENTIFIER_NAME,\n    NON_RESERVED_KEYWORD,\n    EXECUTE_PLSQL_BUFFER,\n\n    // Triggers\n    SIMPLE_DML_TRIGGER,\n    INSTEAD_OF_DML_TRIGGER,\n    COMPOUND_DML_TRIGGER,\n    SYSTEM_TRIGGER,\n    DML_EVENT_CLAUSE,\n    REFERENCING_CLAUSE,\n    TRIGGER_EDITION_CLAUSE,\n    TRIGGER_ORDERING_CLAUSE,\n    COMPOUND_TRIGGER_BLOCK,\n    TIMING_POINT_SECTION,\n    TIMING_POINT,\n    TPS_BODY,\n    DDL_EVENT,\n    DATABASE_EVENT,\n\n    // Program units\n    COMPILATION_UNIT,\n    UNIT_NAME,\n    ANONYMOUS_BLOCK,\n    PROCEDURE_DECLARATION,\n    FUNCTION_DECLARATION,\n    CREATE_PROCEDURE,\n    CREATE_FUNCTION,\n    CREATE_PACKAGE,\n    CREATE_PACKAGE_BODY,\n    VIEW_RESTRICTION_CLAUSE,\n    CREATE_VIEW,\n    TYPE_ATTRIBUTE,\n    INHERITANCE_CLAUSE,\n    TYPE_SUBPROGRAM,\n    TYPE_CONSTRUCTOR,\n    MAP_ORDER_FUNCTION,\n    TYPE_ELEMENT_SPEC,\n    OBJECT_TYPE_DEFINITION,\n    CREATE_TRIGGER,\n    CREATE_TYPE,\n    CREATE_TYPE_BODY,\n\n    // Top-level components\n    VALID_INPUT,\n    RECOVERY,\n    FILE_INPUT;\n\n    companion object {\n        fun create(conf: PlSqlConfiguration): PlSqlGrammarBuilder {\n            val b = PlSqlGrammarBuilder(LexerfulGrammarBuilder.create())\n\n            val keywords = PlSqlKeyword.nonReservedKeywords\n            val rest = keywords.subList(2, keywords.size).toTypedArray()\n            b.rule(NON_RESERVED_KEYWORD).define(b.firstOf(keywords[0], keywords[1], *rest))\n\n            b.rule(IDENTIFIER_NAME).define(b.firstOf(IDENTIFIER, NON_RESERVED_KEYWORD))\n\n            b.rule(VALID_INPUT).define(b.firstOf(\n                    COMPILATION_UNIT,\n                    DCL_COMMAND,\n                    DDL_COMMAND,\n                    DML_COMMAND,\n                    TCL_COMMAND,\n                    SQLPLUS_COMMAND,\n                    SESSION_CONTROL_COMMAND,\n                    EXECUTE_PLSQL_BUFFER)).skip()\n\n            if (conf.isErrorRecoveryEnabled) {\n                b.rule(RECOVERY).define(b.oneOrMore(\n                        b.nextNot(b.firstOf(VALID_INPUT, EOF)),\n                        b.anyToken()))\n\n                b.rule(FILE_INPUT).define(b.zeroOrMore(b.firstOf(\n                        VALID_INPUT,\n                        RECOVERY)), EOF)\n            } else {\n                b.rule(RECOVERY).define(b.nothing())\n                b.rule(FILE_INPUT).define(b.zeroOrMore(VALID_INPUT), EOF)\n            }\n\n            createLiterals(b)\n            createOperators(b)\n            createDatatypes(b)\n            createStatements(b)\n            createExpressions(b)\n            createDeclarations(b)\n            createTrigger(b)\n            createProgramUnits(b)\n            DdlGrammar.buildOn(b)\n            DmlGrammar.buildOn(b)\n            DclGrammar.buildOn(b)\n            TclGrammar.buildOn(b)\n            SqlPlusGrammar.buildOn(b)\n            SessionControlGrammar.buildOn(b)\n            SingleRowSqlFunctionsGrammar.buildOn(b)\n            AggregateSqlFunctionsGrammar.buildOn(b)\n            ConditionsGrammar.buildOn(b)\n\n            b.setRootRule(FILE_INPUT)\n            b.buildWithMemoizationOfMatchesForAllRules()\n\n            return b\n        }\n\n        private fun createLiterals(b: PlSqlGrammarBuilder) {\n            b.rule(INTERVAL_YEAR_TO_MONTH_LITERAL).define(\n                    INTERVAL, CHARACTER_LITERAL,\n                    b.firstOf(YEAR, MONTH), b.optional(LPARENTHESIS, INTEGER_LITERAL, RPARENTHESIS),\n                    b.optional(TO, b.firstOf(YEAR, MONTH)))\n\n            b.rule(INTERVAL_DAY_TO_SECOND_LITERAL).define(\n                    INTERVAL, CHARACTER_LITERAL,\n                    b.firstOf(\n                            b.sequence(b.firstOf(DAY, HOUR, MINUTE), b.optional(LPARENTHESIS, INTEGER_LITERAL, RPARENTHESIS)),\n                            b.sequence(SECOND, b.optional(LPARENTHESIS, INTEGER_LITERAL, b.optional(COMMA, INTEGER_LITERAL), RPARENTHESIS))\n                    ),\n                    b.optional(TO,\n                            b.firstOf(\n                                    DAY,\n                                    HOUR,\n                                    MINUTE,\n                                    b.sequence(SECOND, b.optional(LPARENTHESIS, INTEGER_LITERAL, RPARENTHESIS))\n                            )))\n\n            b.rule(NULL_LITERAL).define(NULL)\n            b.rule(BOOLEAN_LITERAL).define(b.firstOf(TRUE, FALSE))\n            b.rule(NUMERIC_LITERAL).define(b.firstOf(INTEGER_LITERAL, NUMBER_LITERAL))\n            b.rule(FLOATING_POINT_LITERAL).define(b.firstOf(BINARY_DOUBLE_INFINITY, BINARY_DOUBLE_NAN, BINARY_FLOAT_INFINITY, BINARY_FLOAT_NAN))\n            b.rule(CHARACTER_LITERAL).define(STRING_LITERAL)\n            b.rule(INTERVAL_LITERAL).define(b.firstOf(INTERVAL_YEAR_TO_MONTH_LITERAL, INTERVAL_DAY_TO_SECOND_LITERAL))\n            b.rule(INQUIRY_DIRECTIVE).define(DOUBLEDOLLAR, IDENTIFIER_NAME)\n\n            b.rule(LITERAL).define(b.firstOf(NULL_LITERAL, BOOLEAN_LITERAL, NUMERIC_LITERAL,\n                FLOATING_POINT_LITERAL, CHARACTER_LITERAL, DATE_LITERAL, TIMESTAMP_LITERAL, INTERVAL_LITERAL, INQUIRY_DIRECTIVE))\n        }\n\n        private fun createOperators(b: PlSqlGrammarBuilder) {\n            b.rule(CONCATENATION_OPERATOR).define(SINGLE_PIPE, SINGLE_PIPE)\n\n            b.rule(EQUALS_OPERATOR).define(EQUALS)\n\n            b.rule(NOTEQUALS_STANDARD_OPERATOR).define(LESSTHAN, GREATERTHAN)\n\n            b.rule(NOTEQUALS_NONSTANDARD_OPERATOR).define(b.firstOf(EXCLAMATION, CARET, TILDE), EQUALS)\n\n            b.rule(NOTEQUALS_OPERATOR).define(b.firstOf(NOTEQUALS_STANDARD_OPERATOR, NOTEQUALS_NONSTANDARD_OPERATOR))\n\n            b.rule(LESSTHAN_OPERATOR).define(LESSTHAN)\n\n            b.rule(LESSTHANOREQUALS_OPERATOR).define(LESSTHAN, EQUALS)\n\n            b.rule(GREATERTHAN_OPERATOR).define(GREATERTHAN)\n\n            b.rule(GREATERTHANOREQUALS_OPERATOR).define(GREATERTHAN, EQUALS)\n        }\n\n        private fun createDatatypes(b: PlSqlGrammarBuilder) {\n            b.rule(DATATYPE_LENGTH).define(b.firstOf(EXPRESSION, INQUIRY_DIRECTIVE)).skip()\n\n            b.rule(NUMERIC_PRECISION).define(b.firstOf(MULTIPLICATION, DATATYPE_LENGTH))\n\n            b.rule(NUMERIC_SCALE).define(DATATYPE_LENGTH)\n\n            b.rule(NUMERIC_DATATYPE_CONSTRAINT).define(\n                LPARENTHESIS, NUMERIC_PRECISION, b.optional(COMMA, NUMERIC_SCALE), RPARENTHESIS\n            )\n\n            b.rule(NUMERIC_DATATYPE).define(\n                    b.firstOf(\n                            BINARY_DOUBLE,\n                            BINARY_FLOAT,\n                            BINARY_INTEGER,\n                            DEC,\n                            DECIMAL,\n                            b.sequence(DOUBLE, PRECISION),\n                            FLOAT,\n                            INT,\n                            INTEGER,\n                            NATURAL,\n                            NATURALN,\n                            NUMBER,\n                            NUMERIC,\n                            PLS_INTEGER,\n                            POSITIVE,\n                            POSITIVEN,\n                            REAL,\n                            SIGNTYPE,\n                            SMALLINT),\n                    b.optional(NUMERIC_DATATYPE_CONSTRAINT))\n\n            b.rule(CHARACTER_SET_CLAUSE).define(CHARACTER, SET, b.firstOf(ANY_CS, b.sequence(IDENTIFIER_NAME, MOD, CHARSET)))\n\n            b.rule(LOB_DATATYPE).define(b.firstOf(BFILE, BLOB, CLOB, NCLOB), b.optional(CHARACTER_SET_CLAUSE))\n\n            b.rule(CHARACTER_DATATYPE_CONSTRAINT).define(\n                b.firstOf(\n                    b.sequence(LPARENTHESIS, DATATYPE_LENGTH, b.optional(b.firstOf(BYTE, CHAR)), RPARENTHESIS, b.optional(CHARACTER_SET_CLAUSE)),\n                    CHARACTER_SET_CLAUSE))\n\n            b.rule(CHARACTER_DATAYPE).define(\n                    b.firstOf(\n                            CHAR,\n                            CHARACTER,\n                            b.sequence(LONG, b.optional(RAW)),\n                            NCHAR,\n                            NVARCHAR2,\n                            RAW,\n                            ROWID,\n                            STRING,\n                            UROWID,\n                            VARCHAR,\n                            VARCHAR2),\n                b.optional(CHARACTER_DATATYPE_CONSTRAINT))\n\n            b.rule(BOOLEAN_DATATYPE).define(BOOLEAN)\n\n            b.rule(DATE_DATATYPE).define(b.firstOf(\n                    DATE,\n                    b.sequence(TIMESTAMP, b.optional(LPARENTHESIS, DATATYPE_LENGTH, RPARENTHESIS), b.optional(WITH, b.optional(LOCAL), TIME, ZONE)),\n                    b.sequence(INTERVAL, YEAR, b.optional(LPARENTHESIS, DATATYPE_LENGTH, RPARENTHESIS), TO, MONTH),\n                    b.sequence(INTERVAL, DAY, b.optional(LPARENTHESIS, DATATYPE_LENGTH, RPARENTHESIS),\n                            TO, SECOND, b.optional(LPARENTHESIS, DATATYPE_LENGTH, RPARENTHESIS))))\n\n            b.rule(ANCHORED_DATATYPE).define(MEMBER_EXPRESSION, MOD, b.firstOf(TYPE, ROWTYPE))\n\n            b.rule(CUSTOM_DATATYPE).define(\n                MEMBER_EXPRESSION,\n                b.optional(b.firstOf(NUMERIC_DATATYPE_CONSTRAINT, CHARACTER_DATATYPE_CONSTRAINT)))\n\n            b.rule(REF_DATATYPE).define(REF, MEMBER_EXPRESSION)\n\n            b.rule(JSON_DATATYPE).define(JSON)\n\n            b.rule(DATATYPE).define(b.firstOf(\n                    NUMERIC_DATATYPE,\n                    LOB_DATATYPE,\n                    CHARACTER_DATAYPE,\n                    BOOLEAN_DATATYPE,\n                    DATE_DATATYPE,\n                    ANCHORED_DATATYPE,\n                    REF_DATATYPE,\n                    JSON_DATATYPE,\n                    CUSTOM_DATATYPE))\n\n            b.rule(DATATYPE_NULL_CONSTRAINT).define(\n                b.firstOf(\n                    b.sequence(NOT, NULL),\n                    NULL\n                )\n            )\n        }\n\n        private fun createStatements(b: PlSqlGrammarBuilder) {\n            b.rule(HOST_AND_INDICATOR_VARIABLE).define(\n                b.firstOf(\n                    b.sequence(\n                        COLON, b.firstOf(\n                            b.sequence(IDENTIFIER_NAME, b.optional(INDICATOR), b.optional(COLON, IDENTIFIER_NAME)),\n                            INTEGER_LITERAL\n                        )\n                    ),\n                    QUESTION_MARK\n                )\n            )\n\n            b.rule(NULL_STATEMENT, NullStatement::class).define(NULL, SEMICOLON)\n\n            b.rule(EXCEPTION_HANDLER).define(\n                    WHEN,\n                    b.firstOf(OTHERS, OBJECT_REFERENCE),\n                    b.zeroOrMore(OR, b.firstOf(OTHERS, OBJECT_REFERENCE)),\n                    THEN, STATEMENTS)\n\n            b.rule(EXCEPTION_HANDLERS).define(EXCEPTION, b.oneOrMore(EXCEPTION_HANDLER))\n\n            b.rule(LABEL).define(LLABEL, IDENTIFIER_NAME, RLABEL)\n\n            b.rule(STATEMENTS_SECTION).define(\n                    BEGIN,\n                    STATEMENTS,\n                    b.optional(EXCEPTION_HANDLERS),\n                    END, b.optional(IDENTIFIER_NAME), SEMICOLON)\n\n            b.rule(BLOCK_STATEMENT).define(\n                    b.optional(LABEL),\n                    b.optional(DECLARE, b.optional(DECLARE_SECTION)),\n                    STATEMENTS_SECTION)\n\n            b.rule(ASSIGNMENT_STATEMENT).define(b.optional(LABEL), OBJECT_REFERENCE, ASSIGNMENT, EXPRESSION, SEMICOLON)\n\n            b.rule(ELSIF_CLAUSE, ElsifClause::class).define(ELSIF, EXPRESSION, THEN, STATEMENTS)\n\n            b.rule(ELSE_CLAUSE, ElseClause::class).define(ELSE, STATEMENTS)\n\n            b.rule(IF_STATEMENT, IfStatement::class).define(\n                    b.optional(LABEL),\n                    IF, EXPRESSION, THEN,\n                    STATEMENTS,\n                    b.zeroOrMore(ELSIF_CLAUSE),\n                    b.optional(ELSE_CLAUSE),\n                    END, IF, b.optional(IDENTIFIER_NAME), SEMICOLON)\n\n            b.rule(LOOP_STATEMENT).define(b.optional(LABEL), LOOP, STATEMENTS, END, LOOP, b.optional(IDENTIFIER_NAME), SEMICOLON)\n\n            b.rule(EXIT_STATEMENT).define(b.optional(LABEL), EXIT, b.optional(IDENTIFIER_NAME), b.optional(WHEN, EXPRESSION), SEMICOLON)\n\n            b.rule(CONTINUE_STATEMENT).define(b.optional(LABEL), CONTINUE, b.optional(IDENTIFIER_NAME), b.optional(WHEN, EXPRESSION), SEMICOLON)\n\n            b.rule(GOTO_STATEMENT).define(b.optional(LABEL), GOTO, b.optional(IDENTIFIER_NAME), SEMICOLON)\n\n            b.rule(ITERATOR).define(\n                ITERAND_DECLARATION,\n                b.optional(COMMA, ITERAND_DECLARATION),\n                IN, ITERATION_CTL_SEQ)\n\n            b.rule(ITERAND_DECLARATION).define(\n                IDENTIFIER_NAME,\n                b.optional(b.firstOf(MUTABLE, IMMUTABLE)),\n                b.optional(DATATYPE),\n                b.optional(DATATYPE_NULL_CONSTRAINT))\n\n            b.rule(ITERATION_CTL_SEQ).define(QUAL_ITERATION_CTL, b.zeroOrMore(COMMA, QUAL_ITERATION_CTL)).skip()\n\n            b.rule(QUAL_ITERATION_CTL).define(b.optional(REVERSE), ITERATION_CONTROL, PRED_CLAUSE_SEQ)\n\n            b.rule(PRED_CLAUSE_SEQ).define(b.optional(WHILE, EXPRESSION), b.optional(WHEN, EXPRESSION)).skip()\n\n            b.rule(ITERATION_CONTROL).define(b.firstOf(\n                STEPPED_CONTROL,\n                VALUES_OF_CONTROL,\n                INDICES_OF_CONTROL,\n                PAIRS_OF_CONTROL,\n                SINGLE_EXPRESSION_CONTROL,\n                DYNAMIC_SQL)).skip()\n\n            b.rule(STEPPED_CONTROL).define(EXPRESSION, RANGE, EXPRESSION, b.optional(BY, OBJECT_REFERENCE))\n\n            b.rule(SINGLE_EXPRESSION_CONTROL).define(b.optional(REPEAT), CONCATENATION_EXPRESSION)\n\n            b.rule(VALUES_OF_CONTROL).define(VALUES, OF, b.firstOf(OBJECT_REFERENCE, DYNAMIC_SQL))\n\n            b.rule(INDICES_OF_CONTROL).define(INDICES, OF, b.firstOf(OBJECT_REFERENCE, DYNAMIC_SQL))\n\n            b.rule(PAIRS_OF_CONTROL).define(PAIRS, OF, b.firstOf(OBJECT_REFERENCE, DYNAMIC_SQL))\n\n            b.rule(DYNAMIC_SQL).define(\n                LPARENTHESIS,\n                EXECUTE, IMMEDIATE, CONCATENATION_EXPRESSION,\n                b.optional(USING, UNNAMED_ACTUAL_PAMETER, b.zeroOrMore(COMMA, UNNAMED_ACTUAL_PAMETER)),\n                RPARENTHESIS)\n\n            b.rule(FOR_STATEMENT).define(\n                    b.optional(LABEL),\n                    FOR, ITERATOR, LOOP,\n                    STATEMENTS,\n                    END, LOOP, b.optional(IDENTIFIER_NAME), SEMICOLON)\n\n            b.rule(WHILE_STATEMENT).define(\n                    b.optional(LABEL),\n                    WHILE, EXPRESSION, LOOP,\n                    STATEMENTS,\n                    END, LOOP, b.optional(IDENTIFIER_NAME), SEMICOLON)\n\n            b.rule(FORALL_STATEMENT).define(\n                b.optional(LABEL),\n                FORALL, IDENTIFIER_NAME, IN,\n                b.firstOf(b.sequence(EXPRESSION, RANGE, EXPRESSION),\n                    b.sequence(VALUES, OF, IDENTIFIER_NAME),\n                    b.sequence(INDICES, OF, IDENTIFIER_NAME, b.optional(BETWEEN, AND_EXPRESSION))),\n                b.optional(SAVE, EXCEPTIONS),\n                b.firstOf(\n                    INSERT_STATEMENT,\n                    UPDATE_STATEMENT,\n                    DELETE_STATEMENT,\n                    MERGE_STATEMENT,\n                    EXECUTE_IMMEDIATE_STATEMENT))\n\n            b.rule(RETURN_STATEMENT).define(b.optional(LABEL), RETURN, b.optional(EXPRESSION), SEMICOLON)\n\n            b.rule(COMMIT_STATEMENT).define(b.optional(LABEL), COMMIT_EXPRESSION, SEMICOLON)\n\n            b.rule(ROLLBACK_STATEMENT).define(b.optional(LABEL), ROLLBACK_EXPRESSION, SEMICOLON)\n\n            b.rule(SAVEPOINT_STATEMENT).define(b.optional(LABEL), SAVEPOINT_EXPRESSION, SEMICOLON)\n\n            b.rule(RAISE_STATEMENT, RaiseStatement::class).define(b.optional(LABEL), RAISE, b.optional(MEMBER_EXPRESSION), SEMICOLON)\n\n            b.rule(SELECT_STATEMENT).define(b.optional(LABEL), SELECT_EXPRESSION, SEMICOLON)\n\n            b.rule(INSERT_STATEMENT).define(b.optional(LABEL), INSERT_EXPRESSION, SEMICOLON)\n\n            b.rule(UPDATE_STATEMENT).define(b.optional(LABEL), UPDATE_EXPRESSION, SEMICOLON)\n\n            b.rule(DELETE_STATEMENT).define(b.optional(LABEL), DELETE_EXPRESSION, SEMICOLON)\n\n            b.rule(MERGE_STATEMENT).define(b.optional(LABEL), MERGE_EXPRESSION, SEMICOLON)\n\n            b.rule(CALL_STATEMENT).define(b.optional(LABEL), OBJECT_REFERENCE, SEMICOLON)\n\n            b.rule(UNNAMED_ACTUAL_PAMETER).define(\n                    b.optional(b.firstOf(b.sequence(IN, b.optional(OUT)), OUT)),\n                    EXPRESSION)\n\n            b.rule(EXECUTE_IMMEDIATE_STATEMENT).define(\n                    b.optional(LABEL),\n                    b.optional(FORALL_STATEMENT),\n                    EXECUTE, IMMEDIATE, CONCATENATION_EXPRESSION,\n                    b.optional(INTO_CLAUSE),\n                    b.optional(USING, UNNAMED_ACTUAL_PAMETER, b.zeroOrMore(COMMA, UNNAMED_ACTUAL_PAMETER)),\n                    b.optional(RETURNING_INTO_CLAUSE),\n                    SEMICOLON)\n\n            b.rule(OPEN_STATEMENT).define(\n                    b.optional(LABEL),\n                    OPEN, MEMBER_EXPRESSION,\n                    b.optional(ARGUMENTS),\n                    SEMICOLON)\n\n            b.rule(OPEN_FOR_STATEMENT).define(\n                    b.optional(LABEL),\n                    OPEN, MEMBER_EXPRESSION, FOR, b.firstOf(SELECT_EXPRESSION, EXPRESSION),\n                    b.optional(USING, UNNAMED_ACTUAL_PAMETER, b.zeroOrMore(COMMA, UNNAMED_ACTUAL_PAMETER)),\n                    SEMICOLON)\n\n            b.rule(FETCH_STATEMENT).define(\n                    b.optional(LABEL),\n                    FETCH, MEMBER_EXPRESSION,\n                    INTO_CLAUSE, b.optional(LIMIT, EXPRESSION),\n                    SEMICOLON)\n\n            b.rule(CLOSE_STATEMENT).define(b.optional(LABEL), CLOSE, MEMBER_EXPRESSION, SEMICOLON)\n\n            b.rule(PIPE_ROW_STATEMENT).define(b.optional(LABEL), PIPE, ROW, LPARENTHESIS, EXPRESSION, RPARENTHESIS, SEMICOLON)\n\n            b.rule(CASE_STATEMENT).define(\n                    b.optional(LABEL),\n                    CASE, b.optional(EXPRESSION),\n                    b.oneOrMore(WHEN, EXPRESSION, THEN, STATEMENTS),\n                    b.optional(ELSE, STATEMENTS),\n                    END, CASE, b.optional(IDENTIFIER_NAME), SEMICOLON)\n\n            //https://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_10005.htm#SQLRF01705\n            b.rule(SET_TRANSACTION_STATEMENT).define(b.optional(LABEL), SET_TRANSACTION_EXPRESSION, SEMICOLON)\n\n            b.rule(INLINE_PRAGMA_STATEMENT).define(PRAGMA, INLINE,\n                    LPARENTHESIS, MEMBER_EXPRESSION, COMMA, STRING_LITERAL, RPARENTHESIS, SEMICOLON)\n\n            b.rule(STATEMENT).define(b.firstOf(NULL_STATEMENT,\n                    BLOCK_STATEMENT,\n                    ASSIGNMENT_STATEMENT,\n                    IF_STATEMENT,\n                    LOOP_STATEMENT,\n                    EXIT_STATEMENT,\n                    CONTINUE_STATEMENT,\n                    GOTO_STATEMENT,\n                    FOR_STATEMENT,\n                    WHILE_STATEMENT,\n                    RETURN_STATEMENT,\n                    COMMIT_STATEMENT,\n                    ROLLBACK_STATEMENT,\n                    SAVEPOINT_STATEMENT,\n                    RAISE_STATEMENT,\n                    FORALL_STATEMENT,\n                    SELECT_STATEMENT,\n                    INSERT_STATEMENT,\n                    UPDATE_STATEMENT,\n                    DELETE_STATEMENT,\n                    CALL_STATEMENT,\n                    EXECUTE_IMMEDIATE_STATEMENT,\n                    OPEN_STATEMENT,\n                    OPEN_FOR_STATEMENT,\n                    FETCH_STATEMENT,\n                    CLOSE_STATEMENT,\n                    PIPE_ROW_STATEMENT,\n                    CASE_STATEMENT,\n                    SET_TRANSACTION_STATEMENT,\n                    MERGE_STATEMENT,\n                    INLINE_PRAGMA_STATEMENT,\n                    COVERAGE_PRAGMA))\n\n            b.rule(STATEMENTS, Statements::class).define(b.oneOrMore(STATEMENT))\n        }\n\n        private fun createExpressions(b: PlSqlGrammarBuilder) {\n            // Reference: http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/expression.htm\n\n            b.rule(VARIABLE_NAME).define(b.firstOf(IDENTIFIER_NAME, HOST_AND_INDICATOR_VARIABLE))\n\n            b.rule(PRIMARY_EXPRESSION).define(\n                    b.firstOf(LITERAL, VARIABLE_NAME, SQL, MULTIPLICATION)).skip()\n\n            b.rule(BRACKED_EXPRESSION).define(b.firstOf(\n                    PRIMARY_EXPRESSION,\n                    b.sequence(LPARENTHESIS, EXPRESSION, RPARENTHESIS))).skipIfOneChild()\n\n            b.rule(MULTIPLE_VALUE_EXPRESSION).define(b.firstOf(\n                    BRACKED_EXPRESSION,\n                    b.sequence(LPARENTHESIS, EXPRESSION, b.oneOrMore(COMMA, EXPRESSION), RPARENTHESIS))).skipIfOneChild()\n\n            b.rule(MEMBER_EXPRESSION).define(\n                    MULTIPLE_VALUE_EXPRESSION,\n                    b.zeroOrMore(\n                            b.firstOf(DOT,\n                                    REMOTE,\n                                    b.sequence(MOD, b.nextNot(ROWTYPE), b.nextNot(TYPE))),\n                            b.firstOf(\n                                    IDENTIFIER_NAME,\n                                    COUNT,\n                                    ROWCOUNT,\n                                    BULK_ROWCOUNT,\n                                    FIRST,\n                                    LAST,\n                                    LIMIT,\n                                    NEXT,\n                                    PRIOR,\n                                    EXISTS,\n                                    FOUND,\n                                    NOTFOUND,\n                                    ISOPEN,\n                                    DELETE,\n                                    TRIM,\n                                    EXTEND,\n                                    NEXTVAL,\n                                    CURRVAL)\n                    )).skipIfOneChild()\n\n            b.rule(ARGUMENT).define(b.optional(IDENTIFIER_NAME, ASSOCIATION), b.optional(DISTINCT), EXPRESSION)\n\n            b.rule(ARGUMENTS).define(LPARENTHESIS, b.optional(ARGUMENT, b.zeroOrMore(COMMA, ARGUMENT)), RPARENTHESIS)\n\n            b.rule(METHOD_CALL).define(MEMBER_EXPRESSION, b.oneOrMore(ARGUMENTS))\n\n            b.rule(SEQUENCE_ITERATOR_CHOICE).define(FOR, ITERATOR, SEQUENCE, ASSOCIATION, EXPRESSION)\n\n            b.rule(POSITIONAL_CHOICE_OPTION).define(b.firstOf(\n                SEQUENCE_ITERATOR_CHOICE,\n                b.sequence(EXPRESSION, b.nextNot(b.firstOf(SINGLE_PIPE, ASSOCIATION))))).skip()\n\n            b.rule(POSITIONAL_CHOICE_LIST).define(\n                POSITIONAL_CHOICE_OPTION,\n                b.zeroOrMore(COMMA, POSITIONAL_CHOICE_OPTION)\n            )\n\n            b.rule(NAMED_CHOICE_LIST).define(\n                IDENTIFIER_NAME,\n                b.zeroOrMore(SINGLE_PIPE, IDENTIFIER_NAME),\n                ASSOCIATION, EXPRESSION)\n\n            b.rule(INDEXED_CHOICE_LIST).define(\n                EXPRESSION,\n                b.zeroOrMore(SINGLE_PIPE, EXPRESSION),\n                ASSOCIATION, EXPRESSION)\n\n            b.rule(BASIC_ITERATOR_CHOICE).define(\n                FOR, ITERATOR, ASSOCIATION, EXPRESSION)\n\n            b.rule(INDEX_ITERATOR_CHOICE).define(\n                FOR, ITERATOR, INDEX, EXPRESSION, ASSOCIATION, EXPRESSION)\n\n            b.rule(EXPLICIT_CHOICE_OPTION).define(\n                b.firstOf(NAMED_CHOICE_LIST, INDEXED_CHOICE_LIST, BASIC_ITERATOR_CHOICE, INDEX_ITERATOR_CHOICE)).skip()\n\n            b.rule(EXPLICIT_CHOICE_LIST).define(\n                EXPLICIT_CHOICE_OPTION, b.zeroOrMore(COMMA, EXPLICIT_CHOICE_OPTION))\n\n            b.rule(QUALIFIED_EXPRESSION).define(\n                MEMBER_EXPRESSION,\n                LPARENTHESIS,\n                b.optional(POSITIONAL_CHOICE_LIST),\n                b.optional(EXPLICIT_CHOICE_LIST),\n                RPARENTHESIS)\n\n            b.rule(CALL_EXPRESSION).define(b.firstOf(\n                    SingleRowSqlFunctionsGrammar.SINGLE_ROW_SQL_FUNCTION,\n                    AggregateSqlFunctionsGrammar.AGGREGATE_SQL_FUNCTION,\n                    METHOD_CALL,\n                    QUALIFIED_EXPRESSION)).skipIfOneChild()\n\n            b.rule(OUTER_JOIN_PLUS_SIGN).define(LPARENTHESIS, PLUS, RPARENTHESIS)\n\n            b.rule(OBJECT_REFERENCE).define(\n                    b.firstOf(CALL_EXPRESSION, MEMBER_EXPRESSION),\n                    b.zeroOrMore(DOT, b.firstOf(CALL_EXPRESSION, MEMBER_EXPRESSION)),\n                    b.optional(OUTER_JOIN_PLUS_SIGN)).skipIfOneChild()\n\n            b.rule(POSTFIX_EXPRESSION).define(OBJECT_REFERENCE,\n                    b.optional(b.firstOf(\n                            ANALYTIC_CLAUSE,\n                            b.sequence(KEEP_CLAUSE, b.optional(ANALYTIC_CLAUSE))))).skipIfOneChild()\n\n            b.rule(IN_EXPRESSION).define(CONCATENATION_EXPRESSION,\n                    b.optional(b.sequence(\n                            b.optional(NOT), IN,\n                            b.firstOf(\n                                    b.sequence(\n                                        LPARENTHESIS,\n                                        b.firstOf(\n                                            SELECT_EXPRESSION,\n                                            b.sequence(EXPRESSION, b.zeroOrMore(COMMA, EXPRESSION)),\n                                        ),\n                                        RPARENTHESIS),\n                                    EXPRESSION)))).skipIfOneChild()\n\n            b.rule(EXISTS_EXPRESSION).define(EXISTS, LPARENTHESIS, SELECT_EXPRESSION, RPARENTHESIS).skipIfOneChild()\n\n            b.rule(CASE_EXPRESSION).define(\n                    CASE, b.optional(EXPRESSION),\n                    b.oneOrMore(WHEN, EXPRESSION, THEN, EXPRESSION),\n                    b.optional(ELSE, EXPRESSION),\n                    END)\n\n            b.rule(AT_TIME_ZONE_EXPRESSION).define(AT, b.firstOf(LOCAL, b.sequence(TIME, ZONE, EXPRESSION)))\n\n            b.rule(NEW_OBJECT_EXPRESSION).define(NEW, OBJECT_REFERENCE, b.optional(ARGUMENTS))\n\n            //https://docs.oracle.com/cd/E11882_01/server.112/e41084/operators006.htm#SQLRF0032\n            b.rule(MULTISET_EXPRESSION).define(\n                    OBJECT_REFERENCE,\n                    b.oneOrMore(\n                            MULTISET,\n                            b.firstOf(EXCEPT, INTERSECT, UNION),\n                            b.optional(b.firstOf(ALL, DISTINCT)),\n                            OBJECT_REFERENCE))\n\n            b.rule(UNARY_EXPRESSION).define(b.firstOf(\n                    b.sequence(PLUS, UNARY_EXPRESSION),\n                    b.sequence(MINUS, UNARY_EXPRESSION),\n                    b.sequence(PRIOR, UNARY_EXPRESSION),\n                    b.sequence(CONNECT_BY_ROOT, UNARY_EXPRESSION),\n                    EXISTS_EXPRESSION,\n                    MULTISET_EXPRESSION,\n                    NEW_OBJECT_EXPRESSION,\n                    CASE_EXPRESSION,\n                    POSTFIX_EXPRESSION,\n                    b.sequence(LPARENTHESIS, SELECT_EXPRESSION, RPARENTHESIS)),\n                    b.optional(AT_TIME_ZONE_EXPRESSION)).skipIfOneChild()\n\n            b.rule(EXPONENTIATION_EXPRESSION).define(UNARY_EXPRESSION, b.zeroOrMore(EXPONENTIATION, UNARY_EXPRESSION)).skipIfOneChild()\n\n            b.rule(MULTIPLICATIVE_EXPRESSION).define(\n                EXPONENTIATION_EXPRESSION, b.zeroOrMore(\n                    b.firstOf(\n                        MULTIPLICATION,\n                        b.sequence(b.nextNot(EXECUTE_PLSQL_BUFFER), DIVISION),\n                        MOD_KEYWORD\n                    ), EXPONENTIATION_EXPRESSION\n                )\n            ).skipIfOneChild()\n\n            b.rule(ADDITIVE_EXPRESSION).define(MULTIPLICATIVE_EXPRESSION, b.zeroOrMore(b.firstOf(PLUS, MINUS), MULTIPLICATIVE_EXPRESSION)).skipIfOneChild()\n\n            b.rule(CONCATENATION_EXPRESSION).define(ADDITIVE_EXPRESSION, b.zeroOrMore(CONCATENATION_OPERATOR, ADDITIVE_EXPRESSION)).skipIfOneChild()\n\n            b.rule(COMPARISON_EXPRESSION).define(b.firstOf(\n                    ConditionsGrammar.CONDITION,\n                    IN_EXPRESSION)).skipIfOneChild()\n\n            b.rule(NOT_EXPRESSION).define(b.optional(NOT), COMPARISON_EXPRESSION).skipIfOneChild()\n            b.rule(AND_EXPRESSION).define(NOT_EXPRESSION, b.zeroOrMore(AND, NOT_EXPRESSION)).skipIfOneChild()\n            b.rule(OR_EXPRESSION).define(AND_EXPRESSION, b.zeroOrMore(OR, AND_EXPRESSION)).skipIfOneChild()\n\n            b.rule(BOOLEAN_EXPRESSION).define(OR_EXPRESSION).skip()\n\n            b.rule(EXPRESSION).define(BOOLEAN_EXPRESSION).skipIfOneChild()\n        }\n\n        private fun createDeclarations(b: PlSqlGrammarBuilder) {\n            b.rule(DEFAULT_VALUE_ASSIGNMENT).define(b.firstOf(ASSIGNMENT, DEFAULT), EXPRESSION)\n\n            b.rule(PARAMETER_DECLARATION).define(\n                    IDENTIFIER_NAME,\n                    b.optional(IN),\n                    b.firstOf(\n                            b.sequence(DATATYPE, b.optional(DEFAULT_VALUE_ASSIGNMENT)),\n                            b.sequence(OUT, b.optional(NOCOPY), DATATYPE))\n            )\n\n            b.rule(PARAMETER_DECLARATIONS).define(LPARENTHESIS, b.oneOrMore(PARAMETER_DECLARATION, b.optional(COMMA)), RPARENTHESIS)\n\n            b.rule(JAVA_DECLARATION).define(LANGUAGE, JAVA, NAME, STRING_LITERAL)\n\n            b.rule(C_DECLARATION).define(\n                    b.firstOf(b.sequence(LANGUAGE, \"C\"), EXTERNAL),\n                    b.optional(NAME, IDENTIFIER_NAME), LIBRARY, IDENTIFIER_NAME, b.optional(NAME, IDENTIFIER_NAME),\n                    b.optional(AGENT, IN, LPARENTHESIS, b.oneOrMore(IDENTIFIER_NAME, b.optional(COMMA)), RPARENTHESIS),\n                    b.optional(WITH, CONTEXT),\n                    b.optional(PARAMETERS, LPARENTHESIS, b.oneOrMore(EXTERNAL_PARAMETER, b.optional(COMMA)), RPARENTHESIS))\n\n            b.rule(EXTERNAL_PARAMETER_PROPERTY).define(\n                    b.sequence(INDICATOR, b.optional(b.firstOf(STRUCT, TDO))),\n                    LENGTH,\n                    DURATION,\n                    MAXLEN,\n                    CHARSETID,\n                    CHARSETFORM)\n\n            b.rule(EXTERNAL_PARAMETER).define(b.firstOf(\n                    CONTEXT,\n                    b.sequence(SELF, b.firstOf(TDO, EXTERNAL_PARAMETER_PROPERTY)),\n                    b.sequence(\n                            b.firstOf(RETURN, IDENTIFIER_NAME),\n                            b.optional(EXTERNAL_PARAMETER_PROPERTY),\n                            b.optional(BY, REFERENCE),\n                            b.optional(DATATYPE))))\n\n            b.rule(CALL_SPECIFICATION).define(b.firstOf(JAVA_DECLARATION, C_DECLARATION), SEMICOLON)\n\n            // http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/procedure.htm\n            b.rule(PROCEDURE_DECLARATION).define(\n                    PROCEDURE, IDENTIFIER_NAME,\n                    b.optional(PARAMETER_DECLARATIONS),\n                    b.optional(b.firstOf(\n                            SEMICOLON,\n                            b.sequence(b.firstOf(IS, AS),\n                                    b.firstOf(\n                                            b.sequence(b.optional(DECLARE_SECTION), STATEMENTS_SECTION),\n                                            CALL_SPECIFICATION)))\n                    ))\n\n            // http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/function.htm\n            b.rule(FUNCTION_DECLARATION).define(\n                    FUNCTION, IDENTIFIER_NAME,\n                    b.optional(PARAMETER_DECLARATIONS),\n                    RETURN, DATATYPE, b.zeroOrMore(b.firstOf(DETERMINISTIC, PIPELINED, PARALLEL_ENABLE)),\n                    b.optional(RESULT_CACHE, b.optional(RELIES_ON, LPARENTHESIS, b.oneOrMore(OBJECT_REFERENCE, b.optional(COMMA)), RPARENTHESIS)),\n                    b.optional(b.firstOf(\n                            SEMICOLON,\n                            b.sequence(b.firstOf(IS, AS),\n                                    b.firstOf(\n                                            b.sequence(b.optional(DECLARE_SECTION), STATEMENTS_SECTION),\n                                            CALL_SPECIFICATION)))\n                    ))\n\n            b.rule(VARIABLE_DECLARATION).define(IDENTIFIER_NAME,\n                b.optional(CONSTANT),\n                b.firstOf(\n                    b.sequence(\n                        DATATYPE,\n                        b.optional(DATATYPE_NULL_CONSTRAINT),\n                        b.optional(DEFAULT_VALUE_ASSIGNMENT)),\n                    EXCEPTION),\n                SEMICOLON)\n\n            b.rule(EXCEPTION_DECLARATION).define(IDENTIFIER_NAME, EXCEPTION, SEMICOLON)\n\n            b.rule(CUSTOM_SUBTYPE).define(\n                SUBTYPE, IDENTIFIER_NAME, IS, DATATYPE,\n                b.optional(DATATYPE_NULL_CONSTRAINT),\n                b.optional(RANGE_KEYWORD, NUMERIC_LITERAL, RANGE, NUMERIC_LITERAL),\n                SEMICOLON\n            )\n\n            b.rule(CURSOR_PARAMETER_DECLARATION).define(\n                    IDENTIFIER_NAME,\n                    b.optional(IN),\n                    DATATYPE, b.optional(DEFAULT_VALUE_ASSIGNMENT))\n\n            b.rule(CURSOR_PARAMETER_DECLARATIONS).define(\n                LPARENTHESIS, b.oneOrMore(CURSOR_PARAMETER_DECLARATION, b.optional(COMMA)), RPARENTHESIS)\n\n            b.rule(CURSOR_DECLARATION).define(\n                    CURSOR, IDENTIFIER_NAME,\n                    b.optional(CURSOR_PARAMETER_DECLARATIONS),\n                    b.optional(RETURN, DATATYPE),\n                    b.optional(IS, SELECT_EXPRESSION), SEMICOLON)\n\n            b.rule(RECORD_FIELD_DECLARATION).define(\n                IDENTIFIER_NAME, DATATYPE,\n                b.optional(DATATYPE_NULL_CONSTRAINT),\n                b.optional(DEFAULT_VALUE_ASSIGNMENT)\n            )\n\n            b.rule(RECORD_DECLARATION).define(\n                    TYPE, IDENTIFIER_NAME, IS, RECORD,\n                    LPARENTHESIS, RECORD_FIELD_DECLARATION, b.zeroOrMore(COMMA, RECORD_FIELD_DECLARATION), RPARENTHESIS,\n                    SEMICOLON)\n\n            b.rule(NESTED_TABLE_DEFINITION).define(TABLE, OF, DATATYPE, b.optional(DATATYPE_NULL_CONSTRAINT))\n\n            b.rule(TABLE_OF_DECLARATION).define(\n                    TYPE, IDENTIFIER_NAME, IS, NESTED_TABLE_DEFINITION,\n                    b.optional(INDEX, BY, DATATYPE, b.optional(DATATYPE_NULL_CONSTRAINT)),\n                    SEMICOLON)\n\n            b.rule(VARRAY_TYPE_DEFINITION).define(\n                b.firstOf(VARRAY, b.sequence(b.optional(VARYING), ARRAY)),\n                LPARENTHESIS, INTEGER_LITERAL, RPARENTHESIS,\n                OF, DATATYPE, b.optional(DATATYPE_NULL_CONSTRAINT)\n            )\n\n            b.rule(VARRAY_DECLARATION).define(\n                    TYPE, IDENTIFIER_NAME, IS, VARRAY_TYPE_DEFINITION, SEMICOLON)\n\n            b.rule(REF_CURSOR_DECLARATION).define(TYPE, IDENTIFIER_NAME, IS, REF, CURSOR, b.optional(RETURN, DATATYPE), SEMICOLON)\n\n            b.rule(AUTONOMOUS_TRANSACTION_PRAGMA).define(PRAGMA, AUTONOMOUS_TRANSACTION, SEMICOLON)\n\n            b.rule(EXCEPTION_INIT_PRAGMA).define(PRAGMA, EXCEPTION_INIT, LPARENTHESIS, EXPRESSION, COMMA, EXPRESSION, RPARENTHESIS, SEMICOLON)\n\n            b.rule(SERIALLY_REUSABLE_PRAGMA).define(PRAGMA, SERIALLY_REUSABLE, SEMICOLON)\n\n            b.rule(INTERFACE_PRAGMA).define(\n                    PRAGMA, INTERFACE,\n                    LPARENTHESIS, IDENTIFIER_NAME, COMMA, IDENTIFIER_NAME, COMMA, INTEGER_LITERAL, RPARENTHESIS, SEMICOLON)\n\n            b.rule(RESTRICT_REFERENCES_PRAGMA).define(\n                    PRAGMA, RESTRICT_REFERENCES, LPARENTHESIS, b.oneOrMore(b.anyTokenButNot(RPARENTHESIS)), RPARENTHESIS, SEMICOLON)\n\n            b.rule(UDF_PRAGMA).define(PRAGMA, UDF, SEMICOLON)\n\n            b.rule(DEPRECATE_PRAGMA).define(PRAGMA, DEPRECATE, LPARENTHESIS, EXPRESSION, b.optional(COMMA, STRING_LITERAL), RPARENTHESIS)\n\n            b.rule(SUPPRESSES_WARNING_6009_PRAGMA)\n                .define(PRAGMA, SUPPRESSES_WARNING_6009, LPARENTHESIS, IDENTIFIER_NAME, RPARENTHESIS)\n\n            b.rule(COVERAGE_PRAGMA)\n                .define(PRAGMA, COVERAGE, LPARENTHESIS, STRING_LITERAL, RPARENTHESIS, SEMICOLON)\n\n            b.rule(PRAGMA_DECLARATION).define(\n                b.firstOf(\n                    EXCEPTION_INIT_PRAGMA,\n                    AUTONOMOUS_TRANSACTION_PRAGMA,\n                    SERIALLY_REUSABLE_PRAGMA,\n                    INTERFACE_PRAGMA,\n                    RESTRICT_REFERENCES_PRAGMA,\n                    UDF_PRAGMA,\n                    b.sequence(DEPRECATE_PRAGMA, SEMICOLON),\n                    b.sequence(SUPPRESSES_WARNING_6009_PRAGMA, SEMICOLON),\n                    COVERAGE_PRAGMA\n                )\n            )\n\n            b.rule(DECLARE_SECTION).define(b.oneOrMore(b.firstOf(\n                    PRAGMA_DECLARATION,\n                    EXCEPTION_DECLARATION,\n                    VARIABLE_DECLARATION,\n                    PROCEDURE_DECLARATION,\n                    FUNCTION_DECLARATION,\n                    CUSTOM_SUBTYPE,\n                    CURSOR_DECLARATION,\n                    RECORD_DECLARATION,\n                    TABLE_OF_DECLARATION,\n                    VARRAY_DECLARATION,\n                    REF_CURSOR_DECLARATION)))\n        }\n\n        private fun createTrigger(b: PlSqlGrammarBuilder) {\n            b.rule(CREATE_TRIGGER).define(\n                    CREATE, b.optional(OR, REPLACE),\n                    b.optional(b.firstOf(EDITIONABLE, NONEDITIONABLE)),\n                    TRIGGER, UNIT_NAME,\n                    b.firstOf(SIMPLE_DML_TRIGGER, INSTEAD_OF_DML_TRIGGER, COMPOUND_DML_TRIGGER, SYSTEM_TRIGGER)\n            )\n\n            b.rule(SIMPLE_DML_TRIGGER).define(\n                    b.firstOf(BEFORE, AFTER),\n                    DML_EVENT_CLAUSE, b.zeroOrMore(OR, DML_EVENT_CLAUSE), ON, UNIT_NAME,\n                    b.optional(REFERENCING_CLAUSE),\n                    b.optional(FOR, EACH, ROW),\n                    b.optional(TRIGGER_EDITION_CLAUSE),\n                    b.optional(TRIGGER_ORDERING_CLAUSE),\n                    b.optional(b.firstOf(ENABLE, DISABLE)),\n                    b.optional(WHEN, LPARENTHESIS, EXPRESSION, RPARENTHESIS),\n                    b.optional(DECLARE, b.optional(DECLARE_SECTION)), STATEMENTS_SECTION\n            )\n\n            b.rule(INSTEAD_OF_DML_TRIGGER).define(\n                    INSTEAD, OF,\n                    b.firstOf(\n                            DELETE,\n                            INSERT,\n                            UPDATE),\n                    b.zeroOrMore(OR, b.firstOf(\n                            DELETE,\n                            INSERT,\n                            UPDATE)),\n                    ON,\n                    b.optional(NESTED, TABLE, IDENTIFIER_NAME, OF),\n                    UNIT_NAME,\n                    b.optional(REFERENCING_CLAUSE),\n                    b.optional(FOR, EACH, ROW),\n                    b.optional(TRIGGER_EDITION_CLAUSE),\n                    b.optional(TRIGGER_ORDERING_CLAUSE),\n                    b.optional(b.firstOf(ENABLE, DISABLE)),\n                    b.optional(DECLARE, b.optional(DECLARE_SECTION)), STATEMENTS_SECTION\n            )\n\n            b.rule(COMPOUND_DML_TRIGGER).define(\n                    FOR, DML_EVENT_CLAUSE, b.zeroOrMore(OR, DML_EVENT_CLAUSE), ON, UNIT_NAME,\n                    b.optional(REFERENCING_CLAUSE),\n                    b.optional(TRIGGER_EDITION_CLAUSE),\n                    b.optional(TRIGGER_ORDERING_CLAUSE),\n                    b.optional(b.firstOf(ENABLE, DISABLE)),\n                    b.optional(WHEN, LPARENTHESIS, EXPRESSION, RPARENTHESIS),\n                    COMPOUND_TRIGGER_BLOCK\n            )\n\n            b.rule(SYSTEM_TRIGGER).define(\n                    b.firstOf(\n                            b.sequence(b.firstOf(BEFORE, AFTER, b.sequence(INSTEAD, OF)),\n                                    DDL_EVENT, b.zeroOrMore(OR, DDL_EVENT)),\n                            b.sequence(DATABASE_EVENT, b.zeroOrMore(OR, DATABASE_EVENT))),\n                    ON,\n                    b.firstOf(\n                            b.sequence(b.optional(IDENTIFIER_NAME, DOT), SCHEMA),\n                            b.sequence(b.optional(PLUGGABLE), DATABASE)),\n                    b.optional(TRIGGER_ORDERING_CLAUSE),\n                    b.optional(b.firstOf(ENABLE, DISABLE)),\n                    b.optional(DECLARE, b.optional(DECLARE_SECTION)), STATEMENTS_SECTION\n            )\n\n            b.rule(DML_EVENT_CLAUSE).define(\n                    b.firstOf(\n                            DELETE,\n                            INSERT,\n                            UPDATE),\n                    b.optional(OF, IDENTIFIER_NAME, b.zeroOrMore(COMMA, IDENTIFIER_NAME))\n            )\n\n            b.rule(REFERENCING_CLAUSE).define(\n                    REFERENCING,\n                    b.zeroOrMore(\n                            b.firstOf(\n                                    b.sequence(OLD, b.optional(AS), IDENTIFIER_NAME),\n                                    b.sequence(NEW, b.optional(AS), IDENTIFIER_NAME),\n                                    b.sequence(PARENT, b.optional(AS), IDENTIFIER_NAME)\n                            )))\n\n            b.rule(TRIGGER_EDITION_CLAUSE).define(\n                    b.optional(b.firstOf(FORWARD, REVERSE)),\n                    CROSSEDITION)\n\n            b.rule(TRIGGER_ORDERING_CLAUSE).define(\n                    b.firstOf(FOLLOWS, PRECEDES),\n                    UNIT_NAME, b.zeroOrMore(COMMA, UNIT_NAME))\n\n            b.rule(COMPOUND_TRIGGER_BLOCK).define(\n                    COMPOUND, TRIGGER,\n                    b.optional(DECLARE_SECTION),\n                    b.oneOrMore(TIMING_POINT_SECTION),\n                    END, UNIT_NAME, SEMICOLON)\n\n            b.rule(TIMING_POINT_SECTION).define(\n                    TIMING_POINT, IS, BEGIN, TPS_BODY, END, TIMING_POINT, SEMICOLON)\n\n            b.rule(TIMING_POINT).define(\n                    b.firstOf(\n                            b.sequence(BEFORE, STATEMENT_KEYWORD),\n                            b.sequence(BEFORE, EACH, ROW),\n                            b.sequence(AFTER, STATEMENT_KEYWORD),\n                            b.sequence(AFTER, EACH, ROW),\n                            b.sequence(INSTEAD, OF, EACH, ROW)\n                    ))\n\n            b.rule(TPS_BODY).define(\n                    b.oneOrMore(STATEMENT),\n                    b.optional(EXCEPTION_HANDLERS))\n\n            b.rule(DDL_EVENT).define(\n                    b.firstOf(\n                            ALTER,\n                            ANALYZE,\n                            b.sequence(ASSOCIATE, STATISTICS),\n                            AUDIT,\n                            COMMENT,\n                            CREATE,\n                            b.sequence(DISASSOCIATE, STATISTICS),\n                            DROP,\n                            GRANT,\n                            NOAUDIT,\n                            RENAME,\n                            REVOKE,\n                            TRUNCATE,\n                            DDL)\n            )\n\n            b.rule(DATABASE_EVENT).define(\n                    b.firstOf(\n                            b.sequence(AFTER, STARTUP),\n                            b.sequence(BEFORE, SHUTDOWN),\n                            b.sequence(AFTER, DB_ROLE_CHANGE),\n                            b.sequence(AFTER, SERVERERROR),\n                            b.sequence(AFTER, LOGON),\n                            b.sequence(BEFORE, LOGOFF),\n                            b.sequence(AFTER, SUSPEND),\n                            b.sequence(AFTER, CLONE),\n                            b.sequence(BEFORE, UNPLUG),\n                            b.sequence(b.firstOf(BEFORE, AFTER), SET, CONTAINER))\n            )\n        }\n\n        private fun createProgramUnits(b: PlSqlGrammarBuilder) {\n            b.rule(EXECUTE_PLSQL_BUFFER).define(ExecuteBufferExpression, b.next(b.firstOf(VALID_INPUT, EOF)))\n\n            b.rule(UNIT_NAME).define(b.optional(IDENTIFIER_NAME, DOT), IDENTIFIER_NAME)\n\n            // https://docs.oracle.com/en/database/oracle/oracle-database/18/lnpls/CREATE-PROCEDURE-statement.html\n            b.rule(CREATE_PROCEDURE).define(\n                    CREATE, b.optional(OR, REPLACE), b.optional(b.firstOf(EDITIONABLE, NONEDITIONABLE)),\n                    PROCEDURE, UNIT_NAME, b.optional(TIMESTAMP, STRING_LITERAL),\n                    b.optional(PARAMETER_DECLARATIONS),\n                    b.optional(SHARING, EQUALS, b.firstOf(METADATA, NONE)),\n                    b.zeroOrMore(b.firstOf(\n                            b.sequence(AUTHID, b.firstOf(CURRENT_USER, DEFINER)),\n                            b.sequence(DEFAULT, COLLATION, USING_NLS_COMP),\n                            b.sequence(ACCESSIBLE, BY, LPARENTHESIS,\n                                    b.firstOf(FUNCTION, PROCEDURE, PACKAGE, TRIGGER, TYPE),\n                                    UNIT_NAME,\n                                    RPARENTHESIS))\n                    ),\n                    b.firstOf(IS, AS),\n                    b.firstOf(\n                            b.sequence(b.optional(DECLARE_SECTION), STATEMENTS_SECTION),\n                            CALL_SPECIFICATION)\n            )\n\n            // https://docs.oracle.com/en/database/oracle/oracle-database/18/lnpls/CREATE-FUNCTION-statement.html\n            b.rule(CREATE_FUNCTION).define(\n                    CREATE, b.optional(OR, REPLACE), b.optional(b.firstOf(EDITIONABLE, NONEDITIONABLE)),\n                    FUNCTION, UNIT_NAME, b.optional(TIMESTAMP, STRING_LITERAL),\n                    b.optional(PARAMETER_DECLARATIONS),\n                    RETURN, DATATYPE,\n                    b.optional(SHARING, EQUALS, b.firstOf(METADATA, NONE)),\n                    b.zeroOrMore(b.firstOf(\n                            DETERMINISTIC,\n                            PIPELINED,\n                            PARALLEL_ENABLE,\n                            b.sequence(\n                                    RESULT_CACHE,\n                                    b.optional(RELIES_ON, LPARENTHESIS, b.oneOrMore(OBJECT_REFERENCE, b.optional(COMMA)), RPARENTHESIS)),\n                            b.sequence(AUTHID, b.firstOf(CURRENT_USER, DEFINER)),\n                            b.sequence(DEFAULT, COLLATION, USING_NLS_COMP),\n                            b.sequence(ACCESSIBLE, BY, LPARENTHESIS,\n                                    b.firstOf(FUNCTION, PROCEDURE, PACKAGE, TRIGGER, TYPE),\n                                    UNIT_NAME,\n                                    RPARENTHESIS))),\n                    b.firstOf(\n                            b.sequence(\n                                    b.firstOf(IS, AS),\n                                    b.firstOf(\n                                            b.sequence(b.optional(DECLARE_SECTION), STATEMENTS_SECTION),\n                                            CALL_SPECIFICATION)),\n                            b.sequence(AGGREGATE, USING, OBJECT_REFERENCE, SEMICOLON))\n            )\n\n            // https://docs.oracle.com/en/database/oracle/oracle-database/18/lnpls/CREATE-PACKAGE-statement.html\n            b.rule(CREATE_PACKAGE).define(\n                    b.optional(CREATE), b.optional(OR, REPLACE), b.optional(b.firstOf(EDITIONABLE, NONEDITIONABLE)),\n                    PACKAGE, UNIT_NAME, b.optional(TIMESTAMP, STRING_LITERAL),\n                    b.optional(SHARING, EQUALS, b.firstOf(METADATA, NONE)),\n                    b.zeroOrMore(b.firstOf(\n                            b.sequence(AUTHID, b.firstOf(CURRENT_USER, DEFINER)),\n                            b.sequence(DEFAULT, COLLATION, USING_NLS_COMP),\n                            b.sequence(ACCESSIBLE, BY, LPARENTHESIS,\n                                    b.firstOf(FUNCTION, PROCEDURE, PACKAGE, TRIGGER, TYPE),\n                                    UNIT_NAME,\n                                    RPARENTHESIS))),\n                    b.firstOf(IS, AS),\n                    b.optional(DECLARE_SECTION),\n                    END, b.optional(IDENTIFIER_NAME), SEMICOLON)\n\n            // https://docs.oracle.com/en/database/oracle/oracle-database/18/lnpls/CREATE-PACKAGE-BODY-statement.html\n            b.rule(CREATE_PACKAGE_BODY).define(\n                    b.optional(CREATE), b.optional(OR, REPLACE), b.optional(b.firstOf(EDITIONABLE, NONEDITIONABLE)),\n                    PACKAGE, BODY, UNIT_NAME, b.optional(TIMESTAMP, STRING_LITERAL),\n                    b.firstOf(IS, AS),\n                    b.optional(DECLARE_SECTION),\n                    b.firstOf(\n                            STATEMENTS_SECTION,\n                            b.sequence(END, b.optional(IDENTIFIER_NAME), SEMICOLON)))\n\n            b.rule(VIEW_RESTRICTION_CLAUSE).define(\n                    WITH, b.firstOf(\n                    b.sequence(READ, ONLY),\n                    b.sequence(CHECK, OPTION, b.optional(CONSTRAINT, IDENTIFIER_NAME))\n            )\n            )\n\n            // https://docs.oracle.com/en/database/oracle/oracle-database/18/sqlrf/CREATE-VIEW.html\n            b.rule(CREATE_VIEW).define(\n                    CREATE, b.optional(\n                    b.firstOf(\n                            b.sequence(MATERIALIZED, VIEW, UNIT_NAME,\n                                    b.zeroOrMore(\n                                            b.firstOf(\n                                                    b.sequence(PCTFREE, INTEGER_LITERAL),\n                                                    b.sequence(PCTUSED, INTEGER_LITERAL),\n                                                    b.sequence(INITRANS, INTEGER_LITERAL),\n                                                    b.sequence(TABLESPACE, IDENTIFIER_NAME)\n                                            )),\n                                    b.optional(b.sequence(b.optional(NO), REFRESH, COMPLETE, b.optional(START, WITH, EXPRESSION, NEXT, EXPRESSION)))),\n                            b.sequence(b.optional(b.sequence(OR, REPLACE)), b.optional(b.firstOf(EDITIONABLE, NONEDITIONABLE)), b.optional(b.optional(NO), FORCE), VIEW, UNIT_NAME))),\n                    b.optional(LPARENTHESIS, IDENTIFIER_NAME, b.zeroOrMore(COMMA, IDENTIFIER_NAME), RPARENTHESIS),\n                    AS,\n                    SELECT_EXPRESSION,\n                    b.optional(VIEW_RESTRICTION_CLAUSE),\n                    b.optional(ORDER_BY_CLAUSE),\n                    b.optional(SEMICOLON))\n\n            b.rule(TYPE_ATTRIBUTE).define(IDENTIFIER_NAME, DATATYPE, b.optional(DATATYPE_NULL_CONSTRAINT))\n\n            b.rule(INHERITANCE_CLAUSE).define(b.oneOrMore(b.optional(NOT), b.firstOf(OVERRIDING, FINAL, INSTANTIABLE)))\n\n            b.rule(TYPE_SUBPROGRAM).define(\n                    b.optional(INHERITANCE_CLAUSE),\n                    b.firstOf(MEMBER, STATIC),\n                    b.firstOf(PROCEDURE_DECLARATION, FUNCTION_DECLARATION))\n\n            b.rule(TYPE_CONSTRUCTOR).define(\n                    b.optional(FINAL),\n                    b.optional(INSTANTIABLE),\n                    CONSTRUCTOR, FUNCTION, IDENTIFIER_NAME,\n                    b.optional(\n                            LPARENTHESIS,\n                            b.optional(SELF, IN, OUT, DATATYPE, COMMA),\n                            b.oneOrMore(PARAMETER_DECLARATION, b.optional(COMMA)),\n                            RPARENTHESIS),\n                    RETURN, SELF, AS, RESULT,\n                    b.optional(b.firstOf(IS, AS), b.optional(DECLARE_SECTION), STATEMENTS_SECTION))\n\n            b.rule(MAP_ORDER_FUNCTION).define(\n                    b.firstOf(MAP, ORDER),\n                    MEMBER, FUNCTION_DECLARATION)\n\n            b.rule(TYPE_ELEMENT_SPEC).define(\n                    b.optional(INHERITANCE_CLAUSE),\n                    b.firstOf(TYPE_SUBPROGRAM, TYPE_CONSTRUCTOR, MAP_ORDER_FUNCTION))\n\n            b.rule(OBJECT_TYPE_DEFINITION).define(\n                b.firstOf(\n                    b.sequence(b.firstOf(IS, AS), OBJECT),\n                    b.sequence(UNDER, UNIT_NAME)\n                ),\n                LPARENTHESIS,\n                b.optional(b.firstOf(DEPRECATE_PRAGMA, SUPPRESSES_WARNING_6009_PRAGMA), COMMA),\n                b.oneOrMore(\n                    b.firstOf(TYPE_ELEMENT_SPEC, TYPE_ATTRIBUTE),\n                    b.optional(COMMA),\n                    b.optional(b.firstOf(DEPRECATE_PRAGMA, SUPPRESSES_WARNING_6009_PRAGMA), b.optional(COMMA))\n                ),\n                RPARENTHESIS,\n                b.zeroOrMore(b.optional(NOT), b.firstOf(FINAL, INSTANTIABLE))\n            )\n\n            b.rule(CREATE_TYPE).define(\n                    CREATE, b.optional(OR, REPLACE), b.optional(b.firstOf(EDITIONABLE, NONEDITIONABLE)),\n                    TYPE, UNIT_NAME,\n                    b.optional(FORCE),\n                    b.optional(SHARING, EQUALS, b.firstOf(METADATA, NONE)),\n                    b.zeroOrMore(b.firstOf(\n                            b.sequence(AUTHID, b.firstOf(CURRENT_USER, DEFINER)),\n                            b.sequence(DEFAULT, COLLATION, USING_NLS_COMP),\n                            b.sequence(ACCESSIBLE, BY, LPARENTHESIS,\n                                    b.firstOf(FUNCTION, PROCEDURE, PACKAGE, TRIGGER, TYPE),\n                                    UNIT_NAME,\n                                    RPARENTHESIS))),\n                    b.optional(b.firstOf(\n                            OBJECT_TYPE_DEFINITION,\n                            b.sequence(\n                                    b.firstOf(IS, AS),\n                                    b.firstOf(\n                                            VARRAY_TYPE_DEFINITION,\n                                            NESTED_TABLE_DEFINITION)))),\n                    b.optional(SEMICOLON))\n\n            b.rule(CREATE_TYPE_BODY).define(\n                    CREATE, b.optional(OR, REPLACE), b.optional(b.firstOf(EDITIONABLE, NONEDITIONABLE)),\n                    TYPE, BODY, UNIT_NAME,\n                    b.firstOf(IS, AS),\n                    b.oneOrMore(b.firstOf(TYPE_SUBPROGRAM, TYPE_CONSTRUCTOR, MAP_ORDER_FUNCTION), b.optional(COMMA)),\n                    END, b.optional(SEMICOLON))\n\n            b.rule(ANONYMOUS_BLOCK).define(BLOCK_STATEMENT)\n\n            b.rule(COMPILATION_UNIT).define(b.firstOf(\n                    ANONYMOUS_BLOCK,\n                    CREATE_PROCEDURE,\n                    CREATE_FUNCTION,\n                    CREATE_PACKAGE,\n                    CREATE_PACKAGE_BODY,\n                    CREATE_VIEW,\n                    CREATE_TRIGGER,\n                    CREATE_TYPE_BODY,\n                    CREATE_TYPE,\n                    PROCEDURE_DECLARATION,\n                    FUNCTION_DECLARATION))\n        }\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/PlSqlKeyword.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.flr.api.TokenType\n\nenum class PlSqlKeyword(override val value: String, val isReserved: Boolean = false) : TokenType {\n    ALL(\"all\", true),\n    ALTER(\"alter\", true),\n    AND(\"and\", true),\n    ANY(\"any\", true),\n    AS(\"as\", true),\n    ASC(\"asc\", true),\n    BEGIN(\"begin\", true),\n    BETWEEN(\"between\", true),\n    BY(\"by\", true),\n    CHAR(\"char\"),\n    CHECK(\"check\", true),\n    CLUSTER(\"cluster\", true),\n    COMPRESS(\"compress\", true),\n    CONNECT(\"connect\", true),\n    CREATE(\"create\", true),\n    DECLARE(\"declare\", true),\n    DEFAULT(\"default\", true),\n    DESC(\"desc\", true),\n    DISTINCT(\"distinct\", true),\n    DROP(\"drop\", true),\n    ELSE(\"else\", true),\n    END(\"end\", true),\n    EXCEPT(\"except\"),\n    EXCLUSIVE(\"exclusive\", true),\n    FETCH(\"fetch\", true),\n    FLOAT(\"float\"),\n    FOR(\"for\", true),\n    FROM(\"from\", true),\n    GRANT(\"grant\", true),\n    GROUP(\"group\", true),\n    HAVING(\"having\", true),\n    IDENTIFIED(\"identified\", true),\n    IN(\"in\", true),\n    INDEX(\"index\", true),\n    INSERT(\"insert\", true),\n    INTEGER(\"integer\"),\n    INTERSECT(\"intersect\", true),\n    INTO(\"into\", true),\n    IS(\"is\", true),\n    LIKE(\"like\", true),\n    LOCK(\"lock\", true),\n    LONG(\"long\"),\n    MINUS_KEYWORD(\"minus\", true),\n    NOCOMPRESS(\"nocompress\", true),\n    NOT(\"not\", true),\n    NOWAIT(\"nowait\", true),\n    NULL(\"null\", true),\n    OF(\"of\", true),\n    ON(\"on\", true),\n    OPTION(\"option\", true),\n    OR(\"or\", true),\n    ORDER(\"order\", true),\n    OUT(\"out\", true),\n    PCTFREE(\"pctfree\"),\n    PRIOR(\"prior\"),\n    PROCEDURE(\"procedure\", true),\n    PUBLIC(\"public\", true),\n    RAW(\"raw\"),\n    RESOURCE(\"resource\", true),\n    REVOKE(\"revoke\", true),\n    SELECT(\"select\", true),\n    SHARE(\"share\", true),\n    SIZE(\"size\", true),\n    SMALLINT(\"smallint\"),\n    START(\"start\", true),\n    SYNONYM(\"synonym\"),\n    TABLE(\"table\", true),\n    THEN(\"then\", true),\n    TO(\"to\", true),\n    TRIGGER(\"trigger\", true),\n    UNION(\"union\", true),\n    UNIQUE(\"unique\", true),\n    UPDATE(\"update\", true),\n    VALUES(\"values\", true),\n    VIEW(\"view\", true),\n    WHEN(\"when\", true),\n    WHERE(\"where\", true),\n    WITH(\"with\", true),\n    A(\"a\"),\n    ABSENT(\"absent\"),\n    ACCESSIBLE(\"accessible\"),\n    ADD(\"add\"),\n    ADMIN(\"admin\"),\n    AFTER(\"after\"),\n    AGENT(\"agent\"),\n    AGGREGATE(\"aggregate\"),\n    ALLOW(\"allow\"),\n    ANALYZE(\"analyze\"),\n    ANY_CS(\"any_cs\"),\n    APPEND(\"append\"),\n    ARRAY(\"array\"),\n    ARROW(\"arrow\"),\n    ASCII(\"ascii\"),\n    ASSOCIATE(\"associate\"),\n    AT(\"at\"),\n    AUDIT(\"audit\"),\n    AUTHID(\"authid\"),\n    AUTONOMOUS_TRANSACTION(\"autonomous_transaction\"),\n    BATCH(\"batch\"),\n    BEFORE(\"before\"),\n    BFILE(\"bfile\"),\n    BINARY(\"binary\"),\n    BINARY_DOUBLE(\"binary_double\"),\n    BINARY_DOUBLE_INFINITY(\"binary_double_infinity\"),\n    BINARY_DOUBLE_NAN(\"binary_double_nan\"),\n    BINARY_FLOAT(\"binary_float\"),\n    BINARY_FLOAT_INFINITY(\"binary_float_infinity\"),\n    BINARY_FLOAT_NAN(\"binary_float_nan\"),\n    BINARY_INTEGER(\"binary_integer\"),\n    BLOB(\"blob\"),\n    BODY(\"body\"),\n    BOOLEAN(\"boolean\"),\n    BOTH(\"both\"),\n    BREADTH(\"breadth\"),\n    BUFFER_POOL(\"buffer_pool\"),\n    BULK(\"bulk\"),\n    BULK_ROWCOUNT(\"bulk_rowcount\"),\n    BYTE(\"byte\"),\n    CACHE(\"cache\"),\n    CASCADE(\"cascade\"),\n    CASE(\"case\"),\n    CASE_SENSITIVE(\"case_sensitive\"),\n    CAST(\"cast\"),\n    CHARACTER(\"character\"),\n    CHARSET(\"charset\"),\n    CHARSETFORM(\"charsetform\"),\n    CHARSETID(\"charsetid\"),\n    CHUNK(\"chunk\"),\n    CLOB(\"clob\"),\n    CLONE(\"clone\"),\n    CLOSE(\"close\"),\n    CLUSTERS(\"clusters\"),\n    COLAUTH(\"colauth\"),\n    COLLATION(\"collation\"),\n    COLLECT(\"collect\"),\n    COLUMN(\"column\"),\n    COLUMNS(\"columns\"),\n    COMMENT(\"comment\"),\n    COMMIT(\"commit\"),\n    COMMITTED(\"committed\"),\n    COMPILE(\"compile\"),\n    COMPLETE(\"complete\"),\n    COMPOUND(\"compound\"),\n    CONDITIONAL(\"conditional\"),\n    CONNECT_BY_ROOT(\"connect_by_root\"),\n    CONSTANT(\"constant\"),\n    CONSTRAINT(\"constraint\"),\n    CONSTRAINTS(\"constraints\"),\n    CONSTRUCTOR(\"constructor\"),\n    CONTAINER(\"container\"),\n    CONTENT(\"content\"),\n    CONTEXT(\"context\"),\n    CONTINUE(\"continue\"),\n    CONVERSION(\"conversion\"),\n    COPY(\"copy\"),\n    COUNT(\"count\"),\n    COVERAGE(\"coverage\"),\n    CRASH(\"crash\"),\n    CROSS(\"cross\"),\n    CROSSEDITION(\"crossedition\"),\n    CUBE(\"cube\"),\n    CURRENT(\"current\"),\n    CURRENT_USER(\"current_user\"),\n    CURRVAL(\"currval\"),\n    CURSOR(\"cursor\"),\n    CYCLE(\"cycle\"),\n    DATA(\"data\"),\n    DATABASE(\"database\"),\n    DATE(\"date\"),\n    DAY(\"day\"),\n    DB_ROLE_CHANGE(\"db_role_change\"),\n    DDL(\"ddl\"),\n    DEBUG(\"debug\"),\n    DEC(\"dec\"),\n    DECIMAL(\"decimal\"),\n    DEFAULTS(\"defaults\"),\n    DEFERRABLE(\"deferrable\"),\n    DEFERRED(\"deferred\"),\n    DEFINER(\"definer\"),\n    DELEGATE(\"delegate\"),\n    DELETE(\"delete\"),\n    DENSE_RANK(\"dense_rank\"),\n    DEPRECATE(\"deprecate\"),\n    DEPTH(\"depth\"),\n    DETERMINISTIC(\"deterministic\"),\n    DIRECTORY(\"directory\"),\n    DISABLE(\"disable\"),\n    DISALLOW(\"disallow\"),\n    DISASSOCIATE(\"disassociate\"),\n    DOCUMENT(\"document\"),\n    DOMAIN(\"domain\"),\n    DOUBLE(\"double\"),\n    DURATION(\"duration\"),\n    EACH(\"each\"),\n    EDITIONABLE(\"editionable\"),\n    ELEMENT(\"element\"),\n    ELSIF(\"elsif\"),\n    EMPTY(\"empty\"),\n    ENABLE(\"enable\"),\n    ENCODING(\"encoding\"),\n    ENCRYPT(\"encrypt\"),\n    ENTITYESCAPING(\"entityescaping\"),\n    ERROR(\"error\"),\n    ERRORS(\"errors\"),\n    ESCAPE(\"escape\"),\n    EVALNAME(\"evalname\"),\n    EXCEPTION(\"exception\"),\n    EXCEPTIONS(\"exceptions\"),\n    EXCEPTION_INIT(\"exception_init\"),\n    EXCLUDE(\"exclude\"),\n    EXECUTE(\"execute\"),\n    EXISTING(\"existing\"),\n    EXISTS(\"exists\"),\n    EXIT(\"exit\"),\n    EXTEND(\"extend\"),\n    EXTERNAL(\"external\"),\n    EXTRA(\"extra\"),\n    EXTRACT(\"extract\"),\n    FALSE(\"false\"),\n    FINAL(\"final\"),\n    FIRST(\"first\"),\n    FOLLOWING(\"following\"),\n    FOLLOWS(\"follows\"),\n    FORALL(\"forall\"),\n    FORCE(\"force\"),\n    FOREIGN(\"foreign\"),\n    FORM(\"form\"),\n    FORMAT(\"format\"),\n    FORWARD(\"forward\"),\n    FOUND(\"found\"),\n    FREELIST(\"freelist\"),\n    FREELISTS(\"freelists\"),\n    FREEPOOLS(\"freepools\"),\n    FULL(\"full\"),\n    FUNCTION(\"function\"),\n    GLOBAL(\"global\"),\n    GOTO(\"goto\"),\n    GROUPING(\"grouping\"),\n    GROUPS(\"groups\"),\n    HASH(\"hash\"),\n    HIDE(\"hide\"),\n    HIERARCHY(\"hierarchy\"),\n    HOUR(\"hour\"),\n    IF(\"if\"),\n    IGNORE(\"ignore\"),\n    IMMEDIATE(\"immediate\"),\n    IMMUTABLE(\"immutable\"),\n    INCREMENT(\"increment\"),\n    INDENT(\"indent\"),\n    INDEXES(\"indexes\"),\n    INDEXTYPE(\"indextype\"),\n    INDICATOR(\"indicator\"),\n    INDICES(\"indices\"),\n    INCLUDE(\"include\"),\n    INITIAL(\"initial\"),\n    INITIALLY(\"initially\"),\n    INITRANS(\"initrans\"),\n    INLINE(\"inline\"),\n    INNER(\"inner\"),\n    INSTANTIABLE(\"instantiable\"),\n    INSTEAD(\"instead\"),\n    INT(\"int\"),\n    INTERFACE(\"interface\"),\n    INTERVAL(\"interval\"),\n    ISOLATION(\"isolation\"),\n    ISOPEN(\"isopen\"),\n    JAVA(\"java\"),\n    JOIN(\"join\"),\n    JSON(\"json\"),\n    JSON_ARRAY(\"json_array\"),\n    JSON_ARRAYAGG(\"json_arrayagg\"),\n    JSON_DATAGUIDE(\"json_dataguide\"),\n    JSON_EQUAL(\"json_equal\"),\n    JSON_EXISTS(\"json_exists\"),\n    JSON_MERGEPATCH(\"json_mergepatch\"),\n    JSON_OBJECT(\"json_object\"),\n    JSON_OBJECTAGG(\"json_objectagg\"),\n    JSON_QUERY(\"json_query\"),\n    JSON_SCALAR(\"json_scalar\"),\n    JSON_SERIALIZE(\"json_serialize\"),\n    JSON_TABLE(\"json_table\"),\n    JSON_TEXTCONTAINS(\"json_textcontains\"),\n    JSON_TRANSFORM(\"json_transform\"),\n    JSON_VALUE(\"json_value\"),\n    KEEP(\"keep\"),\n    KEY(\"key\"),\n    KEYS(\"keys\"),\n    LANGUAGE(\"language\"),\n    LAST(\"last\"),\n    LAX(\"lax\"),\n    LEADING(\"leading\"),\n    LEFT(\"left\"),\n    LENGTH(\"length\"),\n    LESS(\"less\"),\n    LEVEL(\"level\"),\n    LEVELS(\"levels\"),\n    LIBRARY(\"library\"),\n    LIMIT(\"limit\"),\n    LIST(\"list\"),\n    LISTAGG(\"listagg\"),\n    LOB(\"lob\"),\n    LOCAL(\"local\"),\n    LOCKED(\"locked\"),\n    LOG(\"log\"),\n    LOGGING(\"logging\"),\n    LOGOFF(\"logoff\"),\n    LOGON(\"logon\"),\n    LOOP(\"loop\"),\n    MAP(\"map\"),\n    MAPPING(\"mapping\"),\n    MATCHED(\"matched\"),\n    MATERIALIZED(\"materialized\"),\n    MAXEXTENTS(\"maxextents\"),\n    MAXLEN(\"maxlen\"),\n    MAXVALUE(\"maxvalue\"),\n    MEMBER(\"member\"),\n    MERGE(\"merge\"),\n    METADATA(\"metadata\"),\n    MINEXTENTS(\"minextents\"),\n    MINING(\"mining\"),\n    MINUTE(\"minute\"),\n    MINVALUE(\"minvalue\"),\n    MISMATCH(\"mismatch\"),\n    MISSING(\"missing\"),\n    MODE(\"mode\"),\n    MODEL(\"model\"),\n    MOD_KEYWORD(\"mod\"),\n    MONTH(\"month\"),\n    MORE(\"more\"),\n    MULTISET(\"multiset\"),\n    MUTABLE(\"mutable\"),\n    NAME(\"name\"),\n    NATURAL(\"natural\"),\n    NATURALN(\"naturaln\"),\n    NCHAR(\"nchar\"),\n    NCLOB(\"nclob\"),\n    NESTED(\"nested\"),\n    NEW(\"new\"),\n    NEXT(\"next\"),\n    NEXTVAL(\"nextval\"),\n    NO(\"no\"),\n    NOAUDIT(\"noaudit\"),\n    NOCACHE(\"nocache\"),\n    NOCOPY(\"nocopy\"),\n    NOCYCLE(\"nocycle\"),\n    NOENTITYESCAPING(\"noentityescaping\"),\n    NOLOGGING(\"nologging\"),\n    NOMAPPING(\"nomapping\"),\n    NONE(\"none\"),\n    NONEDITIONABLE(\"noneditionable\"),\n    NOORDER(\"noorder\"),\n    NOPRECHECK(\"noprecheck\"),\n    NORELY(\"norely\"),\n    NOSCHEMACHECK(\"noschemacheck\"),\n    NOTFOUND(\"notfound\"),\n    NOVALIDATE(\"novalidate\"),\n    NOW(\"now\"),\n    NULLS(\"nulls\"),\n    NUMBER(\"number\"),\n    NUMERIC(\"numeric\"),\n    NVARCHAR2(\"nvarchar2\"),\n    OBJECT(\"object\"),\n    OFFSET(\"offset\"),\n    OLD(\"old\"),\n    OMIT(\"omit\"),\n    ONLY(\"only\"),\n    OPEN(\"open\"),\n    OPERATOR(\"operator\"),\n    OPTIMAL(\"optimal\"),\n    ORDERED(\"ordered\"),\n    ORDINALITY(\"ordinality\"),\n    OTHERS(\"others\"),\n    OUTER(\"outer\"),\n    OVER(\"over\"),\n    OVERFLOW(\"overflow\"),\n    OVERLAPS(\"overlaps\"),\n    OVERRIDING(\"overriding\"),\n    PACKAGE(\"package\"),\n    PAIRS(\"pairs\"),\n    PARALLEL_ENABLE(\"parallel_enable\"),\n    PARAMETERS(\"parameters\"),\n    PARENT(\"parent\"),\n    PARTITION(\"partition\"),\n    PARTITIONS(\"partitions\"),\n    PASSING(\"passing\"),\n    PATH(\"path\"),\n    PCTINCREASE(\"pctincrease\"),\n    PCTUSED(\"pctused\"),\n    PCTVERSION(\"pctversion\"),\n    PERCENT(\"percent\"),\n    PIPE(\"pipe\"),\n    PIPELINED(\"pipelined\"),\n    PIVOT(\"pivot\"),\n    PLS_INTEGER(\"pls_integer\"),\n    PLUGGABLE(\"pluggable\"),\n    POSITIVE(\"positive\"),\n    POSITIVEN(\"positiven\"),\n    PRAGMA(\"pragma\"),\n    PRECEDES(\"precedes\"),\n    PRECEDING(\"preceding\"),\n    PRECHECK(\"precheck\"),\n    PRECISION(\"precision\"),\n    PREPEND(\"prepend\"),\n    PRESERVE(\"preserve\"),\n    PRETTY(\"pretty\"),\n    PRIMARY(\"primary\"),\n    PURGE(\"purge\"),\n    QUOTES(\"quotes\"),\n    RAISE(\"raise\"),\n    RANGE_KEYWORD(\"range\"),\n    READ(\"read\"),\n    READS(\"reads\"),\n    REAL(\"real\"),\n    RECORD(\"record\"),\n    RECYCLE(\"recycle\"),\n    REF(\"ref\"),\n    REFERENCE(\"reference\"),\n    REFERENCES(\"references\"),\n    REFERENCING(\"referencing\"),\n    REFRESH(\"refresh\"),\n    REJECT(\"reject\"),\n    RELIES_ON(\"relies_on\"),\n    RELY(\"rely\"),\n    REMOVE(\"remove\"),\n    RENAME(\"rename\"),\n    REPEAT(\"repeat\"),\n    REPLACE(\"replace\"),\n    RESTRICT_REFERENCES(\"restrict_references\"),\n    RESULT(\"result\"),\n    RESULT_CACHE(\"result_cache\"),\n    RETENTION(\"retention\"),\n    RETURN(\"return\"),\n    RETURNING(\"returning\"),\n    REUSE(\"reuse\"),\n    REVERSE(\"reverse\"),\n    RIGHT(\"right\"),\n    ROLE(\"role\"),\n    ROLLBACK(\"rollback\"),\n    ROLLUP(\"rollup\"),\n    ROW(\"row\"),\n    ROWCOUNT(\"rowcount\"),\n    ROWID(\"rowid\"),\n    ROWNUM(\"rownum\"),\n    ROWS(\"rows\"),\n    ROWTYPE(\"rowtype\"),\n    SAVE(\"save\"),\n    SAVEPOINT(\"savepoint\"),\n    SCALAR(\"scalar\"),\n    SCALARS(\"scalars\"),\n    SCHEMA(\"schema\"),\n    SCHEMACHECK(\"schemacheck\"),\n    SDO_GEOMETRY(\"sdo_geometry\"),\n    SEARCH(\"search\"),\n    SECOND(\"second\"),\n    SEGMENT(\"segment\"),\n    SELF(\"self\"),\n    SEQUENCE(\"sequence\"),\n    SERIALIZABLE(\"serializable\"),\n    SERIALLY_REUSABLE(\"serially_reusable\"),\n    SERVERERROR(\"servererror\"),\n    SESSION(\"session\"),\n    SET(\"set\"),\n    SETS(\"sets\"),\n    SETTINGS(\"settings\"),\n    SHARING(\"sharing\"),\n    SHOW(\"show\"),\n    SHUTDOWN(\"shutdown\"),\n    SIBLINGS(\"siblings\"),\n    SIGNTYPE(\"signtype\"),\n    SKIP(\"skip\"),\n    SOME(\"some\"),\n    SORT(\"sort\"),\n    SPECIFICATION(\"specification\"),\n    SQL(\"sql\"),\n    SQLERRM(\"sqlerrm\"),\n    STANDALONE(\"standalone\"),\n    STARTUP(\"startup\"),\n    STATEMENT_KEYWORD(\"statement\"),\n    STATIC(\"static\"),\n    STATISTICS(\"statistics\"),\n    STORAGE(\"storage\"),\n    STORE(\"store\"),\n    STRICT(\"strict\"),\n    STRING(\"string\"),\n    STRUCT(\"struct\"),\n    SUBMULTISET(\"submultiset\"),\n    SUBPARTITION(\"subpartition\"),\n    SUBPARTITIONS(\"subpartitions\"),\n    SUBSTITUTABLE(\"substitutable\"),\n    SUBTYPE(\"subtype\"),\n    SUPPRESSES_WARNING_6009(\"suppresses_warning_6009\"),\n    SUSPEND(\"suspend\"),\n    SYSDATE(\"sysdate\"),\n    TABAUTH(\"tabauth\"),\n    TABLESPACE(\"tablespace\"),\n    TDO(\"tdo\"),\n    TEMPLATE(\"template\"),\n    TEMPORARY(\"temporary\"),\n    THAN(\"than\"),\n    THE(\"the\"),\n    TIES(\"ties\"),\n    TIME(\"time\"),\n    TIMESTAMP(\"timestamp\"),\n    TO_BINARY_DOUBLE(\"to_binary_double\"),\n    TO_BINARY_FLOAT(\"to_binary_float\"),\n    TO_BOOLEAN(\"to_boolean\"),\n    TO_DATE(\"to_date\"),\n    TO_DSINTERVAL(\"to_dsinterval\"),\n    TO_NUMBER(\"to_number\"),\n    TO_TIMESTAMP(\"to_timestamp\"),\n    TO_TIMESTAMP_TZ(\"to_timestamp_tz\"),\n    TO_YMINTERVAL(\"to_yminterval\"),\n    TRAILING(\"trailing\"),\n    TRANSACTION(\"transaction\"),\n    TREAT(\"treat\"),\n    TRIM(\"trim\"),\n    TRUE(\"true\"),\n    TRUNCATE(\"truncate\"),\n    TYPE(\"type\"),\n    TYPENAME(\"typename\"),\n    UDF(\"udf\"),\n    UNBOUNDED(\"unbounded\"),\n    UNCONDITIONAL(\"unconditional\"),\n    UNDER(\"under\"),\n    UNLIMITED(\"unlimited\"),\n    UNPIVOT(\"unpivot\"),\n    UNPLUG(\"unplug\"),\n    UROWID(\"urowid\"),\n    USE(\"use\"),\n    USING(\"using\"),\n    USING_NLS_COMP(\"using_nls_comp\"),\n    VALIDATE(\"validate\"),\n    VALUE(\"value\"),\n    VARCHAR(\"varchar\"),\n    VARCHAR2(\"varchar2\"),\n    VARRAY(\"varray\"),\n    VARYING(\"varying\"),\n    VECTOR(\"vector\"),\n    VERSION(\"version\"),\n    VIEWS(\"views\"),\n    WAIT(\"wait\"),\n    WELLFORMED(\"wellformed\"),\n    WHILE(\"while\"),\n    WITHIN(\"within\"),\n    WITHOUT(\"without\"),\n    WORK(\"work\"),\n    WRAPPER(\"wrapper\"),\n    WRITE(\"write\"),\n    XML(\"xml\"),\n    XMLAGG(\"xmlagg\"),\n    XMLATTRIBUTES(\"xmlattributes\"),\n    XMLCAST(\"xmlcast\"),\n    XMLCDATA(\"xmlcdata\"),\n    XMLCOLATTVAL(\"xmlcolattval\"),\n    XMLCOMMENT(\"xmlcomment\"),\n    XMLCONCAT(\"xmlconcat\"),\n    XMLDIFF(\"xmldiff\"),\n    XMLELEMENT(\"xmlelement\"),\n    XMLEXISTS(\"xmlexists\"),\n    XMLFOREST(\"xmlforest\"),\n    XMLISVALID(\"xmlisvalid\"),\n    XMLNAMESPACES(\"xmlnamespaces\"),\n    XMLPARSE(\"xmlparse\"),\n    XMLPATCH(\"xmlpatch\"),\n    XMLPI(\"xmlpi\"),\n    XMLQUERY(\"xmlquery\"),\n    XMLROOT(\"xmlroot\"),\n    XMLSEQUENCE(\"xmlsequence\"),\n    XMLSERIALIZE(\"xmlserialize\"),\n    XMLTABLE(\"xmltable\"),\n    XMLTRANSFORM(\"xmltransform\"),\n    XMLTYPE(\"xmltype\"),\n    YEAR(\"year\"),\n    YES(\"yes\"),\n    ZONE(\"zone\");\n\n    override fun hasToBeSkippedFromAst(node: AstNode?) = false\n\n    companion object {\n        val keywordValues: List<String> =\n            entries.map { it.value }\n\n        val nonReservedKeywords: List<PlSqlKeyword> =\n            entries.filter { !it.isReserved }\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/PlSqlPunctuator.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.flr.api.TokenType\n\nenum class PlSqlPunctuator(override val value: String) : TokenType {\n    // Based on http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/fundamentals.htm#sthref297\n    COMMA(\",\"),\n    PLUS(\"+\"),\n    MINUS(\"-\"),\n    MOD(\"%\"),\n    DOT(\".\"),\n    DIVISION(\"/\"),\n    LPARENTHESIS(\"(\"),\n    RPARENTHESIS(\")\"),\n    COLON(\":\"),\n    SEMICOLON(\";\"),\n    MULTIPLICATION(\"*\"),\n    EQUALS(\"=\"),\n    LESSTHAN(\"<\"),\n    GREATERTHAN(\">\"),\n    REMOTE(\"@\"),\n    SUBTRACTION(\"-\"),\n    ASSIGNMENT(\":=\"),\n    SINGLE_PIPE(\"|\"),\n    EXPONENTIATION(\"**\"),\n    LLABEL(\"<<\"),\n    RLABEL(\">>\"),\n    RANGE(\"..\"),\n    DOUBLEDOLLAR(\"$$\"),\n    ASSOCIATION(\"=>\"),\n    EXCLAMATION(\"!\"),\n    TILDE(\"~\"),\n    CARET(\"^\"),\n    LBRACKET(\"[\"),\n    RBRACKET(\"]\"),\n    LBRACE(\"{\"),\n    RBRACE(\"}\"),\n    QUESTION_MARK(\"?\");\n\n    override fun hasToBeSkippedFromAst(node: AstNode?) = false\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/PlSqlTokenType.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.flr.api.TokenType\n\nenum class PlSqlTokenType : TokenType {\n    STRING_LITERAL,\n    INTEGER_LITERAL,\n    NUMBER_LITERAL,\n    DATE_LITERAL,\n    TIMESTAMP_LITERAL;\n\n    override val value = name\n\n    override fun hasToBeSkippedFromAst(node: AstNode?) = false\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/PlSqlVisitorContext.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.flr.api.RecognitionException\nimport com.felipebz.zpa.metadata.FormsMetadata\nimport com.felipebz.zpa.symbols.SymbolTableImpl\nimport com.felipebz.zpa.api.symbols.Scope\nimport com.felipebz.zpa.api.symbols.SymbolTable\n\nopen class PlSqlVisitorContext private constructor(private val rootTree: AstNode?,\n                                                   private val plSqlFile: PlSqlFile?,\n                                                   private val parsingException: RecognitionException?,\n                                                   var formsMetadata: FormsMetadata?) {\n    var symbolTable: SymbolTable = SymbolTableImpl()\n    var currentScope: Scope? = null\n\n    constructor(rootTree: AstNode,\n                plsqlFile: PlSqlFile?,\n                metadata: FormsMetadata?) :\n        this(rootTree, plsqlFile, null, metadata)\n\n    constructor(plsqlFile: PlSqlFile?,\n                parsingException: RecognitionException,\n                metadata: FormsMetadata?) :\n        this(null, plsqlFile, parsingException, metadata)\n\n    fun rootTree() = rootTree\n\n    fun plSqlFile() = plSqlFile\n\n    fun parsingException() = parsingException\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/SessionControlGrammar.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api\n\nimport com.felipebz.flr.api.GenericTokenType.EOF\nimport com.felipebz.flr.grammar.GrammarRuleKey\nimport com.felipebz.zpa.sslr.PlSqlGrammarBuilder\nimport com.felipebz.zpa.api.PlSqlGrammar.IDENTIFIER_NAME\nimport com.felipebz.zpa.api.PlSqlKeyword.*\nimport com.felipebz.zpa.api.PlSqlPunctuator.*\n\nenum class SessionControlGrammar : GrammarRuleKey {\n\n    ALTER_SESSION,\n    SET_ROLE,\n    SESSION_CONTROL_COMMAND;\n\n    companion object {\n        fun buildOn(b: PlSqlGrammarBuilder) {\n\n            b.rule(ALTER_SESSION).define(ALTER, SESSION, b.oneOrMore(b.anyTokenButNot(b.firstOf(SEMICOLON, DIVISION, EOF))))\n\n            b.rule(SET_ROLE).define(SET, ROLE,\n                    b.firstOf(\n                            NONE,\n                            b.sequence(ALL, b.optional(EXCEPT, b.oneOrMore(IDENTIFIER_NAME, b.optional(COMMA)))),\n                            b.oneOrMore(IDENTIFIER_NAME, b.optional(IDENTIFIED, BY, b.anyToken()), b.optional(COMMA))\n                    ))\n\n            b.rule(SESSION_CONTROL_COMMAND).define(b.firstOf(ALTER_SESSION, SET_ROLE), b.optional(SEMICOLON))\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/SingleRowSqlFunctionsGrammar.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api\n\nimport com.felipebz.flr.grammar.GrammarRuleKey\nimport com.felipebz.zpa.sslr.PlSqlGrammarBuilder\nimport com.felipebz.zpa.api.PlSqlGrammar.*\nimport com.felipebz.zpa.api.PlSqlKeyword.*\nimport com.felipebz.zpa.api.PlSqlPunctuator.*\nimport com.felipebz.zpa.api.PlSqlTokenType.STRING_LITERAL\n\nenum class SingleRowSqlFunctionsGrammar : GrammarRuleKey {\n\n    // internals\n    JSON_PASSING_CLAUSE,\n    JSON_ON_NULL_CLAUSE,\n    JSON_ON_ERROR_CLAUSE,\n    JSON_RETURNING_CLAUSE,\n    JSON_ARRAY_ENUMERATION_CONTENT,\n    JSON_ARRAY_QUERY_CONTENT,\n    JSON_ARRAY_ELEMENT,\n    JSON_ARRAY_OPTIONS,\n    JSON_OBJECT_ENTRY,\n    JSON_QUERY_RETURNING_CLAUSE,\n    JSON_QUERY_WRAPPER_CLAUSE,\n    JSON_QUERY_QUOTES_CLAUSE,\n    JSON_QUERY_ON_ERROR_CLAUSE,\n    JSON_QUERY_ON_EMPTY_CLAUSE,\n    JSON_QUERY_ON_MISMATCH_CLAUSE,\n    JSON_BASIC_PATH_EXPRESSION,\n    JSON_PATH_EXPRESSION,\n    JSON_RELATIVE_OBJECT_ACCESS,\n    JSON_TABLE_ON_ERROR_CLAUSE,\n    JSON_TABLE_ON_EMPTY_CLAUSE,\n    JSON_TABLE_COLUMNS_CLAUSE,\n    JSON_COLUMNS_CLAUSE,\n    JSON_COLUMN_DEFINITION,\n    JSON_EXISTS_COLUMN,\n    JSON_QUERY_COLUMN,\n    JSON_VALUE_COLUMN,\n    JSON_NESTED_PATH,\n    JSON_ORDINALITY_COLUMN,\n    JSON_PATH,\n    JSON_ARRAY_STEP,\n    JSON_VALUE_RETURN_TYPE,\n    JSON_VALUE_ON_ERROR_CLAUSE,\n    JSON_VALUE_ON_EMPTY_CLAUSE,\n    JSON_VALUE_ON_MISMATCH_CLAUSE,\n    JSON_VALUE_RETURN_OBJECT_INSTANCE,\n    JSON_TRANSFORM_OPERATION,\n    JSON_TRANSFORM_RETURNING_CLAUSE,\n    JSON_RHS_EXPRESSION,\n    JSON_APPEND_OPERATION,\n    JSON_CASE_OPERATION,\n    JSON_COPY_OPERATION,\n    JSON_INSERT_OPERATION,\n    JSON_INTERSECT_OPERATION,\n    JSON_KEEP_OPERATION,\n    JSON_MERGE_OPERATION,\n    JSON_MINUS_OPERATION,\n    JSON_NESTED_PATH_OPERATION,\n    JSON_OBJECT_OPTIONS,\n    JSON_PREPEND_OPERATION,\n    JSON_REMOVE_OPERATION,\n    JSON_RENAME_OPERATION,\n    JSON_REPLACE_OPERATION,\n    JSON_SET_OPERATION,\n    JSON_SORT_OPERATION,\n    JSON_UNION_OPERATION,\n    JSON_VALUE_RETURNING_CLAUSE,\n    XML_COLUMN,\n    XML_NAMESPACE,\n    XMLNAMESPACES_CLAUSE,\n    XMLTABLE_OPTIONS,\n    XML_PASSING_CLAUSE,\n    XML_TABLE_COLUMN,\n\n    // functions\n    EXTRACT_DATETIME_EXPRESSION,\n    JSON_CONSTRUCTOR,\n    JSON_ARRAY_EXPRESSION,\n    JSON_DATAGUIDE_EXPRESSION,\n    JSON_MERGEPATCH_EXPRESSION,\n    JSON_OBJECT_EXPRESSION,\n    JSON_SCALAR_EXPRESSION,\n    JSON_SERIALIZE_EXPRESSION,\n    JSON_QUERY_EXPRESSION,\n    JSON_TABLE_EXPRESSION,\n    JSON_TRANSFORM_EXPRESSION,\n    JSON_VALUE_EXPRESSION,\n    XMLATTRIBUTES_EXPRESSION,\n    XMLCAST_EXPRESSION,\n    XMLCDATA_EXPRESSION,\n    XMLCOLATTVAL_EXPRESSION,\n    XMLCOMMENT_EXPRESSION,\n    XMLCONCAT_EXPRESSION,\n    XMLDIFF_EXPRESSION,\n    XMLELEMENT_EXPRESSION,\n    XMLEXISTS_EXPRESSION,\n    XMLFOREST_EXPRESSION,\n    XMLISVALID_EXPRESSION,\n    XMLPARSE_EXPRESSION,\n    XMLPATCH_EXPRESSION,\n    XMLPI_EXPRESSION,\n    XMLQUERY_EXPRESSION,\n    XMLROOT_EXPRESSION,\n    XMLSEQUENCE_EXPRESSION,\n    XMLSERIALIZE_EXPRESSION,\n    XMLTABLE_EXPRESSION,\n    XMLTRANSFORM_EXPRESSION,\n\n    DEFAULT_ON_ERROR_CLAUSE,\n    TREAT_AS_EXPRESSION,\n    SET_EXPRESSION,\n    CAST_EXPRESSION,\n    TO_BINARY_DOUBLE_EXPRESSION,\n    TO_BINARY_FLOAT_EXPRESSION,\n    TO_BOOLEAN_EXPRESSION,\n    TO_DATE_EXPRESSION,\n    TO_DSINTERVAL_EXPRESSION,\n    TO_NUMBER_EXPRESSION,\n    TO_TIMESTAMP_EXPRESSION,\n    TO_TIMESTAMP_TZ_EXPRESSION,\n    TO_YMINTERVAL_EXPRESSION,\n    TRIM_EXPRESSION,\n    TABLE_EXPRESSION,\n    THE_EXPRESSION,\n    CURSOR_EXPRESSION,\n    SINGLE_ROW_SQL_FUNCTION;\n\n    companion object {\n        fun buildOn(b: PlSqlGrammarBuilder) {\n            createCharacterFunctions(b)\n            createConversionFunctions(b)\n            createDateFunctions(b)\n            createXmlFunctions(b)\n            createJsonFunctions(b)\n\n            b.rule(SINGLE_ROW_SQL_FUNCTION).define(\n                b.firstOf(\n                    EXTRACT_DATETIME_EXPRESSION,\n                    JSON_CONSTRUCTOR,\n                    JSON_ARRAY_EXPRESSION,\n                    JSON_DATAGUIDE_EXPRESSION,\n                    JSON_MERGEPATCH_EXPRESSION,\n                    JSON_OBJECT_EXPRESSION,\n                    JSON_SCALAR_EXPRESSION,\n                    JSON_SERIALIZE_EXPRESSION,\n                    JSON_QUERY_EXPRESSION,\n                    JSON_TABLE_EXPRESSION,\n                    JSON_TRANSFORM_EXPRESSION,\n                    JSON_VALUE_EXPRESSION,\n                    XMLATTRIBUTES_EXPRESSION,\n                    XMLCAST_EXPRESSION,\n                    XMLCDATA_EXPRESSION,\n                    XMLCOLATTVAL_EXPRESSION,\n                    XMLCOMMENT_EXPRESSION,\n                    XMLCONCAT_EXPRESSION,\n                    XMLDIFF_EXPRESSION,\n                    XMLELEMENT_EXPRESSION,\n                    XMLEXISTS_EXPRESSION,\n                    XMLFOREST_EXPRESSION,\n                    XMLISVALID_EXPRESSION,\n                    XMLPARSE_EXPRESSION,\n                    XMLPATCH_EXPRESSION,\n                    XMLPI_EXPRESSION,\n                    XMLQUERY_EXPRESSION,\n                    XMLROOT_EXPRESSION,\n                    XMLSEQUENCE_EXPRESSION,\n                    XMLSERIALIZE_EXPRESSION,\n                    XMLTABLE_EXPRESSION,\n                    XMLTRANSFORM_EXPRESSION,\n                    TREAT_AS_EXPRESSION,\n                    SET_EXPRESSION,\n                    CAST_EXPRESSION,\n                    TO_BINARY_DOUBLE_EXPRESSION,\n                    TO_BINARY_FLOAT_EXPRESSION,\n                    TO_BOOLEAN_EXPRESSION,\n                    TO_DATE_EXPRESSION,\n                    TO_DSINTERVAL_EXPRESSION,\n                    TO_NUMBER_EXPRESSION,\n                    TO_TIMESTAMP_EXPRESSION,\n                    TO_TIMESTAMP_TZ_EXPRESSION,\n                    TO_YMINTERVAL_EXPRESSION,\n                    TRIM_EXPRESSION,\n                    TABLE_EXPRESSION,\n                    THE_EXPRESSION,\n                    CURSOR_EXPRESSION\n                )\n            )\n        }\n\n        private fun createCharacterFunctions(b: PlSqlGrammarBuilder) {\n            b.rule(TRIM_EXPRESSION).define(\n                    TRIM, LPARENTHESIS,\n                    b.optional(b.optional(b.firstOf(LEADING, TRAILING, BOTH)), EXPRESSION, FROM),\n                    EXPRESSION, RPARENTHESIS)\n        }\n\n        private fun createConversionFunctions(b: PlSqlGrammarBuilder) {\n            b.rule(DEFAULT_ON_ERROR_CLAUSE).define(DEFAULT, EXPRESSION, ON, CONVERSION, ERROR)\n\n            b.rule(TREAT_AS_EXPRESSION).define(\n                b.optional(TREAT),\n                LPARENTHESIS,\n                EXPRESSION,\n                AS,\n                b.optional(REF),\n                OBJECT_REFERENCE,\n                RPARENTHESIS\n            )\n\n            b.rule(SET_EXPRESSION).define(SET, LPARENTHESIS, EXPRESSION, RPARENTHESIS)\n\n            b.rule(CAST_EXPRESSION).define(\n                CAST, LPARENTHESIS,\n                b.firstOf(b.sequence(MULTISET, EXPRESSION), EXPRESSION),\n                AS, b.optional(DOMAIN), DATATYPE, b.optional(b.firstOf(VALIDATE, NOVALIDATE)),\n                b.optional(DEFAULT_ON_ERROR_CLAUSE),\n                b.optional(COMMA, EXPRESSION, b.optional(COMMA, EXPRESSION)),\n                RPARENTHESIS\n            )\n\n            b.rule(TO_BINARY_DOUBLE_EXPRESSION).define(\n                TO_BINARY_DOUBLE, LPARENTHESIS,\n                ARGUMENT,\n                b.optional(DEFAULT_ON_ERROR_CLAUSE),\n                b.optional(COMMA, ARGUMENT, b.optional(COMMA, ARGUMENT)),\n                RPARENTHESIS\n            )\n\n            b.rule(TO_BINARY_FLOAT_EXPRESSION).define(\n                TO_BINARY_FLOAT, LPARENTHESIS,\n                ARGUMENT,\n                b.optional(DEFAULT_ON_ERROR_CLAUSE),\n                b.optional(COMMA, ARGUMENT, b.optional(COMMA, ARGUMENT)),\n                RPARENTHESIS\n            )\n\n            b.rule(TO_BOOLEAN_EXPRESSION).define(\n                TO_BOOLEAN, LPARENTHESIS,\n                ARGUMENT,\n                b.optional(DEFAULT_ON_ERROR_CLAUSE),\n                RPARENTHESIS\n            )\n\n            b.rule(TO_DATE_EXPRESSION).define(\n                TO_DATE, LPARENTHESIS,\n                ARGUMENT,\n                b.optional(DEFAULT_ON_ERROR_CLAUSE),\n                b.optional(COMMA, ARGUMENT, b.optional(COMMA, ARGUMENT)),\n                RPARENTHESIS\n            )\n\n            b.rule(TO_DSINTERVAL_EXPRESSION).define(\n                TO_DSINTERVAL, LPARENTHESIS,\n                ARGUMENT,\n                b.optional(DEFAULT_ON_ERROR_CLAUSE),\n                RPARENTHESIS\n            )\n\n            b.rule(TO_NUMBER_EXPRESSION).define(\n                TO_NUMBER, LPARENTHESIS,\n                ARGUMENT,\n                b.optional(DEFAULT_ON_ERROR_CLAUSE),\n                b.optional(COMMA, ARGUMENT, b.optional(COMMA, ARGUMENT)),\n                RPARENTHESIS\n            )\n\n            b.rule(TO_TIMESTAMP_EXPRESSION).define(\n                TO_TIMESTAMP, LPARENTHESIS,\n                ARGUMENT,\n                b.optional(DEFAULT_ON_ERROR_CLAUSE),\n                b.optional(COMMA, ARGUMENT, b.optional(COMMA, ARGUMENT)),\n                RPARENTHESIS\n            )\n\n            b.rule(TO_TIMESTAMP_TZ_EXPRESSION).define(\n                TO_TIMESTAMP_TZ, LPARENTHESIS,\n                ARGUMENT,\n                b.optional(DEFAULT_ON_ERROR_CLAUSE),\n                b.optional(COMMA, ARGUMENT, b.optional(COMMA, ARGUMENT)),\n                RPARENTHESIS\n            )\n\n            b.rule(TO_YMINTERVAL_EXPRESSION).define(\n                TO_YMINTERVAL, LPARENTHESIS,\n                ARGUMENT,\n                b.optional(DEFAULT_ON_ERROR_CLAUSE),\n                RPARENTHESIS\n            )\n\n            b.rule(TABLE_EXPRESSION).define(\n                TABLE, LPARENTHESIS,\n                b.firstOf(DmlGrammar.SELECT_EXPRESSION, EXPRESSION),\n                RPARENTHESIS\n            )\n\n            b.rule(THE_EXPRESSION).define(\n                THE, LPARENTHESIS,\n                b.firstOf(DmlGrammar.SELECT_EXPRESSION, EXPRESSION),\n                RPARENTHESIS\n            )\n\n            b.rule(CURSOR_EXPRESSION).define(CURSOR, LPARENTHESIS, DmlGrammar.SELECT_EXPRESSION, RPARENTHESIS)\n        }\n\n        private fun createDateFunctions(b: PlSqlGrammarBuilder) {\n            b.rule(EXTRACT_DATETIME_EXPRESSION).define(EXTRACT, LPARENTHESIS, IDENTIFIER_NAME, FROM, EXPRESSION, RPARENTHESIS)\n        }\n\n        private fun createXmlFunctions(b: PlSqlGrammarBuilder) {\n            b.rule(XMLCDATA_EXPRESSION).define(XMLCDATA, LPARENTHESIS, EXPRESSION, RPARENTHESIS)\n\n            b.rule(XMLCOMMENT_EXPRESSION).define(XMLCOMMENT, LPARENTHESIS, EXPRESSION, RPARENTHESIS)\n\n            b.rule(XMLCONCAT_EXPRESSION).define(XMLCONCAT, LPARENTHESIS, EXPRESSION, b.zeroOrMore(COMMA, EXPRESSION), RPARENTHESIS)\n\n            b.rule(XMLDIFF_EXPRESSION).define(\n                XMLDIFF,\n                LPARENTHESIS,\n                EXPRESSION, COMMA, EXPRESSION,\n                b.optional(COMMA, EXPRESSION, COMMA, EXPRESSION),\n                RPARENTHESIS)\n\n            b.rule(XMLISVALID_EXPRESSION).define(\n                XMLISVALID,\n                LPARENTHESIS,\n                EXPRESSION,\n                b.optional(COMMA, EXPRESSION, b.optional(COMMA, EXPRESSION)),\n                RPARENTHESIS)\n\n            b.rule(XMLPATCH_EXPRESSION).define(\n                XMLPATCH,\n                LPARENTHESIS,\n                EXPRESSION,\n                COMMA,\n                EXPRESSION,\n                RPARENTHESIS\n            )\n\n            b.rule(XMLSEQUENCE_EXPRESSION).define(\n                XMLSEQUENCE,\n                LPARENTHESIS,\n                EXPRESSION,\n                b.zeroOrMore(COMMA, EXPRESSION),\n                RPARENTHESIS\n            )\n\n            b.rule(XMLTRANSFORM_EXPRESSION).define(\n                XMLTRANSFORM,\n                LPARENTHESIS,\n                EXPRESSION,\n                COMMA,\n                EXPRESSION,\n                RPARENTHESIS\n            )\n\n            b.rule(XMLSERIALIZE_EXPRESSION).define(\n                    XMLSERIALIZE, LPARENTHESIS,\n                    b.firstOf(DOCUMENT, CONTENT), EXPRESSION,\n                    b.optional(AS, DATATYPE),\n                    b.optional(ENCODING, EXPRESSION),\n                    b.optional(VERSION, STRING_LITERAL),\n                    b.optional(b.firstOf(b.sequence(NO, INDENT), b.sequence(INDENT, b.optional(SIZE, EQUALS, EXPRESSION)))),\n                    b.optional(b.firstOf(HIDE, SHOW), DEFAULTS),\n                    RPARENTHESIS)\n\n            b.rule(XML_COLUMN).define(\n                    EXPRESSION, b.optional(b.optional(AS), b.firstOf(b.sequence(EVALNAME, EXPRESSION), IDENTIFIER_NAME)))\n\n            b.rule(XMLATTRIBUTES_EXPRESSION).define(\n                    XMLATTRIBUTES, LPARENTHESIS,\n                    b.optional(b.firstOf(ENTITYESCAPING, NOENTITYESCAPING)),\n                    b.optional(b.firstOf(SCHEMACHECK, NOSCHEMACHECK)),\n                    XML_COLUMN, b.zeroOrMore(COMMA, XML_COLUMN),\n                    RPARENTHESIS)\n\n            b.rule(XMLELEMENT_EXPRESSION).define(\n                    XMLELEMENT, LPARENTHESIS,\n                    b.optional(b.firstOf(ENTITYESCAPING, NOENTITYESCAPING)),\n                    b.firstOf(\n                            b.sequence(EVALNAME, EXPRESSION),\n                            b.sequence(b.optional(NAME), IDENTIFIER_NAME)\n                    ),\n                    b.optional(COMMA, XMLATTRIBUTES_EXPRESSION),\n                    b.zeroOrMore(COMMA, EXPRESSION, b.optional(b.optional(AS), IDENTIFIER_NAME)),\n                    RPARENTHESIS)\n\n            b.rule(XMLFOREST_EXPRESSION).define(\n                    XMLFOREST, LPARENTHESIS,\n                    XML_COLUMN, b.zeroOrMore(COMMA, XML_COLUMN),\n                    RPARENTHESIS)\n\n            b.rule(XML_PASSING_CLAUSE).define(\n                    PASSING, b.optional(BY, VALUE),\n                    EXPRESSION, b.optional(AS, IDENTIFIER_NAME),\n                    b.zeroOrMore(COMMA, IDENTIFIER_NAME, b.optional(AS, IDENTIFIER_NAME)))\n\n            b.rule(XMLEXISTS_EXPRESSION).define(\n                    XMLEXISTS, LPARENTHESIS, STRING_LITERAL,\n                    b.optional(XML_PASSING_CLAUSE),\n                    RPARENTHESIS)\n\n            b.rule(XMLQUERY_EXPRESSION).define(\n                    XMLQUERY, LPARENTHESIS, STRING_LITERAL,\n                    b.optional(XML_PASSING_CLAUSE),\n                    RETURNING, CONTENT,\n                    b.optional(NULL, ON, EMPTY),\n                    RPARENTHESIS)\n\n            b.rule(XMLROOT_EXPRESSION).define(\n                    XMLROOT, LPARENTHESIS,\n                    EXPRESSION, COMMA,\n                    VERSION, b.firstOf(b.sequence(NO, VALUE), EXPRESSION),\n                    b.optional(COMMA, STANDALONE, b.firstOf(YES, b.sequence(NO, b.optional(VALUE)))),\n                    RPARENTHESIS)\n\n            b.rule(XMLCAST_EXPRESSION).define(\n                    XMLCAST, LPARENTHESIS,\n                    EXPRESSION, AS, DATATYPE,\n                    RPARENTHESIS)\n\n            b.rule(XMLCOLATTVAL_EXPRESSION).define(\n                    XMLCOLATTVAL, LPARENTHESIS,\n                    XML_COLUMN, b.zeroOrMore(COMMA, XML_COLUMN),\n                    RPARENTHESIS)\n\n            b.rule(XMLPARSE_EXPRESSION).define(\n                    XMLPARSE, LPARENTHESIS,\n                    b.firstOf(DOCUMENT, CONTENT), EXPRESSION, b.optional(WELLFORMED),\n                    RPARENTHESIS)\n\n            b.rule(XMLPI_EXPRESSION).define(\n                    XMLPI, LPARENTHESIS,\n                    b.firstOf(\n                            b.sequence(EVALNAME, EXPRESSION),\n                            b.sequence(b.optional(NAME), IDENTIFIER_NAME)),\n                    b.optional(COMMA, EXPRESSION),\n                    RPARENTHESIS)\n\n            b.rule(XML_NAMESPACE).define(\n                    b.firstOf(\n                            b.sequence(DEFAULT, STRING_LITERAL),\n                            b.sequence(STRING_LITERAL, AS, IDENTIFIER_NAME)))\n\n            b.rule(XMLNAMESPACES_CLAUSE).define(\n                    XMLNAMESPACES, LPARENTHESIS,\n                    XML_NAMESPACE, b.zeroOrMore(COMMA, XML_NAMESPACE),\n                    RPARENTHESIS)\n\n            b.rule(XML_TABLE_COLUMN).define(\n                    IDENTIFIER_NAME,\n                    b.firstOf(\n                            b.sequence(FOR, ORDINALITY),\n                            b.sequence(\n                                    b.firstOf(\n                                            DATATYPE,\n                                            b.sequence(XMLTYPE, b.optional(LPARENTHESIS, SEQUENCE, RPARENTHESIS, BY, REF))),\n                                    b.optional(PATH, STRING_LITERAL),\n                                    b.optional(DEFAULT, STRING_LITERAL))))\n\n            b.rule(XMLTABLE_OPTIONS).define(\n                    b.optional(XML_PASSING_CLAUSE),\n                    b.optional(RETURNING, SEQUENCE, BY, REF),\n                    b.optional(COLUMNS, XML_TABLE_COLUMN, b.zeroOrMore(COMMA, XML_TABLE_COLUMN))).skip()\n\n            b.rule(XMLTABLE_EXPRESSION).define(\n                    XMLTABLE, LPARENTHESIS,\n                    b.optional(XMLNAMESPACES_CLAUSE, COMMA), STRING_LITERAL, XMLTABLE_OPTIONS,\n                    RPARENTHESIS)\n        }\n\n        private fun createJsonFunctions(b: PlSqlGrammarBuilder) {\n            b.rule(JSON_CONSTRUCTOR).define(JSON, LPARENTHESIS, EXPRESSION, RPARENTHESIS)\n\n            b.rule(JSON_ARRAY_OPTIONS).define(\n                b.firstOf(JSON_ARRAY_ENUMERATION_CONTENT, JSON_ARRAY_QUERY_CONTENT)\n            ).skip()\n\n            b.rule(JSON_ARRAY_EXPRESSION).define(\n                b.firstOf(\n                    b.sequence(JSON_ARRAY, LPARENTHESIS, JSON_ARRAY_OPTIONS, RPARENTHESIS),\n                    b.sequence(b.optional(JSON), LBRACKET, JSON_ARRAY_OPTIONS, RBRACKET)\n                )\n            )\n\n            b.rule(JSON_ARRAY_ENUMERATION_CONTENT).define(\n                JSON_ARRAY_ELEMENT,\n                b.zeroOrMore(COMMA, JSON_ARRAY_ELEMENT),\n                b.optional(JSON_ON_NULL_CLAUSE),\n                b.optional(JSON_RETURNING_CLAUSE),\n                b.optional(STRICT)\n            )\n\n            b.rule(JSON_ARRAY_ELEMENT).define(\n                EXPRESSION,\n                b.optional(FORMAT, JSON)\n            )\n\n            b.rule(JSON_ON_NULL_CLAUSE).define(b.firstOf(NULL, ABSENT), ON, NULL)\n\n            b.rule(JSON_ON_ERROR_CLAUSE).define(b.firstOf(NULL, ERROR), ON, ERROR)\n\n            b.rule(JSON_RETURNING_CLAUSE).define(\n                RETURNING,\n                b.firstOf(\n                    b.sequence(\n                        CHARACTER_DATAYPE,\n                        b.optional(WITH, TYPENAME)\n                    ),\n                    b.sequence(\n                        b.firstOf(CLOB, BLOB),\n                        b.optional(b.firstOf(REFERENCE, VALUE))\n                    ),\n                    JSON\n                )\n            )\n\n            b.rule(JSON_DATAGUIDE_EXPRESSION).define(\n                JSON_DATAGUIDE,\n                LPARENTHESIS,\n                EXPRESSION,\n                b.optional(COMMA, EXPRESSION, b.optional(COMMA, EXPRESSION)),\n                RPARENTHESIS\n            )\n\n            b.rule(JSON_MERGEPATCH_EXPRESSION).define(\n                JSON_MERGEPATCH,\n                LPARENTHESIS,\n                EXPRESSION,\n                COMMA,\n                EXPRESSION,\n                b.optional(JSON_RETURNING_CLAUSE),\n                b.optional(PRETTY),\n                b.optional(ASCII),\n                b.optional(TRUNCATE),\n                b.optional(JSON_ON_ERROR_CLAUSE),\n                RPARENTHESIS\n            )\n\n            b.rule(JSON_ARRAY_QUERY_CONTENT).define(\n                DmlGrammar.SELECT_EXPRESSION,\n                b.optional(JSON_ON_NULL_CLAUSE),\n                b.optional(JSON_RETURNING_CLAUSE),\n                b.optional(STRICT)\n            )\n\n            b.rule(JSON_OBJECT_OPTIONS).define(\n                JSON_OBJECT_ENTRY, b.zeroOrMore(COMMA, JSON_OBJECT_ENTRY),\n                b.optional(JSON_ON_NULL_CLAUSE),\n                b.optional(JSON_RETURNING_CLAUSE),\n                b.optional(STRICT),\n                b.optional(WITH, UNIQUE, KEYS)\n            ).skip()\n\n            b.rule(JSON_OBJECT_EXPRESSION).define(\n                b.firstOf(\n                    b.sequence(JSON_OBJECT, LPARENTHESIS, JSON_OBJECT_OPTIONS, RPARENTHESIS),\n                    b.sequence(b.optional(JSON), LBRACE, JSON_OBJECT_OPTIONS, RBRACE)\n                )\n            )\n\n            b.rule(JSON_OBJECT_ENTRY).define(\n                b.firstOf(\n                    b.sequence(b.optional(KEY), EXPRESSION, VALUE, EXPRESSION),\n                    b.sequence(STRING_LITERAL, COLON, EXPRESSION),\n                    EXPRESSION\n                ),\n                b.optional(FORMAT, JSON)\n            )\n\n            b.rule(JSON_SCALAR_EXPRESSION).define(\n                JSON_SCALAR,\n                LPARENTHESIS,\n                EXPRESSION,\n                b.optional(b.firstOf(\n                    b.sequence(b.firstOf(JSON, SQL), NULL),\n                    b.sequence(EMPTY, STRING)\n                ), ON, NULL),\n                b.optional(b.firstOf(NULL, ERROR), ON, ERROR),\n                RPARENTHESIS\n            )\n\n            b.rule(JSON_SERIALIZE_EXPRESSION).define(\n                JSON_SERIALIZE,\n                LPARENTHESIS,\n                EXPRESSION,\n                b.optional(JSON_RETURNING_CLAUSE),\n                b.optional(PRETTY),\n                b.optional(ASCII),\n                b.optional(ORDERED),\n                b.optional(TRUNCATE),\n                b.optional(\n                    b.firstOf(\n                        NULL,\n                        ERROR,\n                        b.sequence(EMPTY, b.optional(b.firstOf(ARRAY, OBJECT)))\n                    ),\n                    ON, ERROR\n                ),\n                RPARENTHESIS\n            )\n\n            b.rule(JSON_QUERY_EXPRESSION).define(\n                JSON_QUERY,\n                LPARENTHESIS,\n                EXPRESSION,\n                b.optional(FORMAT, JSON),\n                COMMA,\n                STRING_LITERAL,\n                b.optional(JSON_PASSING_CLAUSE),\n                b.optional(JSON_QUERY_RETURNING_CLAUSE),\n                b.optional(JSON_QUERY_WRAPPER_CLAUSE),\n                b.optional(JSON_QUERY_QUOTES_CLAUSE),\n                b.optional(JSON_QUERY_ON_ERROR_CLAUSE),\n                b.optional(JSON_QUERY_ON_EMPTY_CLAUSE),\n                b.optional(JSON_QUERY_ON_MISMATCH_CLAUSE),\n                b.optional(TYPE, b.firstOf(STRICT, LAX)),\n                RPARENTHESIS\n            )\n\n            b.rule(JSON_PASSING_CLAUSE).define(\n                PASSING, EXPRESSION, AS, IDENTIFIER_NAME, b.zeroOrMore(COMMA, EXPRESSION, AS, IDENTIFIER_NAME)\n            )\n\n            b.rule(JSON_QUERY_RETURNING_CLAUSE).define(\n                b.optional(RETURNING, DATATYPE),\n                b.optional(b.firstOf(ALLOW, DISALLOW), SCALARS),\n                b.optional(PRETTY),\n                b.optional(ASCII)\n            ).skip()\n\n            b.rule(JSON_QUERY_WRAPPER_CLAUSE).define(\n                b.firstOf(\n                    WITHOUT,\n                    b.sequence(WITH, b.optional(b.firstOf(UNCONDITIONAL, CONDITIONAL)))\n                ),\n                b.optional(ARRAY), WRAPPER\n            )\n\n            b.rule(JSON_QUERY_QUOTES_CLAUSE).define(\n                b.firstOf(KEEP, OMIT),\n                QUOTES,\n                b.optional(ON, SCALAR, STRING)\n            )\n\n            b.rule(JSON_QUERY_ON_ERROR_CLAUSE).define(\n                b.firstOf(\n                    ERROR,\n                    NULL,\n                    b.sequence(EMPTY, b.optional(b.firstOf(ARRAY, OBJECT)))\n                ),\n                ON, ERROR\n            )\n\n            b.rule(JSON_QUERY_ON_EMPTY_CLAUSE).define(\n                b.firstOf(\n                    ERROR,\n                    NULL,\n                    b.sequence(EMPTY, b.optional(b.firstOf(ARRAY, OBJECT)))\n                ),\n                ON, EMPTY\n            )\n\n            b.rule(JSON_QUERY_ON_MISMATCH_CLAUSE).define(\n                b.firstOf(ERROR, NULL), ON, MISMATCH\n            )\n\n            b.rule(JSON_TABLE_EXPRESSION).define(\n                JSON_TABLE,\n                LPARENTHESIS,\n                EXPRESSION,\n                b.optional(FORMAT, JSON),\n                b.optional(COMMA, JSON_BASIC_PATH_EXPRESSION),\n                b.optional(JSON_TABLE_ON_ERROR_CLAUSE),\n                b.optional(TYPE, b.firstOf(STRICT, LAX)),\n                b.optional(JSON_TABLE_ON_EMPTY_CLAUSE),\n                JSON_TABLE_COLUMNS_CLAUSE,\n                RPARENTHESIS\n            )\n\n            b.rule(JSON_TABLE_ON_ERROR_CLAUSE).define(\n                b.firstOf(ERROR, NULL),\n                ON, ERROR\n            )\n\n            b.rule(JSON_TABLE_ON_EMPTY_CLAUSE).define(\n                b.firstOf(ERROR, NULL),\n                ON, EMPTY\n            )\n\n            b.rule(JSON_TABLE_COLUMNS_CLAUSE).define(\n                COLUMNS,\n                b.firstOf(\n                    b.sequence(\n                        LPARENTHESIS,\n                        JSON_COLUMN_DEFINITION,\n                        b.zeroOrMore(COMMA, JSON_COLUMN_DEFINITION),\n                        RPARENTHESIS\n                    ),\n                    b.sequence(\n                        JSON_COLUMN_DEFINITION,\n                        b.zeroOrMore(COMMA, JSON_COLUMN_DEFINITION),\n                    ),\n                )\n            )\n\n            b.rule(JSON_COLUMN_DEFINITION).define(\n                b.firstOf(\n                    JSON_NESTED_PATH,\n                    JSON_EXISTS_COLUMN,\n                    JSON_ORDINALITY_COLUMN,\n                    JSON_VALUE_COLUMN,\n                    JSON_QUERY_COLUMN\n                )\n            )\n\n            b.rule(JSON_EXISTS_COLUMN).define(\n                IDENTIFIER_NAME,\n                b.optional(JSON_VALUE_RETURN_TYPE),\n                EXISTS,\n                b.optional(PATH, JSON_PATH),\n                b.optional(ConditionsGrammar.JSON_EXISTS_ON_ERROR_CLAUSE),\n                b.optional(ConditionsGrammar.JSON_EXISTS_ON_EMPTY_CLAUSE)\n            )\n\n            b.rule(JSON_QUERY_COLUMN).define(\n                IDENTIFIER_NAME,\n                b.optional(JSON_VALUE_RETURN_TYPE),\n                b.optional(FORMAT, JSON),\n                b.optional(b.firstOf(ALLOW, DISALLOW), SCALARS),\n                b.optional(JSON_QUERY_WRAPPER_CLAUSE),\n                b.optional(PATH, JSON_PATH),\n                b.optional(JSON_QUERY_ON_ERROR_CLAUSE)\n            )\n\n            b.rule(JSON_VALUE_COLUMN).define(\n                IDENTIFIER_NAME,\n                b.optional(JSON_VALUE_RETURN_TYPE),\n                b.nextNot(FORMAT),\n                b.optional(TRUNCATE),\n                b.optional(PATH, JSON_PATH),\n                b.optional(JSON_VALUE_ON_ERROR_CLAUSE),\n                b.optional(JSON_VALUE_ON_EMPTY_CLAUSE),\n                b.optional(JSON_VALUE_ON_MISMATCH_CLAUSE)\n            )\n\n            b.rule(JSON_NESTED_PATH).define(\n                NESTED, b.optional(PATH),\n                JSON_PATH,\n                JSON_COLUMNS_CLAUSE\n            )\n\n            b.rule(JSON_COLUMNS_CLAUSE).define(\n                COLUMNS,\n                LPARENTHESIS,\n                JSON_COLUMN_DEFINITION,\n                b.zeroOrMore(COMMA, JSON_COLUMN_DEFINITION),\n                RPARENTHESIS\n            )\n\n            b.rule(JSON_ORDINALITY_COLUMN).define(IDENTIFIER_NAME, FOR, ORDINALITY)\n\n            b.rule(JSON_PATH).define(\n                b.firstOf(\n                    JSON_BASIC_PATH_EXPRESSION,\n                    JSON_RELATIVE_OBJECT_ACCESS\n                )\n            )\n\n            b.rule(JSON_BASIC_PATH_EXPRESSION).define(STRING_LITERAL).skip()\n\n            b.rule(JSON_PATH_EXPRESSION).define(STRING_LITERAL).skip()\n\n            b.rule(JSON_RELATIVE_OBJECT_ACCESS).define(\n                IDENTIFIER_NAME, b.optional(JSON_ARRAY_STEP),\n                b.zeroOrMore(DOT, IDENTIFIER_NAME, b.optional(JSON_ARRAY_STEP))\n            )\n\n            b.rule(JSON_ARRAY_STEP).define(\n                LBRACKET,\n                b.firstOf(\n                    b.oneOrMore(PlSqlTokenType.INTEGER_LITERAL, b.optional(TO, PlSqlTokenType.INTEGER_LITERAL), b.optional(COMMA)),\n                    MULTIPLICATION\n                ),\n                RBRACKET\n            )\n\n            b.rule(JSON_VALUE_RETURN_TYPE).define(\n                b.firstOf(\n                    b.sequence(\n                        CHARACTER_DATAYPE,\n                        b.optional(TRUNCATE)\n                    ),\n                    CLOB,\n                    NUMERIC_DATATYPE,\n                    b.sequence(b.firstOf(ALLOW, DISALLOW), b.optional(BOOLEAN), TO, NUMBER, b.optional(CONVERSION)),\n                    b.sequence(DATE, b.optional(b.firstOf(TRUNCATE, PRESERVE), TIME)),\n                    b.sequence(TIMESTAMP, b.optional(WITH, TIME, ZONE)),\n                    BOOLEAN,\n                    SDO_GEOMETRY,\n                    JSON_VALUE_RETURN_OBJECT_INSTANCE,\n                    VECTOR\n                )\n            )\n\n            b.rule(JSON_VALUE_RETURN_OBJECT_INSTANCE).define(\n                b.nextNot(NON_RESERVED_KEYWORD),\n                CUSTOM_DATATYPE, b.optional(USING, CASE_SENSITIVE, MAPPING))\n\n            b.rule(JSON_VALUE_ON_ERROR_CLAUSE).define(\n                b.firstOf(\n                    ERROR,\n                    NULL,\n                    b.sequence(DEFAULT, LITERAL)\n                ), ON, ERROR\n            )\n\n            b.rule(JSON_VALUE_ON_EMPTY_CLAUSE).define(\n                b.firstOf(\n                    ERROR,\n                    NULL,\n                    b.sequence(DEFAULT, LITERAL)\n                ), ON, EMPTY\n            )\n\n            b.rule(JSON_VALUE_ON_MISMATCH_CLAUSE).define(\n                b.firstOf(IGNORE, ERROR, NULL),\n                ON, MISMATCH,\n                b.optional(\n                    LPARENTHESIS,\n                    b.oneOrMore(\n                        b.firstOf(\n                            b.sequence(MISSING, DATA),\n                            b.sequence(EXTRA, DATA),\n                            b.sequence(TYPE, ERROR)\n                        ), b.optional(COMMA)\n                    ),\n                    RPARENTHESIS\n                )\n            )\n\n            b.rule(JSON_VALUE_EXPRESSION).define(\n                JSON_VALUE,\n                LPARENTHESIS,\n                EXPRESSION,\n                b.optional(FORMAT, JSON),\n                COMMA,\n                STRING_LITERAL,\n                b.optional(JSON_PASSING_CLAUSE),\n                b.optional(JSON_VALUE_RETURNING_CLAUSE),\n                b.optional(JSON_VALUE_ON_ERROR_CLAUSE),\n                b.optional(JSON_VALUE_ON_EMPTY_CLAUSE),\n                b.zeroOrMore(JSON_VALUE_ON_MISMATCH_CLAUSE),\n                b.optional(TYPE, b.firstOf(STRICT, LAX)),\n                RPARENTHESIS\n            )\n\n            b.rule(JSON_VALUE_RETURNING_CLAUSE).define(RETURNING, JSON_VALUE_RETURN_TYPE, b.optional(ASCII))\n\n            b.rule(JSON_TRANSFORM_EXPRESSION).define(\n                JSON_TRANSFORM,\n                LPARENTHESIS,\n                EXPRESSION,\n                COMMA,\n                JSON_TRANSFORM_OPERATION,\n                b.zeroOrMore(COMMA, JSON_TRANSFORM_OPERATION),\n                b.optional(JSON_TRANSFORM_RETURNING_CLAUSE),\n                b.optional(TYPE, b.firstOf(STRICT, LAX)),\n                b.optional(JSON_PASSING_CLAUSE),\n                RPARENTHESIS\n            )\n\n            b.rule(JSON_TRANSFORM_RETURNING_CLAUSE).define(\n                RETURNING,\n                b.firstOf(\n                    CHARACTER_DATAYPE,\n                    b.sequence(\n                        b.firstOf(CLOB, BLOB),\n                        b.optional(b.firstOf(REFERENCE, VALUE))\n                    ),\n                    JSON,\n                    BOOLEAN,\n                    VECTOR\n                )\n            )\n\n            b.rule(JSON_RHS_EXPRESSION).define(\n                b.firstOf(\n                    b.sequence(PATH, JSON_BASIC_PATH_EXPRESSION),\n                    b.sequence(EXPRESSION, b.optional(FORMAT, JSON))\n                )\n            )\n\n            b.rule(JSON_TRANSFORM_OPERATION).define(\n                b.firstOf(\n                    JSON_APPEND_OPERATION,\n                    JSON_CASE_OPERATION,\n                    JSON_COPY_OPERATION,\n                    JSON_INSERT_OPERATION,\n                    JSON_INTERSECT_OPERATION,\n                    JSON_KEEP_OPERATION,\n                    JSON_MERGE_OPERATION,\n                    JSON_MINUS_OPERATION,\n                    JSON_NESTED_PATH_OPERATION,\n                    JSON_PREPEND_OPERATION,\n                    JSON_REMOVE_OPERATION,\n                    JSON_RENAME_OPERATION,\n                    JSON_REPLACE_OPERATION,\n                    JSON_SET_OPERATION,\n                    JSON_SORT_OPERATION,\n                    JSON_UNION_OPERATION\n                )\n            )\n\n            b.rule(JSON_APPEND_OPERATION).define(\n                APPEND, JSON_PATH_EXPRESSION, EQUALS, JSON_RHS_EXPRESSION,\n                b.optional(b.firstOf(IGNORE, ERROR, CREATE, NULL), ON, MISSING),\n                b.optional(b.firstOf(IGNORE, ERROR, REPLACE, NULL), ON, MISMATCH),\n                b.optional(b.firstOf(IGNORE, ERROR, NULL), ON, NULL),\n                b.optional(b.firstOf(IGNORE, ERROR), ON, EMPTY),\n            )\n\n            b.rule(JSON_CASE_OPERATION).define(\n                CASE,\n                WHEN, JSON_PATH_EXPRESSION, THEN,\n                LPARENTHESIS,\n                JSON_TRANSFORM_OPERATION, b.zeroOrMore(COMMA, JSON_TRANSFORM_OPERATION),\n                RPARENTHESIS,\n                b.optional(\n                    ELSE,\n                    LPARENTHESIS,\n                    JSON_TRANSFORM_OPERATION, b.zeroOrMore(COMMA, JSON_TRANSFORM_OPERATION),\n                    RPARENTHESIS\n                ),\n                END\n            )\n\n            b.rule(JSON_COPY_OPERATION).define(\n                COPY, JSON_PATH_EXPRESSION, EQUALS, JSON_RHS_EXPRESSION,\n                b.optional(b.firstOf(IGNORE, ERROR, CREATE, NULL), ON, MISSING),\n                b.optional(b.firstOf(IGNORE, ERROR, NULL), ON, NULL),\n                b.optional(b.firstOf(IGNORE, ERROR), ON, EMPTY)\n            )\n\n            b.rule(JSON_INSERT_OPERATION).define(\n                INSERT, JSON_PATH_EXPRESSION, EQUALS, JSON_RHS_EXPRESSION,\n                b.optional(b.firstOf(IGNORE, ERROR, REPLACE, NULL), ON, EXISTING),\n                b.optional(b.firstOf(IGNORE, ERROR, REMOVE, NULL), ON, NULL),\n                b.optional(b.firstOf(IGNORE, ERROR, NULL), ON, EMPTY),\n                b.optional(b.firstOf(IGNORE, ERROR), ON, ERROR)\n            )\n\n            b.rule(JSON_INTERSECT_OPERATION).define(\n                INTERSECT, JSON_PATH_EXPRESSION, EQUALS, JSON_RHS_EXPRESSION,\n                b.optional(b.firstOf(IGNORE, ERROR, CREATE, NULL), ON, MISSING),\n                b.optional(b.firstOf(IGNORE, ERROR, NULL), ON, NULL)\n            )\n\n            b.rule(JSON_KEEP_OPERATION).define(\n                KEEP, JSON_PATH_EXPRESSION, b.zeroOrMore(COMMA, JSON_PATH_EXPRESSION),\n                b.optional(b.firstOf(IGNORE, ERROR), ON, MISSING)\n            )\n\n            b.rule(JSON_MERGE_OPERATION).define(\n                MERGE, JSON_PATH_EXPRESSION, EQUALS, JSON_RHS_EXPRESSION,\n                b.optional(b.firstOf(IGNORE, ERROR, CREATE, NULL), ON, MISSING),\n                b.optional(b.firstOf(IGNORE, ERROR), ON, MISMATCH),\n                b.optional(b.firstOf(IGNORE, ERROR, NULL), ON, NULL),\n                b.optional(b.firstOf(IGNORE, ERROR), ON, EMPTY)\n            )\n\n            b.rule(JSON_MINUS_OPERATION).define(\n                MINUS_KEYWORD, JSON_PATH_EXPRESSION, EQUALS, JSON_RHS_EXPRESSION,\n                b.optional(b.firstOf(IGNORE, ERROR, CREATE, NULL), ON, MISSING),\n                b.optional(b.firstOf(IGNORE, ERROR, NULL), ON, NULL)\n            )\n\n            b.rule(JSON_NESTED_PATH_OPERATION).define(\n                NESTED, PATH, JSON_PATH_EXPRESSION, LPARENTHESIS,\n                JSON_TRANSFORM_OPERATION, b.zeroOrMore(COMMA, JSON_TRANSFORM_OPERATION),\n                RPARENTHESIS\n            )\n\n            b.rule(JSON_PREPEND_OPERATION).define(\n                PREPEND, JSON_PATH_EXPRESSION, EQUALS, JSON_RHS_EXPRESSION,\n                b.optional(b.firstOf(IGNORE, ERROR, CREATE, NULL), ON, MISSING),\n                b.optional(b.firstOf(IGNORE, ERROR, REPLACE, CREATE), ON, MISMATCH),\n                b.optional(b.firstOf(IGNORE, ERROR, NULL), ON, NULL),\n                b.optional(b.firstOf(IGNORE, ERROR), ON, EMPTY)\n            )\n\n            b.rule(JSON_REMOVE_OPERATION).define(\n                REMOVE, JSON_PATH_EXPRESSION,\n                b.optional(b.firstOf(IGNORE, ERROR), ON, MISSING)\n            )\n\n            b.rule(JSON_RENAME_OPERATION).define(\n                RENAME, JSON_PATH_EXPRESSION, WITH, STRING_LITERAL,\n                b.optional(b.firstOf(IGNORE, ERROR), ON, MISSING)\n            )\n\n            b.rule(JSON_REPLACE_OPERATION).define(\n                REPLACE, JSON_PATH_EXPRESSION, EQUALS, JSON_RHS_EXPRESSION,\n                b.optional(b.firstOf(IGNORE, ERROR, CREATE, NULL), ON, MISSING),\n                b.optional(b.firstOf(IGNORE, ERROR, REMOVE, NULL), ON, NULL),\n                b.optional(b.firstOf(IGNORE, ERROR, NULL), ON, EMPTY),\n                b.optional(b.firstOf(IGNORE, ERROR), ON, ERROR)\n            )\n\n            b.rule(JSON_SET_OPERATION).define(\n                SET, JSON_PATH_EXPRESSION, EQUALS, JSON_RHS_EXPRESSION,\n                b.optional(b.firstOf(IGNORE, ERROR, REPLACE), ON, EXISTING),\n                b.optional(b.firstOf(IGNORE, ERROR, CREATE), ON, MISSING),\n                b.optional(b.firstOf(IGNORE, ERROR, REMOVE, NULL), ON, NULL),\n                b.optional(b.firstOf(IGNORE, ERROR, NULL), ON, EMPTY),\n                b.optional(b.firstOf(IGNORE, ERROR), ON, ERROR)\n            )\n\n            b.rule(JSON_SORT_OPERATION).define(\n                SORT, JSON_PATH_EXPRESSION,\n                b.optional(\n                    b.firstOf(\n                        REVERSE,\n                        b.sequence(\n                            b.optional(REMOVE, NULLS),\n                            ORDER, BY,\n                            JSON_PATH_EXPRESSION, b.optional(b.firstOf(ASC, DESC)),\n                            b.zeroOrMore(\n                                COMMA,\n                                JSON_PATH_EXPRESSION, b.optional(b.firstOf(ASC, DESC))\n                            )\n                        ),\n                        b.sequence(\n                            b.optional(b.firstOf(ASC, DESC)),\n                            b.optional(UNIQUE),\n                            b.optional(REMOVE, NULLS)\n                        )\n                    )\n                ),\n                b.optional(b.firstOf(IGNORE, ERROR, NULL), ON, MISSING),\n                b.optional(b.firstOf(IGNORE, ERROR, NULL), ON, MISMATCH),\n                b.optional(b.firstOf(IGNORE, ERROR), ON, EMPTY),\n                b.optional(b.firstOf(IGNORE, ERROR), ON, ERROR)\n            )\n\n            b.rule(JSON_UNION_OPERATION).define(\n                UNION, JSON_PATH_EXPRESSION, EQUALS, JSON_RHS_EXPRESSION,\n                b.optional(b.firstOf(IGNORE, ERROR, CREATE, NULL), ON, MISSING),\n                b.optional(b.firstOf(IGNORE, ERROR, NULL), ON, NULL)\n            )\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/SqlPlusGrammar.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api\n\nimport com.felipebz.flr.api.GenericTokenType\nimport com.felipebz.flr.grammar.GrammarRuleKey\nimport com.felipebz.zpa.sslr.PlSqlGrammarBuilder\n\nenum class SqlPlusGrammar : GrammarRuleKey {\n\n    SQLPLUS_COMMAND;\n\n    companion object {\n        fun buildOn(b: PlSqlGrammarBuilder) {\n            createSqlPlusCommands(b)\n        }\n\n        private fun createSqlPlusCommands(b: PlSqlGrammarBuilder) {\n            b.rule(SQLPLUS_COMMAND).define(\n                    b.firstOf(\n                            \"@\",\n                            \"A\", \"APPEND\",\n                            \"ACC\", \"ACCEPT\",\n                            \"ARCHIVE\",\n                            \"ATTR\", \"ATTRIBUTE\",\n                            \"BRE\", \"BREAK\",\n                            \"BTI\", \"BTITLE\",\n                            \"C\", \"CHANGE\",\n                            \"CL\", \"CLEAR\",\n                            \"COL\", \"COLUMN\",\n                            \"COMP\", \"COMPUTE\",\n                            \"CONN\", \"CONNECT\",\n                            \"COPY\",\n                            \"DEF\", \"DEFINE\",\n                            \"DEL\",\n                            \"DESC\", \"DESCRIBE\",\n                            \"DISC\", \"DISCONNECT\",\n                            \"ED\", \"EDIT\",\n                            \"EXEC\", \"EXECUTE\",\n                            \"EXIT\", \"QUIT\",\n                            \"GET\",\n                            \"HELP\", \"?\",\n                            \"HO\", \"HOST\",\n                            \"I\", \"INPUT\",\n                            \"L\", \"LIST\",\n                            \"PASSW\", \"PASSWORD\",\n                            \"PAU\", \"PAUSE\",\n                            \"PRINT\",\n                            \"PRO\", \"PROMPT\",\n                            \"RECOVER\",\n                            \"REM\", \"REMARK\",\n                            \"REPF\", \"REPFOOTER\",\n                            \"REPH\", \"REPHEADER\",\n                            \"R\", \"RUN\",\n                            \"SAV\", \"SAVE\",\n                            \"SET\",\n                            \"SHO\", \"SHOW\",\n                            \"SHUTDOWN\",\n                            \"SPO\", \"SPOOL\",\n                            \"STA\", \"START\",\n                            \"STARTUP\",\n                            \"STORE\",\n                            \"TIMI\", \"TIMING\",\n                            \"TTI\", \"TTITLE\",\n                            \"UNDEF\", \"UNDEFINE\",\n                            \"VAR\", \"VARIABLE\",\n                            \"WHENEVER\",\n                            \"XQUERY\"),\n                    b.firstOf(b.tillNewLine(), b.till(GenericTokenType.EOF)))\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/TclGrammar.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api\n\nimport com.felipebz.flr.api.GenericTokenType.IDENTIFIER\nimport com.felipebz.flr.grammar.GrammarRuleKey\nimport com.felipebz.zpa.sslr.PlSqlGrammarBuilder\nimport com.felipebz.zpa.api.PlSqlGrammar.IDENTIFIER_NAME\nimport com.felipebz.zpa.api.PlSqlKeyword.*\nimport com.felipebz.zpa.api.PlSqlPunctuator.COMMA\nimport com.felipebz.zpa.api.PlSqlPunctuator.SEMICOLON\nimport com.felipebz.zpa.api.PlSqlTokenType.INTEGER_LITERAL\nimport com.felipebz.zpa.api.PlSqlTokenType.STRING_LITERAL\n\nenum class TclGrammar : GrammarRuleKey {\n\n    TRANSACTION_NAME,\n\n    COMMIT_EXPRESSION,\n    ROLLBACK_EXPRESSION,\n    SAVEPOINT_EXPRESSION,\n    SET_TRANSACTION_EXPRESSION,\n    TCL_COMMAND;\n\n    companion object {\n        fun buildOn(b: PlSqlGrammarBuilder) {\n            b.rule(COMMIT_EXPRESSION).define(\n                    COMMIT,\n                    b.optional(WORK),\n                    b.optional(b.firstOf(\n                            b.sequence(FORCE, STRING_LITERAL, b.optional(COMMA, INTEGER_LITERAL)),\n                            b.sequence(\n                                    b.optional(COMMENT, STRING_LITERAL),\n                                    b.optional(WRITE, b.optional(b.firstOf(IMMEDIATE, BATCH)), b.optional(b.firstOf(WAIT, NOWAIT))))))).skip()\n\n            b.rule(ROLLBACK_EXPRESSION).define(\n                    ROLLBACK,\n                    b.optional(WORK),\n                    b.optional(b.firstOf(\n                            b.sequence(FORCE, STRING_LITERAL),\n                            b.sequence(TO, b.optional(SAVEPOINT), IDENTIFIER_NAME)))).skip()\n\n            b.rule(SAVEPOINT_EXPRESSION).define(SAVEPOINT, IDENTIFIER_NAME).skip()\n\n            b.rule(TRANSACTION_NAME).define(NAME, STRING_LITERAL)\n\n            //https://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_10005.htm#SQLRF01705\n            b.rule(SET_TRANSACTION_EXPRESSION).define(\n                    SET, TRANSACTION,\n                    b.firstOf(\n                            b.sequence(\n                                    b.firstOf(b.sequence(READ, b.firstOf(ONLY, WRITE)),\n                                            b.sequence(ISOLATION, LEVEL, b.firstOf(SERIALIZABLE, b.sequence(READ, COMMITTED))),\n                                            b.sequence(USE, ROLLBACK, SEGMENT, IDENTIFIER)),\n                                    b.optional(TRANSACTION_NAME)),\n                            TRANSACTION_NAME))\n\n            b.rule(TCL_COMMAND).define(\n                    b.firstOf(\n                            COMMIT_EXPRESSION,\n                            ROLLBACK_EXPRESSION,\n                            SAVEPOINT_EXPRESSION,\n                            SET_TRANSACTION_EXPRESSION),\n                    b.optional(SEMICOLON))\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/ZpaRulesDefinition.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api\n\ninterface ZpaRulesDefinition {\n    fun repositoryName(): String\n    fun repositoryKey(): String\n    fun checkClasses(): Array<Class<*>>\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/annotations/ActivatedByDefault.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.annotations\n\n@Retention\n@Target(AnnotationTarget.CLASS, AnnotationTarget.FILE)\nannotation class ActivatedByDefault\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/annotations/ConstantRemediation.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.annotations\n\n@Retention\n@Target(AnnotationTarget.CLASS, AnnotationTarget.FILE)\nannotation class ConstantRemediation(\n        /**\n         * Value of the remediation\n         * @return e.g. \"10min\" or \"2h\"\n         */\n        val value: String)\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/annotations/Priority.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.annotations\n\nenum class Priority {\n    INFO,\n    MINOR,\n    MAJOR,\n    CRITICAL,\n    BLOCKER\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/annotations/Rule.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.annotations\n\n@Retention\n@Target(AnnotationTarget.CLASS, AnnotationTarget.FILE)\nannotation class Rule(val key: String = \"\",\n                      val name: String = \"\",\n                      val description: String = \"\",\n                      val priority: Priority = Priority.MAJOR,\n                      val tags: Array<String> = [],\n                      val status: String = \"READY\")\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/annotations/RuleInfo.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.annotations\n\n@Retention\n@Target(AnnotationTarget.CLASS, AnnotationTarget.FILE)\nannotation class RuleInfo(val scope: Scope = Scope.MAIN) {\n\n    enum class Scope {\n        ALL, MAIN, TEST\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/annotations/RuleProperty.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.annotations\n\n@Retention\n@Target(AnnotationTarget.FIELD)\nannotation class RuleProperty(val key: String = \"\",\n                              val description: String = \"\",\n                              val defaultValue: String = \"\",\n                              val type: String = \"\")\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/annotations/RuleTemplate.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.annotations\n\n@Retention\n@Target(AnnotationTarget.CLASS, AnnotationTarget.FILE)\nannotation class RuleTemplate\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/checks/PlSqlCheck.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.flr.api.Token\nimport com.felipebz.zpa.checks.IssueLocation\nimport com.felipebz.zpa.sslr.Tree\nimport com.felipebz.zpa.api.PlSqlVisitorContext\nimport com.felipebz.zpa.api.squid.SemanticAstNode\nimport java.text.MessageFormat\nimport java.util.*\n\nopen class PlSqlCheck : PlSqlVisitor() {\n\n    private val issues = ArrayList<PreciseIssue>()\n\n    override fun startScan() {\n        issues.clear()\n    }\n\n    fun semantic(node: AstNode) = node as SemanticAstNode\n\n    fun issues(): List<PreciseIssue> = Collections.unmodifiableList(issues)\n\n    fun scanFileForIssues(context: PlSqlVisitorContext): List<PreciseIssue> {\n        issues.clear()\n        scanFile(context)\n        return issues()\n    }\n\n    fun addIssue(node: AstNode, message: String): PreciseIssue {\n        val newIssue = PreciseIssue(IssueLocation.preciseLocation(node, message))\n        issues.add(newIssue)\n        return newIssue\n    }\n\n    fun addIssue(node: AstNode, message: String, vararg messageParameters: Any): PreciseIssue {\n        return addIssue(node, MessageFormat.format(message, *messageParameters))\n    }\n\n    fun addIssue(tree: Tree, message: String): PreciseIssue {\n        val newIssue = PreciseIssue(IssueLocation.preciseLocation(tree.astNode, message))\n        issues.add(newIssue)\n        return newIssue\n    }\n\n    fun addIssue(tree: Tree, message: String, vararg messageParameters: Any): PreciseIssue {\n        return addIssue(tree, MessageFormat.format(message, *messageParameters))\n    }\n\n    fun addIssue(primaryLocation: IssueLocation): PreciseIssue {\n        val newIssue = PreciseIssue(primaryLocation)\n        issues.add(newIssue)\n        return newIssue\n    }\n\n    fun addLineIssue(message: String, lineNumber: Int): PreciseIssue {\n        val newIssue = PreciseIssue(IssueLocation.atLineLevel(message, lineNumber))\n        issues.add(newIssue)\n        return newIssue\n    }\n\n    fun addLineIssue(message: String, lineNumber: Int, vararg messageParameters: Any): PreciseIssue {\n        return addLineIssue(MessageFormat.format(message, *messageParameters), lineNumber)\n    }\n\n    fun addFileIssue(message: String): PreciseIssue {\n        val newIssue = PreciseIssue(IssueLocation.atFileLevel(message))\n        issues.add(newIssue)\n        return newIssue\n    }\n\n    fun addFileIssue(message: String, vararg messageParameters: Any): PreciseIssue {\n        return addFileIssue(MessageFormat.format(message, *messageParameters))\n    }\n\n    fun addIssue(token: Token, message: String): PreciseIssue {\n        return addIssue(AstNode(token), message)\n    }\n\n    fun addIssue(token: Token, message: String, vararg messageParameters: Any): PreciseIssue {\n        return addIssue(token, MessageFormat.format(message, *messageParameters))\n    }\n\n    class PreciseIssue(private val primaryLocation: IssueLocation) {\n        private var cost: Int? = null\n        private val secondaryLocations = mutableListOf<IssueLocation>()\n\n        fun cost() = cost\n\n        fun withCost(cost: Int) = apply {\n            this.cost = cost\n        }\n\n        fun primaryLocation() = primaryLocation\n\n        fun secondary(node: AstNode, message: String) = apply {\n            secondaryLocations.add(IssueLocation.preciseLocation(node, message))\n        }\n\n        fun secondary(issueLocation: IssueLocation)= apply {\n            secondaryLocations.add(issueLocation)\n        }\n\n        fun secondaryLocations(): List<IssueLocation> = secondaryLocations\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/checks/PlSqlVisitor.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.flr.api.AstNodeType\nimport com.felipebz.flr.api.Token\nimport com.felipebz.flr.api.Trivia\nimport com.felipebz.zpa.rules.ZpaActiveRule\nimport com.felipebz.zpa.squid.PlSqlAstWalker\nimport com.felipebz.zpa.api.PlSqlVisitorContext\n\nopen class PlSqlVisitor {\n\n    lateinit var context: PlSqlVisitorContext\n    lateinit var activeRule: ZpaActiveRule\n      internal set\n\n    private val astNodeTypesToVisit = mutableSetOf<AstNodeType>()\n\n    fun subscribedKinds(): Set<AstNodeType> = astNodeTypesToVisit\n\n    open fun startScan() {\n        // default implementation does nothing\n    }\n\n    open fun init() {\n        // default implementation does nothing\n    }\n\n    open fun visitFile(node: AstNode) {\n        // default implementation does nothing\n    }\n\n    open fun leaveFile(node: AstNode) {\n        // default implementation does nothing\n    }\n\n    open fun visitNode(node: AstNode) {\n        // default implementation does nothing\n    }\n\n    open fun visitToken(token: Token) {\n        // default implementation does nothing\n    }\n\n    open fun visitComment(trivia: Trivia, content: String) {\n        // default implementation does nothing\n    }\n\n    open fun leaveNode(node: AstNode) {\n        // default implementation does nothing\n    }\n\n    fun subscribeTo(vararg astNodeTypes: AstNodeType) {\n        astNodeTypesToVisit.addAll(astNodeTypes)\n    }\n\n    fun scanFile(context: PlSqlVisitorContext) {\n        val walker = PlSqlAstWalker(setOf(this))\n        walker.walk(context)\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/matchers/MethodMatcher.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.matchers\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.squid.SemanticAstNode\nimport com.felipebz.zpa.api.symbols.PlSqlType\n\nclass MethodMatcher private constructor()\n{\n\n    private var methodNameCriteria: NameCriteria? = null\n    private var packageNameCriteria: NameCriteria? = null\n    private var schemaNameCriteria: NameCriteria? = null\n    private var shouldCheckParameters = true\n    private var schemaIsOptional = false\n    var methodName: String = \"\"\n        private set\n    private val expectedArgumentTypes = ArrayList<PlSqlType>()\n\n    fun name(methodNameCriteria: String) =\n        name(NameCriteria.`is`(methodNameCriteria))\n\n    fun name(methodNameCriteria: NameCriteria) = apply {\n        check(this.methodNameCriteria == null)\n        this.methodNameCriteria = methodNameCriteria\n    }\n\n    fun packageName(packageNameCriteria: String) =\n        packageName(NameCriteria.`is`(packageNameCriteria))\n\n    fun packageName(packageNameCriteria: NameCriteria) = apply {\n        check(this.packageNameCriteria == null)\n        this.packageNameCriteria = packageNameCriteria\n    }\n\n    fun schema(schemaNameCriteria: String) =\n        schema(NameCriteria.`is`(schemaNameCriteria))\n\n    fun schema(schemaNameCriteria: NameCriteria) = apply {\n        check(this.schemaNameCriteria == null)\n        this.schemaNameCriteria = schemaNameCriteria\n    }\n\n    fun withNoParameterConstraint() = apply {\n        check(this.expectedArgumentTypes.isEmpty())\n        this.shouldCheckParameters = false\n    }\n\n    fun schemaIsOptional() = apply {\n        this.schemaIsOptional = true\n    }\n\n    fun addParameter() =\n        addParameter(PlSqlType.UNKNOWN)\n\n    fun addParameter(type: PlSqlType) = apply {\n        check(this.shouldCheckParameters)\n        expectedArgumentTypes.add(type)\n    }\n\n    fun addParameters(quantity: Int) = apply {\n        for (i in 0 until quantity) {\n            addParameter(PlSqlType.UNKNOWN)\n        }\n    }\n\n    fun addParameters(vararg types: PlSqlType) = apply {\n        check(this.shouldCheckParameters)\n        for (type in types) {\n            addParameter(type)\n        }\n    }\n\n    fun getArguments(node: AstNode): List<AstNode> {\n        val arguments = node.getFirstChildOrNull(PlSqlGrammar.ARGUMENTS)\n        return arguments?.getChildren(PlSqlGrammar.ARGUMENT) ?: ArrayList()\n\n    }\n\n    fun getArgumentsValues(node: AstNode) =\n        getArguments(node).map { it.lastChild }.toList()\n\n    fun matches(originalNode: AstNode): Boolean {\n        val node = normalize(originalNode)\n\n        var i = -1\n        val nodes = arrayOfNulls<String>(3)\n        for (child in node.children) {\n            if (i < 2 && (child.type === PlSqlGrammar.VARIABLE_NAME || child.type === PlSqlGrammar.IDENTIFIER_NAME)) {\n                nodes[++i] = child.tokenValue\n            }\n        }\n\n        fun hasMoreItensToCheck() = i > -1\n        fun nextNode() = nodes[i--]\n\n        if (!hasMoreItensToCheck()) {\n            return false\n        }\n\n        var matches =  methodNameCriteria?.let { nameAcceptable(nextNode(), it) } ?: true\n\n        packageNameCriteria?.let {\n            matches = matches and (hasMoreItensToCheck() && nameAcceptable(nextNode(), it))\n        }\n\n        schemaNameCriteria?.let {\n            matches = matches and (schemaIsOptional && !hasMoreItensToCheck() ||\n                hasMoreItensToCheck() && nameAcceptable(nextNode(), it))\n        }\n\n        return matches && !hasMoreItensToCheck() && argumentsAcceptable(originalNode)\n    }\n\n    private fun nameAcceptable(name: String?, criteria: NameCriteria): Boolean {\n        methodName = name ?: \"\"\n        return criteria.matches(methodName)\n    }\n\n    private fun argumentsAcceptable(node: AstNode): Boolean {\n        val arguments = getArguments(node)\n        return !shouldCheckParameters || arguments.size == expectedArgumentTypes.size && argumentTypesAreCorrect(arguments)\n    }\n\n    private fun argumentTypesAreCorrect(arguments: List<AstNode>): Boolean {\n        var result = true\n        for ((i, type) in expectedArgumentTypes.withIndex()) {\n            val actualArgument = arguments[i].firstChild\n            result = result and (type === PlSqlType.UNKNOWN || type === semantic(actualArgument).plSqlType)\n        }\n        return result\n    }\n\n    private fun normalize(node: AstNode): AstNode {\n        if (node.type === PlSqlGrammar.METHOD_CALL || node.type === PlSqlGrammar.CALL_STATEMENT) {\n            var child = normalize(node.firstChild)\n            if (child.firstChild.type === PlSqlGrammar.HOST_AND_INDICATOR_VARIABLE) {\n                child = child.firstChild\n            }\n            return child\n        }\n        return node\n    }\n\n    companion object {\n        @JvmStatic\n        fun create(): MethodMatcher {\n            return MethodMatcher()\n        }\n\n        fun semantic(node: AstNode): SemanticAstNode {\n            return node as SemanticAstNode\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/matchers/NameCriteria.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.matchers\n\nimport java.util.*\n\nfun interface NameCriteria {\n\n    fun matches(name: String?): Boolean\n\n    companion object {\n\n        @JvmStatic\n        fun any(): NameCriteria =\n            NameCriteria { true }\n\n        @JvmStatic\n        fun `is`(exactName: String): NameCriteria =\n            NameCriteria { name -> exactName.equals(name, ignoreCase = true) }\n\n        @JvmStatic\n        fun startsWith(prefix: String): NameCriteria =\n            NameCriteria { name ->\n                name != null &&\n                    name.uppercase(Locale.getDefault())\n                        .startsWith(prefix.uppercase(Locale.getDefault()))\n            }\n\n        @JvmStatic\n        fun `in`(vararg prefix: String): NameCriteria =\n            NameCriteria { name -> prefix.any { name.equals(it, ignoreCase = true) } }\n\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/squid/PlSqlCommentAnalyzer.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.squid\n\nobject PlSqlCommentAnalyzer {\n\n    fun getContents(comment: String) =\n        when (comment[0]) {\n            '-' -> {\n                comment.substring(2)\n            }\n            '/' -> {\n                comment.substring(2, comment.length - 2)\n            }\n            else -> {\n                throw IllegalArgumentException()\n            }\n        }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/squid/SemanticAstNode.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.squid\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.flr.api.AstNodeType\nimport com.felipebz.flr.api.Token\nimport com.felipebz.zpa.sslr.PlSqlGrammarBuilder\nimport com.felipebz.zpa.sslr.Tree\nimport com.felipebz.zpa.sslr.TreeImpl\n\nimport com.felipebz.zpa.api.symbols.PlSqlType\nimport com.felipebz.zpa.api.symbols.Symbol\nimport com.felipebz.zpa.api.symbols.datatype.PlSqlDatatype\nimport com.felipebz.zpa.api.symbols.datatype.UnknownDatatype\n\nclass SemanticAstNode(type: AstNodeType, name: String, token: Token?) : AstNode(type, name, token) {\n    constructor(token: Token) : this(token.type, token.type.name, token)\n\n    private var internalTree: Tree? = null\n\n    var symbol: Symbol? = null\n        set(symbol) {\n            field = symbol\n\n            val child = if (children.count() == 1) children[0] else return\n            (child as SemanticAstNode).symbol = symbol\n        }\n\n    var plSqlDatatype: PlSqlDatatype = UnknownDatatype\n        get() = this.symbol?.datatype ?: field\n\n    val plSqlType: PlSqlType\n        get() = plSqlDatatype.type\n\n    val tree: Tree\n        get() {\n            internalTree?.let { return it }\n\n            var classType = PlSqlGrammarBuilder.classForType(super.type)\n            if (classType == TreeImpl::class.java) {\n                var node = this\n                while (classType == TreeImpl::class.java && node.numberOfChildren == 1) {\n                    node = node.firstChild as SemanticAstNode\n                    classType = PlSqlGrammarBuilder.classForType(node.type)\n                }\n            }\n\n            val instance = classType.getDeclaredConstructor(SemanticAstNode::class.java)\n                .newInstance(this)\n            internalTree = instance\n            return instance\n        }\n\n    val allTokensToString: String\n        get() = tokens.joinToString(\" \") { it.originalValue }\n\n    override fun toString(): String {\n        return buildString {\n            append(name)\n            if (tokenOrNull != null) {\n                append(\" value='\").append(token.value).append(\"'\")\n                append(\" line=\").append(token.line)\n                append(\" column=\").append(token.column)\n            }\n            if (plSqlDatatype !is UnknownDatatype) {\n                append(\" datatype=\")\n                append(plSqlDatatype)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/symbols/PlSqlType.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.symbols\n\nenum class PlSqlType {\n\n    UNKNOWN,\n    CHARACTER,\n    NUMERIC,\n    DATE,\n    LOB,\n    BOOLEAN,\n    ROWTYPE,\n    ASSOCIATIVE_ARRAY,\n    NULL,\n    RECORD,\n    JSON,\n    EXCEPTION;\n\n    val isCharacter: Boolean\n        get() = this == CHARACTER\n\n    val isNumeric: Boolean\n        get() = this == NUMERIC\n\n    val isUnknown: Boolean\n        get() = this == UNKNOWN\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/symbols/Scope.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.symbols\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.flr.api.AstNodeType\nimport com.felipebz.flr.api.Token\nimport com.felipebz.zpa.api.PlSqlFile\nimport java.util.*\n\ninterface Scope {\n    val isAutonomousTransaction: Boolean\n    val isOverridingMember: Boolean\n    val symbols: List<Symbol>\n    val tree: AstNode?\n    val outer: Scope?\n    val identifier: String?\n    val hasExceptionHandler: Boolean\n    val path: List<String>\n    val innerScopes: List<Scope>\n    val type: AstNodeType?\n    val isGlobal: Boolean\n    val plSqlFile: PlSqlFile?\n    val firstToken: Token?\n    val lastToken: Token?\n\n    /**\n     * @param kind of the symbols to look for\n     * @return the symbols corresponding to the given kind\n     */\n    fun getSymbols(kind: Symbol.Kind): List<Symbol>\n\n    fun getSymbolsAcessibleInScope(name: String, vararg kinds: Symbol.Kind): Deque<Symbol>\n    fun addSymbol(symbol: Symbol)\n    fun getSymbol(name: String, vararg kinds: Symbol.Kind): Symbol?\n    fun getSymbol(name: String, path: List<String>, vararg kinds: Symbol.Kind): Symbol?\n    fun addInnerScope(scope: Scope)\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/symbols/Symbol.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.symbols\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.symbols.datatype.PlSqlDatatype\nimport com.felipebz.zpa.api.symbols.datatype.UnknownDatatype\nimport java.util.*\n\nopen class Symbol(val node: AstNode?,\n                  val kind: Kind,\n                  val scope: Scope,\n                  datatype: PlSqlDatatype?,\n                  name: String = \"\") {\n    private val internalUsages = mutableListOf<AstNode>()\n    private var internalModifiers = mutableListOf<AstNode>()\n\n    enum class Kind(val value: String) {\n        VARIABLE(\"variable\"),\n        PARAMETER(\"parameter\"),\n        CURSOR(\"cursor\"),\n        TYPE(\"type\"),\n        PACKAGE(\"package\"),\n        PROCEDURE(\"procedure\"),\n        FUNCTION(\"function\"),\n        TRIGGER(\"trigger\"),\n    }\n\n    val declaration by lazy { node ?: throw IllegalStateException(\"Symbol must have a declaration\") }\n\n    val name: String = node?.tokenValue ?: name\n\n    val type: PlSqlType = datatype?.type ?: PlSqlType.UNKNOWN\n\n    val datatype: PlSqlDatatype = datatype ?: UnknownDatatype\n\n    val modifiers: List<AstNode>\n        get() = Collections.unmodifiableList(internalModifiers)\n\n    val usages: List<AstNode>\n        get() = Collections.unmodifiableList(internalUsages)\n\n    val isGlobal: Boolean = if (kind in arrayOf(Kind.VARIABLE, Kind.CURSOR, Kind.TYPE)) {\n        scope.isGlobal && scope.type == PlSqlGrammar.CREATE_PACKAGE\n    } else {\n        scope.isGlobal\n    }\n\n    var innerScope: Scope? = null\n\n    fun hasModifier(modifier: String): Boolean {\n        for (syntaxToken in modifiers) {\n            if (syntaxToken.tokenValue.equals(modifier, ignoreCase = true)) {\n                return true\n            }\n        }\n        return false\n    }\n\n    fun addModifiers(modifiers: List<AstNode>) {\n        internalModifiers.addAll(modifiers)\n    }\n\n    fun addUsage(usage: AstNode) {\n        internalUsages.add(usage)\n    }\n\n    fun `is`(kind: Kind) = kind == this.kind\n\n    fun called(name: String) = if (name.startsWith('\"')) {\n        name == this.name\n    } else {\n        name.equals(this.name, ignoreCase = true)\n    }\n\n    override fun toString() = \"Symbol name=$name kind=$kind datatype=$datatype\"\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/symbols/SymbolTable.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.symbols\n\nimport com.felipebz.flr.api.AstNode\n\ninterface SymbolTable {\n\n    val symbols: List<Symbol>\n\n    val scopes: Set<Scope>\n\n    fun getScopeFor(symbol: AstNode): Scope?\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/symbols/datatype/AssociativeArrayDatatype.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.symbols.datatype\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.symbols.PlSqlType\nimport com.felipebz.zpa.api.symbols.Scope\n\nclass AssociativeArrayDatatype(node: AstNode? = null, currentScope: Scope?, val nestedType: PlSqlDatatype) : PlSqlDatatype {\n    override val type = PlSqlType.ASSOCIATIVE_ARRAY\n\n    override val name: String = currentScope?.let {\n        if (it.identifier != null && it.type == PlSqlGrammar.CREATE_PACKAGE)\n            it.identifier + \".\"\n        else \"\" } +\n        node?.getFirstChild(PlSqlGrammar.IDENTIFIER_NAME)?.tokenValue\n\n    override fun toString(): String {\n        return \"AssociativeArray{nestedType=$nestedType}\"\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/symbols/datatype/BooleanDatatype.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.symbols.datatype\n\nimport com.felipebz.zpa.api.symbols.PlSqlType\n\nclass BooleanDatatype : PlSqlDatatype {\n    override val type = PlSqlType.BOOLEAN\n\n    override val name: String = \"BOOLEAN\"\n\n    override fun toString(): String {\n        return \"Boolean\"\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/symbols/datatype/CharacterDatatype.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.symbols.datatype\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.symbols.PlSqlType\n\nclass CharacterDatatype : PlSqlDatatype {\n\n    override val type = PlSqlType.CHARACTER\n\n    override val name: String\n        get() = if (this.length == null)\n            \"VARCHAR2\"\n        else\n            \"VARCHAR2(${this.length})\"\n\n    val length: Int?\n\n    constructor() {\n        length = null\n    }\n\n    constructor(length: Int?) {\n        this.length = if (length != null && length > 0) length else null\n    }\n\n    constructor(node: AstNode? = null) {\n        val constraint = node?.firstChildOrNull?.getFirstChildOrNull(PlSqlGrammar.CHARACTER_DATATYPE_CONSTRAINT)\n        length = constraint\n            ?.getFirstChildOrNull(PlSqlGrammar.LITERAL)\n            ?.tokenValue?.toInt()\n    }\n\n    override fun toString(): String {\n        return \"Character{length=$length}\"\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/symbols/datatype/DateDatatype.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.symbols.datatype\n\nimport com.felipebz.zpa.api.symbols.PlSqlType\n\nclass DateDatatype : PlSqlDatatype {\n    override val type = PlSqlType.DATE\n\n    override val name: String = \"DATE\"\n\n    override fun toString(): String {\n        return \"Date\"\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/symbols/datatype/ExceptionDatatype.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.symbols.datatype\n\nimport com.felipebz.zpa.api.symbols.PlSqlType\n\nclass ExceptionDatatype : PlSqlDatatype {\n    override val type = PlSqlType.EXCEPTION\n\n    override val name: String = \"EXCEPTION\"\n\n    override fun toString(): String {\n        return \"Exception\"\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/symbols/datatype/JsonDatatype.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.symbols.datatype\n\nimport com.felipebz.zpa.api.symbols.PlSqlType\n\nclass JsonDatatype : PlSqlDatatype {\n    override val type = PlSqlType.JSON\n\n    override val name: String = \"JSON\"\n\n    override fun toString(): String {\n        return \"Json\"\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/symbols/datatype/LobDatatype.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.symbols.datatype\n\nimport com.felipebz.zpa.api.symbols.PlSqlType\n\nclass LobDatatype : PlSqlDatatype {\n    override val type = PlSqlType.LOB\n\n    override val name: String = \"LOB\"\n\n    override fun toString(): String {\n        return \"Lob\"\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/symbols/datatype/NullDatatype.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.symbols.datatype\n\nimport com.felipebz.zpa.api.symbols.PlSqlType\n\nclass NullDatatype : PlSqlDatatype {\n    override val type = PlSqlType.NULL\n\n    override val name: String = \"NULL\"\n\n    override fun toString(): String {\n        return \"Null\"\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/symbols/datatype/NumericDatatype.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.symbols.datatype\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.symbols.PlSqlType\n\nclass NumericDatatype : PlSqlDatatype {\n\n    override val type = PlSqlType.NUMERIC\n\n    override val name: String\n        get() = if (this.length == null)\n            \"NUMBER()\"\n        else if (this.scale == null)\n            \"NUMBER(${this.length})\"\n        else\n            \"NUMBER(${this.length}, ${this.scale})\"\n\n    val length: Int?\n    val scale: Int?\n\n    constructor() {\n        length = null\n        scale = null\n    }\n\n    constructor(length: Int?, scale: Int?) {\n        this.length = if (length != null && length > 0) length else null\n        this.scale = if (scale != null && scale > 0) scale else null\n    }\n\n    constructor(node: AstNode? = null) {\n        val constraint = node?.firstChildOrNull?.getFirstChildOrNull(PlSqlGrammar.NUMERIC_DATATYPE_CONSTRAINT)\n        if (constraint != null) {\n            val precisionNode = constraint.getFirstChildOrNull(PlSqlGrammar.NUMERIC_PRECISION)\n            length = if (precisionNode != null && precisionNode.hasDirectChildren(PlSqlGrammar.LITERAL)) {\n                precisionNode.tokenValue.toInt()\n            } else {\n                null\n            }\n\n            val scaleNode = constraint.getFirstChildOrNull(PlSqlGrammar.NUMERIC_SCALE)\n            scale = if (scaleNode != null && scaleNode.hasDirectChildren(PlSqlGrammar.LITERAL)) {\n                scaleNode.tokenValue.toInt()\n            } else {\n                null\n            }\n        } else {\n            length = null\n            scale = null\n        }\n    }\n\n    override fun toString(): String {\n        return \"Numeric{length=$length, scale=$scale}\"\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/symbols/datatype/PlSqlDatatype.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.symbols.datatype\n\nimport com.felipebz.zpa.api.symbols.PlSqlType\n\ninterface PlSqlDatatype {\n    val type: PlSqlType\n    val name: String?\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/symbols/datatype/RecordDatatype.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.symbols.datatype\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.symbols.PlSqlType\nimport com.felipebz.zpa.api.symbols.Scope\nimport com.felipebz.zpa.api.symbols.Symbol\n\nclass RecordDatatype(node: AstNode? = null, currentScope: Scope?, val fields: List<Symbol>) : PlSqlDatatype {\n    override val type = PlSqlType.RECORD\n\n    override val name: String = currentScope?.let {\n        if (it.identifier != null && it.type == PlSqlGrammar.CREATE_PACKAGE)\n            it.identifier + \".\"\n        else \"\" } +\n        node?.getFirstChild(PlSqlGrammar.IDENTIFIER_NAME)?.tokenValue\n\n    override fun toString(): String {\n        return \"Record\"\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/symbols/datatype/RowtypeDatatype.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.symbols.datatype\n\nimport com.felipebz.zpa.api.symbols.PlSqlType\n\nclass RowtypeDatatype : PlSqlDatatype {\n    override val type = PlSqlType.ROWTYPE\n\n    override val name: String? = null\n\n    override fun toString(): String {\n        return \"Rowtype\"\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/api/symbols/datatype/UnknownDatatype.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.symbols.datatype\n\nimport com.felipebz.zpa.api.symbols.PlSqlType\n\nobject UnknownDatatype : PlSqlDatatype {\n    override val type = PlSqlType.UNKNOWN\n\n    override val name: String? = null\n\n    override fun toString(): String {\n        return \"Unknown\"\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/checks/IssueLocation.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.flr.api.Token\n\nabstract class IssueLocation private constructor(private val message: String) {\n\n    fun message() = message\n\n    abstract fun startLine(): Int\n\n    abstract fun startLineOffset(): Int\n\n    abstract fun endLine(): Int\n\n    abstract fun endLineOffset(): Int\n\n    private class PreciseIssueLocation : IssueLocation {\n\n        private val firstToken: Token\n        private val lastToken: Token\n\n        constructor(node: AstNode, message: String) : super(message) {\n            this.firstToken = node.token\n            this.lastToken = node.lastToken\n        }\n\n        constructor(startNode: AstNode, endNode: AstNode, message: String) : super(message) {\n            this.firstToken = startNode.token\n            this.lastToken = endNode.lastToken\n        }\n\n        override fun startLine() = firstToken.line\n\n        override fun startLineOffset() = firstToken.column\n\n        override fun endLine() = lastToken.endLine\n\n        override fun endLineOffset() = lastToken.endColumn\n\n    }\n\n    private class LineLevelIssueLocation(message: String, private val lineNumber: Int) : IssueLocation(message) {\n\n        override fun startLine() = lineNumber\n\n        override fun startLineOffset() = UNDEFINED_OFFSET\n\n        override fun endLine() = lineNumber\n\n        override fun endLineOffset() = UNDEFINED_OFFSET\n\n    }\n\n    private class FileLevelIssueLocation(message: String) : IssueLocation(message) {\n\n        override fun startLine() = UNDEFINED_LINE\n\n        override fun startLineOffset() = UNDEFINED_OFFSET\n\n        override fun endLine() = UNDEFINED_LINE\n\n        override fun endLineOffset() = UNDEFINED_OFFSET\n\n    }\n\n    companion object {\n\n        const val UNDEFINED_OFFSET = -1\n\n        const val UNDEFINED_LINE = 0\n\n        fun atFileLevel(message: String): IssueLocation =\n            FileLevelIssueLocation(message)\n\n        fun atLineLevel(message: String, lineNumber: Int): IssueLocation =\n            LineLevelIssueLocation(message, lineNumber)\n\n        fun preciseLocation(startNode: AstNode, endNode: AstNode, message: String): IssueLocation =\n            PreciseIssueLocation(startNode, endNode, message)\n\n        fun preciseLocation(startNode: AstNode, message: String): IssueLocation =\n            PreciseIssueLocation(startNode, message)\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/grammar/ExecutePlSqlBufferExpression.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.grammar\n\nimport com.felipebz.flr.api.GenericTokenType\nimport com.felipebz.flr.internal.matchers.Matcher\nimport com.felipebz.flr.internal.vm.Machine\nimport com.felipebz.flr.internal.vm.NativeExpression\nimport com.felipebz.zpa.api.PlSqlPunctuator\n\npublic object ExecuteBufferExpression : NativeExpression(), Matcher {\n    override fun execute(machine: Machine) {\n        if (machine.length < 2) {\n            machine.backtrack()\n            return\n        }\n\n        val previousTokenLine = if (machine.index == 0) 0 else machine.tokenAt(-1).line\n        val token = machine.tokenAt(0)\n        val nextToken = machine.tokenAt(1)\n\n        if (token.type == PlSqlPunctuator.DIVISION && token.column == 0\n            && (token.line != previousTokenLine || previousTokenLine == 0)\n            && (token.line != nextToken.line || nextToken.type == GenericTokenType.EOF)\n        ) {\n            machine.createLeafNode(this, 1)\n            machine.jump(1)\n        } else {\n            machine.backtrack()\n        }\n    }\n\n    override fun toString(): String {\n        return \"ExecuteBuffer\"\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/lexer/CommentChannel.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.lexer\n\nimport com.felipebz.flr.channel.Channel\nimport com.felipebz.flr.channel.CodeReader\nimport com.felipebz.flr.impl.LexerOutput\nimport com.felipebz.flr.impl.channel.CommentRegexpChannel\n\nprivate const val inlineComment = \"--[^\\\\n\\\\r]*+\"\nprivate const val multiLineComment = \"/\\\\*[\\\\s\\\\S]*?\\\\*/\"\n\nclass CommentChannel private constructor(private val commentRegexpChannel: CommentRegexpChannel)\n    : Channel<LexerOutput> by commentRegexpChannel {\n\n    constructor(): this(CommentRegexpChannel(\"(?:$inlineComment|$multiLineComment)\"))\n\n    override fun consume(code: CodeReader, output: LexerOutput): Boolean {\n        val nextChar = code.peek().toChar()\n        if (nextChar != '-' && nextChar != '/') {\n            return false\n        }\n\n        return commentRegexpChannel.consume(code, output)\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/lexer/DateChannel.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.lexer\n\nimport com.felipebz.flr.channel.Channel\nimport com.felipebz.flr.channel.CodeReader\nimport com.felipebz.flr.impl.LexerOutput\nimport com.felipebz.flr.impl.channel.RegexpChannel\n\nclass DateChannel(private val regexpChannel: RegexpChannel)\n    : Channel<LexerOutput> by regexpChannel {\n\n    override fun consume(code: CodeReader, output: LexerOutput): Boolean {\n        val nextChar = code.peek().toChar().lowercaseChar()\n        if (nextChar != 'd' && nextChar != 't') {\n            return false\n        }\n\n        return regexpChannel.consume(code, output)\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/lexer/DiscardWhitespaceChannel.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.lexer\n\nimport com.felipebz.flr.channel.Channel\nimport com.felipebz.flr.channel.CodeReader\nimport com.felipebz.flr.impl.LexerOutput\n\nclass DiscardWhitespaceChannel : Channel<LexerOutput> {\n\n    override fun consume(code: CodeReader, output: LexerOutput): Boolean {\n        if (code[0].isWhitespace() && code[1] != '&') {\n            code.pop()\n            return true\n        }\n        return false\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/lexer/IdentifierChannel.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.lexer\n\nimport com.felipebz.flr.channel.Channel\nimport com.felipebz.flr.channel.CodeReader\nimport com.felipebz.flr.impl.LexerOutput\nimport com.felipebz.flr.impl.channel.IdentifierAndKeywordChannel\n\nclass IdentifierChannel(private val channel: IdentifierAndKeywordChannel)\n    : Channel<LexerOutput> by channel {\n\n    override fun consume(code: CodeReader, output: LexerOutput): Boolean {\n        val nextChar = code.peek().toChar()\n        if (!nextChar.isLetter()) {\n            return false\n        }\n\n        return channel.consume(code, output)\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/lexer/IntegerChannel.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.lexer\n\nimport com.felipebz.flr.api.Token\nimport com.felipebz.flr.channel.Channel\nimport com.felipebz.flr.channel.CodeReader\nimport com.felipebz.flr.impl.LexerOutput\nimport com.felipebz.zpa.api.PlSqlTokenType\n\nclass IntegerChannel : Channel<LexerOutput>  {\n\n    override fun consume(code: CodeReader, output: LexerOutput): Boolean {\n        var tmpBuilder: StringBuilder? = null\n\n        var pos = 0\n        var nextChar = code.intAt(pos++).toChar()\n        while (nextChar.isDigit()) {\n            tmpBuilder = tmpBuilder ?: StringBuilder(5)\n            tmpBuilder.append(nextChar)\n            nextChar = code.intAt(pos++).toChar()\n        }\n\n        if (tmpBuilder.isNullOrEmpty()) {\n            return false\n        }\n\n        val value = tmpBuilder.toString()\n        val token = Token.builder()\n            .setType(PlSqlTokenType.INTEGER_LITERAL)\n            .setValueAndOriginalValue(value)\n            .setLine(code.getLinePosition())\n            .setColumn(code.getColumnPosition())\n            .build()\n        output.addToken(token)\n\n        /* Advance the CodeReader stream by the length of the punctuator */\n        for (j in value.indices) {\n            code.pop()\n        }\n        return true\n\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/lexer/NumericChannel.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.lexer\n\nimport com.felipebz.flr.channel.Channel\nimport com.felipebz.flr.channel.CodeReader\nimport com.felipebz.flr.impl.LexerOutput\nimport com.felipebz.flr.impl.channel.RegexpChannel\n\nclass NumericChannel(private val regexpChannel: RegexpChannel)\n    : Channel<LexerOutput> by regexpChannel {\n\n    override fun consume(code: CodeReader, output: LexerOutput): Boolean {\n        val nextChar = code.peek().toChar()\n        if (nextChar !in '0'..'9' && nextChar != '.') {\n            return false\n        }\n\n        return regexpChannel.consume(code, output)\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/lexer/PlSqlLexer.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.lexer\n\nimport com.felipebz.flr.impl.Lexer\nimport com.felipebz.flr.impl.channel.BlackHoleChannel\nimport com.felipebz.flr.impl.channel.IdentifierAndKeywordChannel\nimport com.felipebz.flr.impl.channel.PunctuatorChannel\nimport com.felipebz.flr.impl.channel.RegexpChannelBuilder.and\nimport com.felipebz.flr.impl.channel.RegexpChannelBuilder.g\nimport com.felipebz.flr.impl.channel.RegexpChannelBuilder.o2n\nimport com.felipebz.flr.impl.channel.RegexpChannelBuilder.or\nimport com.felipebz.flr.impl.channel.RegexpChannelBuilder.regexp\nimport com.felipebz.flr.impl.channel.UnknownCharacterChannel\nimport com.felipebz.zpa.squid.PlSqlConfiguration\nimport com.felipebz.zpa.api.PlSqlKeyword\nimport com.felipebz.zpa.api.PlSqlPunctuator\nimport com.felipebz.zpa.api.PlSqlTokenType\n\nobject PlSqlLexer {\n    private val NUMBER_LITERAL = \"(?is)(?:\" + or(\n        \"\"\"(?:(?:\\d++(?![.][.])[.]\\d*+)|(?![.][.])[.]\\d++)(?:e[+-]?\\d++)?[fd]?\"\"\", // decimal value in floating-point literal\n        \"\"\"\\d++(?:e[+-]?\\d++)?[fd]\"\"\", // integer value in floating-point literal\n        \"\"\"\\d++(?:e[+-]?\\d++)\"\"\" // number literal in scientific notation\n    ) + \")\"\n\n    private const val CUSTOM_DELIMITER_START = \"\"\"[^\\s{\\[<\\(]\"\"\" // any except spacing\n    private const val CUSTOM_DELIMITER_END = \"\"\"\\1\"\"\" // same as the start\n\n    private val STRING_LITERAL = (\"(?is)(?:\"\n        + or(\"\"\"?:n?'(?:[^']|'')*+'\"\"\", // simple text literal\n        \"n?q?'\" + or(\"?:\" + g(\"?:\" + g(CUSTOM_DELIMITER_START) + \".*?(?:\" + CUSTOM_DELIMITER_END + \"')\"),\n            g(\"\"\"?:\\(.*?\\)'\"\"\"),\n            g(\"\"\"?:\\[.*?\\]'\"\"\"),\n            g(\"\"\"?:<.*?>'\"\"\"),\n            g(\"\"\"?:\\{.*?\\}'\"\"\"))) // text with user-defined delimiter\n        + \")\")\n\n    private const val DATE_LITERAL = \"\"\"(?i)(?:DATE\\s*?'\\d{4}-\\d{2}-\\d{2}')\"\"\"\n\n    private const val TIMESTAMP_LITERAL = \"\"\"(?i)TIMESTAMP\\s*?'\\d{4}-\\d{2}-\\d{2}\\s++\\d{1,2}:\\d{2}:\\d{2}(?:.\\d{1,9})?(?:\\s++[A-Z0-9_/+-:]++(?:\\s++[A-Z0-9_/+-]{1,5})?)?'\"\"\"\n\n    private val SIMPLE_IDENTIFIER = and(\"\"\"[\\w\\p{L}]\"\"\", o2n(\"\"\"[\\w\\p{L}#$]\"\"\"))\n\n    private const val QUOTED_IDENTIFIER = \"\"\"\".+?\"\"\"\"\n\n    fun create(conf: PlSqlConfiguration): Lexer =\n        Lexer.builder()\n            .withCharset(conf.charset)\n            .withFailIfNoChannelToConsumeOneCharacter(true)\n            .withChannel(DiscardWhitespaceChannel())\n            .withChannel(CommentChannel())\n            .withChannel(NumericChannel(regexp(PlSqlTokenType.NUMBER_LITERAL, NUMBER_LITERAL)))\n            .withChannel(IntegerChannel())\n            .withChannel(StringChannel(regexp(PlSqlTokenType.STRING_LITERAL, STRING_LITERAL)))\n            .withChannel(DateChannel(regexp(PlSqlTokenType.DATE_LITERAL, DATE_LITERAL)))\n            .withChannel(DateChannel(regexp(PlSqlTokenType.TIMESTAMP_LITERAL, TIMESTAMP_LITERAL)))\n            .withChannel(IdentifierChannel(IdentifierAndKeywordChannel(SIMPLE_IDENTIFIER, false,\n                PlSqlKeyword.entries.toTypedArray()\n            )))\n            .withChannel(QuotedIdentifierChannel(QUOTED_IDENTIFIER, SIMPLE_IDENTIFIER))\n            .withChannel(PunctuatorChannel(*PlSqlPunctuator.entries.toTypedArray()))\n            .withChannel(BlackHoleChannel(\"(?is)\" + or(\n                \"\\\\s&&?$SIMPLE_IDENTIFIER\",\n                \"\\\\\\$if.*?\\\\\\$then\",\n                \"\\\\\\$else.*?\\\\\\$end\",\n                \"\\\\\\$error.*?\\\\\\$end\",\n                \"\\\\\\$end\"\n            )))\n            .withChannel(UnknownCharacterChannel())\n            .build()\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/lexer/QuotedIdentifierChannel.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.lexer\n\nimport com.felipebz.flr.api.GenericTokenType\nimport com.felipebz.flr.api.Token\nimport com.felipebz.flr.channel.Channel\nimport com.felipebz.flr.channel.CodeReader\nimport com.felipebz.flr.impl.LexerOutput\nimport java.util.regex.Pattern\n\n\nclass QuotedIdentifierChannel(quotedIdentifierRegexp: String, simpleIdentifierRegexp: String) : Channel<LexerOutput> {\n\n    private val quotedPattern = Pattern.compile(quotedIdentifierRegexp)\n    private val quotedSimplePattern = Pattern.compile(\"\"\"\"$simpleIdentifierRegexp\"\"\"\")\n\n    override fun consume(code: CodeReader, output: LexerOutput): Boolean {\n        val nextChar = code.peek().toChar()\n        if (nextChar != '\"') {\n            return false\n        }\n\n        val tmpBuilder = StringBuilder()\n        val matcher = quotedPattern.matcher(\"\")\n\n        if (code.popTo(matcher, tmpBuilder) > 0) {\n            var word = tmpBuilder.toString()\n            val wordOriginal = word\n            if (quotedSimplePattern.matcher(word).matches() && word == word.uppercase()) {\n                word = word.substring(1, word.length - 1)\n            }\n\n            val token = Token.builder()\n                .setType(GenericTokenType.IDENTIFIER)\n                .setValueAndOriginalValue(word, wordOriginal)\n                .setLine(code.previousCursor.line)\n                .setColumn(code.previousCursor.column)\n                .build()\n            output.addToken(token)\n            return true\n        }\n\n        return false\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/lexer/StringChannel.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.lexer\n\nimport com.felipebz.flr.channel.Channel\nimport com.felipebz.flr.channel.CodeReader\nimport com.felipebz.flr.impl.LexerOutput\nimport com.felipebz.flr.impl.channel.RegexpChannel\n\nclass StringChannel(private val regexpChannel: RegexpChannel)\n    : Channel<LexerOutput> by regexpChannel {\n\n    override fun consume(code: CodeReader, output: LexerOutput): Boolean {\n        val nextChar = code.peek().toChar().lowercaseChar()\n        if (nextChar != '\\'' && nextChar != 'n' && nextChar != 'q') {\n            return false\n        }\n\n        return regexpChannel.consume(code, output)\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/metadata/FormsMetadata.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.metadata\n\nimport com.fasterxml.jackson.databind.ObjectMapper\nimport com.felipebz.zpa.utils.log.Loggers\nimport java.io.File\nimport java.io.FileNotFoundException\nimport java.io.IOException\n\nclass Block @JvmOverloads constructor(val name: String = \"\", val items: Array<String> = emptyArray())\n\nclass FormsMetadata {\n\n    var alerts = listOf<String>()\n    var blocks = listOf<Block>()\n    var lovs = listOf<String>()\n\n    companion object {\n        private val LOG = Loggers.getLogger(FormsMetadata::class.java)\n\n        fun loadFromFile(path: String?): FormsMetadata? {\n            if (!path.isNullOrEmpty()) {\n                try {\n                    val mapper = ObjectMapper()\n                    val formsMetadata: FormsMetadata = mapper.readValue(File(path), FormsMetadata::class.java)\n                    LOG.info(\"Loaded Oracle Forms metadata from {}.\", path)\n                    return formsMetadata\n                } catch (e: FileNotFoundException) {\n                    LOG.warn(\"The metadata file {} was not found.\", path, e)\n                } catch (e: IOException) {\n                    LOG.error(\"Error reading the metadata file at {}.\", path, e)\n                }\n\n            }\n            return null\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/metrics/ComplexityVisitor.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.metrics\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.PlSqlKeyword\nimport com.felipebz.zpa.api.checks.PlSqlCheck\n\nopen class ComplexityVisitor : PlSqlCheck() {\n\n    var complexity: Int = 0\n        private set\n\n    override fun init() {\n        subscribeTo(\n                PlSqlGrammar.CREATE_PROCEDURE,\n                PlSqlGrammar.CREATE_FUNCTION,\n                PlSqlGrammar.ANONYMOUS_BLOCK,\n\n                PlSqlGrammar.PROCEDURE_DECLARATION,\n                PlSqlGrammar.FUNCTION_DECLARATION,\n\n                PlSqlGrammar.LOOP_STATEMENT,\n                PlSqlGrammar.CONTINUE_STATEMENT,\n                PlSqlGrammar.FOR_STATEMENT,\n                PlSqlGrammar.EXIT_STATEMENT,\n                PlSqlGrammar.IF_STATEMENT,\n                PlSqlGrammar.RAISE_STATEMENT,\n                PlSqlGrammar.RETURN_STATEMENT,\n                PlSqlGrammar.WHILE_STATEMENT,\n\n                // this includes WHEN in exception handlers, exit/continue statements and CASE expressions\n                PlSqlKeyword.WHEN,\n                PlSqlKeyword.ELSIF)\n    }\n\n    override fun visitFile(node: AstNode) {\n        complexity = 0\n    }\n\n    override fun visitNode(node: AstNode) {\n        complexity++\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/metrics/FunctionComplexityVisitor.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.metrics\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.checks.PlSqlCheck\n\nclass FunctionComplexityVisitor : PlSqlCheck() {\n    var numberOfFunctions: Int = 0\n        private set\n\n    override fun init() {\n        subscribeTo(PlSqlGrammar.CREATE_PROCEDURE,\n            PlSqlGrammar.CREATE_FUNCTION,\n            PlSqlGrammar.PROCEDURE_DECLARATION,\n            PlSqlGrammar.FUNCTION_DECLARATION)\n    }\n\n    override fun visitNode(node: AstNode) {\n        numberOfFunctions++\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/metrics/MetricsVisitor.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.metrics\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.flr.api.Token\nimport com.felipebz.flr.api.Trivia\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.checks.PlSqlCheck\n\nclass MetricsVisitor : PlSqlCheck() {\n\n    var numberOfStatements: Int = 0\n        private set\n    private val linesOfCode = HashSet<Int>()\n    private val linesOfComments = HashSet<Int>()\n    private val noSonar = HashSet<Int>()\n    private val executableLines = HashSet<Int>()\n\n    val linesWithNoSonar: Set<Int>\n        get() = noSonar\n\n    override fun init() {\n        subscribeTo(PlSqlGrammar.STATEMENT)\n    }\n\n    override fun visitNode(node: AstNode) {\n        if (node.hasDirectChildren(PlSqlGrammar.BLOCK_STATEMENT))\n            return\n\n        numberOfStatements++\n        executableLines.add(node.tokenLine)\n    }\n\n    override fun visitToken(token: Token) {\n        for (line in token.line .. token.endLine) {\n            linesOfCode.add(line)\n        }\n    }\n\n    override fun visitComment(trivia: Trivia, content: String) {\n        val comment = trivia.token.value\n        val line = trivia.token.line\n        val endLine = trivia.token.endLine\n        val firstLineContainsNoSonar = comment.indexOfAny(newlineChars).let {\n            if (it == -1) {\n                comment.contains(\"NOSONAR\")\n            } else {\n                comment.regionMatches(0, \"NOSONAR\", 0, it)\n            }\n        }\n\n        for (i in line .. endLine) {\n            linesOfComments.add(i)\n        }\n\n        if (firstLineContainsNoSonar) {\n            linesOfComments.remove(line)\n            noSonar.add(line)\n        }\n    }\n\n    fun getLinesOfCode(): Set<Int> = linesOfCode\n\n    fun getLinesOfComments(): Set<Int> = linesOfComments\n\n    fun getExecutableLines(): Set<Int> = executableLines\n\n    companion object {\n        private val newlineChars = charArrayOf('\\n', '\\r')\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/parser/PlSqlParser.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.parser\n\nimport com.felipebz.flr.api.Grammar\nimport com.felipebz.flr.impl.Parser\nimport com.felipebz.zpa.lexer.PlSqlLexer\nimport com.felipebz.zpa.squid.PlSqlConfiguration\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.squid.SemanticAstNode\n\nobject PlSqlParser {\n    fun create(conf: PlSqlConfiguration): Parser<Grammar> =\n        Parser.builder(PlSqlGrammar.create(conf).build())\n            .withLexer(PlSqlLexer.create(conf))\n            .withNonTerminalNodeBuilder(::SemanticAstNode)\n            .withTerminalNodeBuilder(::SemanticAstNode)\n            .build()\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/rules/ActiveRule.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.rules\n\nclass ActiveRule(\n    private val repository: ZpaRepository,\n    private val rule: ZpaRule,\n    private val configuration: ActiveRuleConfiguration?\n) : ZpaActiveRule {\n\n    override val internalKey: String\n        get() = rule.key\n\n    override val language: String\n        get() = \"plsqlopen\"\n\n    override fun param(key: String): String = configuration?.parameters?.get(key) ?: \"\"\n\n    override val params: Map<String, String>\n        get() = configuration?.parameters ?: emptyMap()\n\n    override val ruleKey: ZpaRuleKey\n        get() = RuleKey(repository.key, rule.key)\n\n    override val severity: String\n        get() = configuration?.severity ?: rule.severity\n\n    override val templateRuleKey: String?\n        get() = null\n\n    override val tags: Array<String>\n        get() = rule.tags\n\n    override val remediationConstant: String\n        get() = rule.remediationConstant\n\n    override val name: String\n        get() = rule.name\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/rules/ActiveRuleConfiguration.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.rules\n\nclass ActiveRuleConfiguration(\n    val repositoryKey: String,\n    val key: String,\n    var severity: String? = null,\n    var parameters: MutableMap<String, String> = mutableMapOf()\n) {\n    fun keyIs(repositoryKey: String, key: String): Boolean {\n        return this.repositoryKey == repositoryKey && this.key == key\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/rules/ActiveRuleConfigurer.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.rules\n\nfun interface ActiveRuleConfigurer {\n    fun apply(repo: Repository, rule: ZpaRule, configuration: ActiveRuleConfiguration): Boolean\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/rules/ActiveRules.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.rules\n\nclass ActiveRules : ZpaActiveRules {\n\n    private val repositories = mutableListOf<Repository>()\n    private val activeRuleConfigurers = mutableListOf<ActiveRuleConfigurer>()\n\n    fun addRepository(repository: Repository): ActiveRules = apply {\n        repositories.add(repository)\n    }\n\n    fun addRuleConfigurer(filter: ActiveRuleConfigurer): ActiveRules = apply {\n        activeRuleConfigurers.add(filter)\n    }\n\n    override fun findByRepository(repository: String): Collection<ZpaActiveRule> {\n        val repo = this.repositories.first { it.key == repository }\n        return repo.availableRules\n            .mapNotNull { rule ->\n                val activeRuleConfiguration = ActiveRuleConfiguration(repo.key, rule.key)\n                if (activeRuleConfigurers.all { it.apply(repo, rule, activeRuleConfiguration) }) {\n                    ActiveRule(repo, rule, activeRuleConfiguration)\n                } else {\n                    null\n                }\n            }\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/rules/Repository.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.rules\n\nclass Repository(override val key: String) : ZpaRepository {\n\n    private val rules = mutableMapOf<String, ZpaRule>()\n\n    override fun createRule(ruleKey: String): ZpaRule {\n        val rule = Rule(ruleKey)\n        rules[ruleKey] = rule\n        return rule\n    }\n\n    override fun rule(ruleKey: String): ZpaRule? = rules[ruleKey]\n\n    val availableRules: List<ZpaRule>\n        get() = rules.values.toList()\n\n    override fun toString(): String = key\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/rules/Rule.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.rules\n\nimport com.felipebz.zpa.api.annotations.RuleInfo\n\nclass Rule(override val key: String) : ZpaRule {\n\n    private val parameters =  mutableListOf<ZpaRuleParam>()\n\n    override var htmlDescription: String = \"\"\n\n    override var name: String = \"\"\n\n    override val params: List<ZpaRuleParam> = parameters\n\n    override var remediationConstant: String = \"\"\n        set(value) {\n            if (!REMEDIATION_PATTERN.matches(value)) {\n                throw IllegalArgumentException(\"Invalid base effort: $value\")\n            }\n            field = value\n        }\n\n    override var scope: RuleInfo.Scope = RuleInfo.Scope.ALL\n\n    override var severity: String = \"\"\n\n    override var status: RuleStatus = RuleStatus.READY\n\n    override var tags: Array<String> = emptyArray()\n\n    override var template: Boolean = false\n\n    override var isActivatedByDefault = false\n\n    override fun createParam(fieldKey: String): ZpaRuleParam {\n        val param = RuleParam(fieldKey)\n        parameters.add(param)\n        return param\n    }\n\n    companion object {\n        private const val DAY = \"d\"\n        private const val HOUR = \"h\"\n        private const val MINUTE = \"min\"\n        private val REMEDIATION_PATTERN = Regex(\"\\\\s*+(?:(\\\\d++)\\\\s*+$DAY)?+\\\\s*+(?:(\\\\d++)\\\\s*+$HOUR)?+\\\\s*+(?:(\\\\d++)\\\\s*+$MINUTE)?+\\\\s*+\")\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/rules/RuleData.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.rules\n\nimport com.felipebz.zpa.api.annotations.Priority\nimport com.felipebz.zpa.api.annotations.Rule\n\nclass RuleData(val key: String,\n               val name: String,\n               val description: String,\n               val priority: Priority,\n               val tags: Array<String>,\n               val status: String) {\n    companion object {\n        fun from(rule: Rule?): RuleData? =\n            if (rule == null) null\n            else RuleData(rule.key,\n                rule.name,\n                rule.description,\n                rule.priority,\n                rule.tags,\n                rule.status)\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/rules/RuleKey.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.rules\n\nclass RuleKey(override val repository: String, private val key: String) : ZpaRuleKey {\n\n    override val rule: String\n        get() = key\n\n    override fun toString(): String = \"$repository:$key\"\n\n    override fun equals(other: Any?): Boolean {\n        if (this === other) return true\n        if (other?.javaClass != javaClass) return false\n        other as RuleKey\n        return this.key == other.key && this.repository == other.repository\n    }\n\n    override fun hashCode(): Int {\n        var result = repository.hashCode()\n        result = 31 * result + key.hashCode()\n        return result\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/rules/RuleMetadataLoader.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.rules\n\nimport com.felipebz.zpa.utils.getAnnotation\nimport com.felipebz.zpa.api.annotations.Rule\nimport com.felipebz.zpa.api.annotations.RuleProperty\nimport java.lang.reflect.Field\n\nopen class RuleMetadataLoader {\n\n    open fun getRuleAnnotation(annotatedClassOrObject: Any) : RuleData? =\n        RuleData.from(getAnnotation(annotatedClassOrObject, Rule::class.java))\n\n    open fun getRulePropertyAnnotation(field: Field) : RulePropertyData? =\n        RulePropertyData.from(field.getAnnotation(RuleProperty::class.java))\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/rules/RuleParam.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.rules\n\nclass RuleParam(override val key: String) : ZpaRuleParam {\n\n    override var defaultValue: String = \"\"\n\n    override var description: String = \"\"\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/rules/RulePropertyData.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.rules\n\nimport com.felipebz.zpa.api.annotations.RuleProperty\n\nclass RulePropertyData(val key: String,\n                       val description: String,\n                       val defaultValue: String,\n                       val type: String) {\n    companion object {\n        fun from(ruleProperty: RuleProperty?) =\n            if (ruleProperty == null) null\n            else\n                RulePropertyData(ruleProperty.key,\n                    ruleProperty.description,\n                    ruleProperty.defaultValue,\n                    ruleProperty.type)\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/rules/RuleStatus.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.rules\n\nenum class RuleStatus {\n    BETA, DEPRECATED, READY, REMOVED;\n\n    companion object {\n        fun defaultStatus(): RuleStatus {\n            return READY\n        }\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/rules/RulesDefinitionAnnotationLoader.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.rules\n\nimport com.felipebz.zpa.CustomAnnotationBasedRulesDefinition.Companion.convertCheckClassName\nimport com.felipebz.zpa.utils.getFields\nimport com.felipebz.zpa.utils.log.Loggers\nimport java.lang.reflect.Field\n\nclass RulesDefinitionAnnotationLoader(private val ruleMetadataLoader: RuleMetadataLoader) {\n\n    fun load(repo: ZpaRepository, vararg annotatedClasses: Class<*>) {\n        for (annotatedClass in annotatedClasses) {\n            loadRule(repo, annotatedClass)\n        }\n    }\n\n    private fun loadRule(repo: ZpaRepository, clazz: Class<*>): ZpaRule? {\n        val ruleAnnotation = ruleMetadataLoader.getRuleAnnotation(clazz)\n        return if (ruleAnnotation != null) {\n            loadRule(repo, clazz, ruleAnnotation)\n        } else {\n            LOG.warn(\"The class \" + clazz.canonicalName + \" should be annotated with @Rule\")\n            null\n        }\n    }\n    private fun loadRule(repo: ZpaRepository, clazz: Class<*>, ruleAnnotation: RuleData): ZpaRule {\n        val ruleKey = ruleAnnotation.key.ifEmpty { convertCheckClassName(clazz) }\n        val ruleName = ruleAnnotation.name\n        val description = ruleAnnotation.description\n\n        val rule = repo.createRule(ruleKey)\n        rule.name = ruleName\n        rule.htmlDescription = description\n        rule.severity = ruleAnnotation.priority.name\n        rule.status = RuleStatus.valueOf(ruleAnnotation.status)\n        rule.tags = ruleAnnotation.tags\n\n        val fields = getFields(clazz, true)\n        for (field in fields) {\n            loadParameters(rule, field)\n        }\n\n        return rule\n    }\n\n    private fun loadParameters(rule: ZpaRule, field: Field) {\n        val propertyAnnotation = ruleMetadataLoader.getRulePropertyAnnotation(field)\n        if (propertyAnnotation != null) {\n            val fieldKey = propertyAnnotation.key.ifEmpty { field.name }\n            val param = rule.createParam(fieldKey)\n            param.description = propertyAnnotation.description\n            param.defaultValue = propertyAnnotation.defaultValue\n        }\n    }\n\n    companion object {\n        private val LOG = Loggers.getLogger(RulesDefinitionAnnotationLoader::class.java)\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/rules/ZpaActiveRule.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.rules\n\ninterface ZpaActiveRule {\n    val ruleKey: ZpaRuleKey\n    val severity: String\n    val language: String\n    fun param(key: String): String?\n    val params: Map<String, String>\n    val internalKey: String?\n    val templateRuleKey: String?\n    val tags: Array<String>\n    val remediationConstant: String\n    val name: String\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/rules/ZpaActiveRules.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.rules\n\ninterface ZpaActiveRules {\n    fun findByRepository(repository: String): Collection<ZpaActiveRule>\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/rules/ZpaChecks.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.rules\n\nimport com.felipebz.zpa.CustomAnnotationBasedRulesDefinition.Companion.getRuleKey\nimport com.felipebz.zpa.utils.getFields\nimport com.felipebz.zpa.api.checks.PlSqlVisitor\nimport java.lang.reflect.Field\nimport java.util.*\n\nopen class ZpaChecks constructor(private val activeRules: ZpaActiveRules,\n                                 private val repository: String,\n                                 private val ruleMetadataLoader: RuleMetadataLoader) {\n    private val checkByRule = HashMap<ZpaRuleKey, PlSqlVisitor>()\n    private val ruleByCheck = IdentityHashMap<PlSqlVisitor, ZpaRuleKey>()\n\n    fun of(ruleKey: ZpaRuleKey): PlSqlVisitor? {\n        return checkByRule[ruleKey]\n    }\n\n    fun all(): Collection<PlSqlVisitor> {\n        return checkByRule.values\n    }\n\n    fun ruleKey(check: PlSqlVisitor): ZpaRuleKey? {\n        return ruleByCheck[check]\n    }\n\n    private fun add(ruleKey: ZpaRuleKey, obj: PlSqlVisitor) {\n        checkByRule[ruleKey] = obj\n        ruleByCheck[obj] = ruleKey\n    }\n\n    fun addAnnotatedChecks(checkClassesOrObjects: Iterable<Class<*>>): ZpaChecks {\n        val checksByEngineKey = HashMap<String, Class<*>>()\n        for (checkClassesOrObject in checkClassesOrObjects) {\n            val engineKey = getRuleKey(ruleMetadataLoader, checkClassesOrObject)\n            checksByEngineKey[engineKey] = checkClassesOrObject\n        }\n\n        for (activeRule in activeRules.findByRepository(repository)) {\n            val engineKey = if (activeRule.templateRuleKey.isNullOrBlank())\n                activeRule.ruleKey.rule\n            else\n                activeRule.templateRuleKey\n\n            val checkClassesOrObject = checksByEngineKey[engineKey]\n            if (checkClassesOrObject != null) {\n                val obj = instantiate(activeRule, checkClassesOrObject)\n                obj.activeRule = activeRule\n                add(activeRule.ruleKey, obj)\n            }\n        }\n        return this\n    }\n\n    private fun instantiate(activeRule: ZpaActiveRule, checkClassOrInstance: Any): PlSqlVisitor {\n        try {\n            var check = checkClassOrInstance\n            if (check is Class<*>) {\n                check = (checkClassOrInstance as Class<*>).getDeclaredConstructor().newInstance()\n            }\n            configureFields(activeRule, check)\n            return check as PlSqlVisitor\n        } catch (e: InstantiationException) {\n            throw failToInstantiateCheck(activeRule, checkClassOrInstance, e)\n        } catch (e: IllegalAccessException) {\n            throw failToInstantiateCheck(activeRule, checkClassOrInstance, e)\n        }\n\n    }\n\n    private fun failToInstantiateCheck(activeRule: ZpaActiveRule, checkClassOrInstance: Any, e: Exception): RuntimeException {\n        throw IllegalStateException(String.format(\"Fail to instantiate class %s for rules %s\", checkClassOrInstance, activeRule.ruleKey), e)\n    }\n\n    private fun configureFields(activeRule: ZpaActiveRule, check: Any) {\n        for ((key, value) in activeRule.params) {\n            val field = getField(check, key) ?: throw IllegalStateException(\n                String.format(\"The field '%s' does not exist or is not annotated with @RuleProperty in the class %s\", key, check.javaClass.name))\n            if (value.isNotBlank()) {\n                configureField(check, field, value)\n            }\n        }\n    }\n\n    private fun getField(check: Any, key: String): Field? {\n        val fields = getFields(check.javaClass, true)\n        for (field in fields) {\n            val propertyAnnotation = ruleMetadataLoader.getRulePropertyAnnotation(field)\n            if (propertyAnnotation != null && ((key == field.name) || (key == propertyAnnotation.key))) {\n                return field\n            }\n        }\n        return null\n    }\n\n    private fun configureField(check: Any, field: Field, value: String) {\n        try {\n            field.isAccessible = true\n\n            when(field.type) {\n                String::class.java -> field.set(check, value)\n                Int::class.javaPrimitiveType -> field.setInt(check, Integer.parseInt(value))\n                Short::class.javaPrimitiveType -> field.setShort(check, java.lang.Short.parseShort(value))\n                Long::class.javaPrimitiveType -> field.setLong(check, java.lang.Long.parseLong(value))\n                Double::class.javaPrimitiveType -> field.setDouble(check, java.lang.Double.parseDouble(value))\n                Boolean::class.javaPrimitiveType -> field.setBoolean(check, java.lang.Boolean.parseBoolean(value))\n                Byte::class.javaPrimitiveType -> field.setByte(check, java.lang.Byte.parseByte(value))\n                Int::class.java -> field.set(check, Integer.parseInt(value))\n                Long::class.java -> field.set(check, java.lang.Long.parseLong(value))\n                Double::class.java -> field.set(check, java.lang.Double.parseDouble(value))\n                Boolean::class.java -> field.set(check, java.lang.Boolean.parseBoolean(value))\n                else -> throw IllegalStateException(\"The type of the field \" + field + \" is not supported: \" + field.type)\n            }\n        } catch (e: IllegalAccessException) {\n            throw IllegalStateException(\"Can not set the value of the field \" + field + \" in the class: \" + check.javaClass.name, e)\n        }\n\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/rules/ZpaRepository.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.rules\n\ninterface ZpaRepository {\n    val key: String\n    fun createRule(ruleKey: String): ZpaRule\n    fun rule(ruleKey: String): ZpaRule?\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/rules/ZpaRule.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.rules\n\nimport com.felipebz.zpa.api.annotations.RuleInfo\n\ninterface ZpaRule {\n    val key: String\n    val params: List<ZpaRuleParam>\n    var name: String\n    var remediationConstant: String\n    var scope: RuleInfo.Scope\n    var template: Boolean\n    var tags: Array<String>\n    var status: RuleStatus\n    var severity: String\n    var htmlDescription: String\n    var isActivatedByDefault: Boolean\n    fun createParam(fieldKey: String): ZpaRuleParam\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/rules/ZpaRuleKey.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.rules\n\ninterface ZpaRuleKey {\n    val rule: String\n    val repository: String\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/rules/ZpaRuleParam.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.rules\n\ninterface ZpaRuleParam {\n    val key: String\n    var description: String\n    var defaultValue: String\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/squid/AnalysisException.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.squid\n\nclass AnalysisException(string: String, e: Throwable) : RuntimeException(string, e)\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/squid/AstScanner.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.squid\n\nimport com.felipebz.flr.api.Grammar\nimport com.felipebz.flr.api.RecognitionException\nimport com.felipebz.flr.impl.Parser\nimport com.felipebz.zpa.FormsMetadataAwareCheck\nimport com.felipebz.zpa.metadata.FormsMetadata\nimport com.felipebz.zpa.metrics.ComplexityVisitor\nimport com.felipebz.zpa.metrics.FunctionComplexityVisitor\nimport com.felipebz.zpa.metrics.MetricsVisitor\nimport com.felipebz.zpa.parser.PlSqlParser\nimport com.felipebz.zpa.symbols.DefaultTypeSolver\nimport com.felipebz.zpa.symbols.ScopeImpl\nimport com.felipebz.zpa.symbols.SymbolVisitor\nimport com.felipebz.zpa.utils.getAnnotation\nimport com.felipebz.zpa.utils.log.Loggers\nimport com.felipebz.zpa.api.PlSqlFile\nimport com.felipebz.zpa.api.PlSqlVisitorContext\nimport com.felipebz.zpa.api.annotations.RuleInfo\nimport com.felipebz.zpa.api.checks.PlSqlCheck\nimport com.felipebz.zpa.api.checks.PlSqlVisitor\nimport java.io.InterruptedIOException\nimport java.nio.charset.Charset\nimport java.nio.charset.StandardCharsets\nimport java.util.concurrent.locks.ReentrantLock\nimport kotlin.concurrent.withLock\n\nclass AstScanner(private val checks: Collection<PlSqlVisitor>,\n                 private val formsMetadata: FormsMetadata?,\n                 isErrorRecoveryEnabled: Boolean,\n                 charset: Charset = StandardCharsets.UTF_8) {\n\n    private val parser: Parser<Grammar> = PlSqlParser.create(PlSqlConfiguration(charset, isErrorRecoveryEnabled))\n    val globalScope = ScopeImpl()\n\n    fun scanFile(inputFile: PlSqlFile, extraVisitors: List<PlSqlVisitor> = emptyList()) : AstScannerResult {\n        val newVisitorContext = getPlSqlVisitorContext(inputFile)\n\n        val metricsVisitor = MetricsVisitor()\n        val complexityVisitor = ComplexityVisitor()\n        val functionComplexityVisitor = FunctionComplexityVisitor()\n        val symbolVisitor = SymbolVisitor(DefaultTypeSolver(), globalScope)\n\n        val checksToRun = mutableListOf<PlSqlVisitor>()\n        checksToRun.add(symbolVisitor)\n\n        if (inputFile.type() == PlSqlFile.Type.MAIN) {\n            checksToRun.addAll(\n                checks.filter { check -> formsMetadata != null || check !is FormsMetadataAwareCheck }\n                    .filterIsInstance<PlSqlCheck>()\n                    .filter { check -> ruleHasScope(check, RuleInfo.Scope.MAIN) }\n                    .toList())\n        } else {\n            checksToRun.addAll(\n                checks.filterIsInstance<PlSqlCheck>()\n                    .filter { check -> ruleHasScope(check, RuleInfo.Scope.TEST) }\n                    .toList())\n        }\n\n        checksToRun.add(metricsVisitor)\n        checksToRun.add(complexityVisitor)\n        checksToRun.add(functionComplexityVisitor)\n        checksToRun.addAll(extraVisitors)\n\n        val issues = lock.withLock {\n            val newWalker = PlSqlAstWalker(checksToRun)\n            newWalker.walk(newVisitorContext)\n\n            checksToRun.flatMap {\n                (it as PlSqlCheck).issues().map { issue -> ZpaIssue(inputFile, it, issue) }\n            }\n        }\n\n        return AstScannerResult(\n            executedChecks = checksToRun,\n            linesWithNoSonar = metricsVisitor.linesWithNoSonar,\n            symbols = symbolVisitor.symbols,\n            numberOfStatements = metricsVisitor.numberOfStatements,\n            linesOfCode = metricsVisitor.getLinesOfCode().size,\n            linesOfComments = metricsVisitor.getLinesOfComments().size,\n            complexity = complexityVisitor.complexity,\n            numberOfFunctions = functionComplexityVisitor.numberOfFunctions,\n            executableLines = metricsVisitor.getExecutableLines(),\n            issues = issues\n        )\n    }\n\n    private fun ruleHasScope(check: PlSqlVisitor, scope: RuleInfo.Scope): Boolean {\n        val ruleInfo = getAnnotation(check, RuleInfo::class.java)\n        if (ruleInfo != null) {\n            return ruleInfo.scope === RuleInfo.Scope.ALL || ruleInfo.scope === scope\n        }\n        return scope === RuleInfo.Scope.MAIN\n    }\n\n    private fun getPlSqlVisitorContext(inputFile: PlSqlFile): PlSqlVisitorContext {\n        var visitorContext: PlSqlVisitorContext\n        try {\n            val root = parser.parse(inputFile.contents())\n            visitorContext = PlSqlVisitorContext(root, inputFile, formsMetadata)\n        } catch (e: RecognitionException) {\n            visitorContext = PlSqlVisitorContext(inputFile, e, formsMetadata)\n            LOG.error(\"Unable to parse file: $inputFile\\n${e.message}\")\n        } catch (e: Exception) {\n            checkInterrupted(e)\n            throw AnalysisException(\"Unable to analyze file: $inputFile\", e)\n        } catch (e: Throwable) {\n            throw AnalysisException(\"Unable to analyze file: $inputFile\", e)\n        }\n\n        return visitorContext\n    }\n\n    private fun checkInterrupted(e: Exception) {\n        val cause = getRootCause(e)\n        if (cause is InterruptedException || cause is InterruptedIOException) {\n            throw AnalysisException(\"Analysis cancelled\", e)\n        }\n    }\n\n    private fun getRootCause(exception: Throwable?): Throwable? {\n        var rootException = exception\n        while (rootException?.cause != null) {\n            rootException = rootException.cause\n        }\n        return rootException\n    }\n\n    companion object {\n        private val LOG = Loggers.getLogger(AstScanner::class.java)\n        private val lock = ReentrantLock()\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/squid/AstScannerResult.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.squid\n\nimport com.felipebz.zpa.api.PlSqlFile\nimport com.felipebz.zpa.api.checks.PlSqlCheck\nimport com.felipebz.zpa.api.checks.PlSqlVisitor\nimport com.felipebz.zpa.api.symbols.Symbol\n\ndata class AstScannerResult internal constructor(\n    val executedChecks: List<PlSqlVisitor>,\n    val linesWithNoSonar: Set<Int>,\n    val symbols: List<Symbol>,\n    val numberOfStatements: Int,\n    val linesOfCode: Int,\n    val linesOfComments: Int,\n    val complexity: Int,\n    val numberOfFunctions:  Int,\n    val executableLines: Set<Int>,\n    val issues: List<ZpaIssue>\n)\n\ndata class ZpaIssue internal constructor(\n    val file: PlSqlFile,\n    val check: PlSqlCheck,\n    private val issue: PlSqlCheck.PreciseIssue\n) {\n    val cost = issue.cost()\n    val primaryLocation = issue.primaryLocation()\n    val secondaryLocations = issue.secondaryLocations()\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/squid/PlSqlAstWalker.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.squid\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.flr.api.AstNodeType\nimport com.felipebz.flr.api.Token\nimport com.felipebz.zpa.api.PlSqlVisitorContext\nimport com.felipebz.zpa.api.checks.PlSqlVisitor\nimport com.felipebz.zpa.api.squid.PlSqlCommentAnalyzer\nimport java.util.*\n\nclass PlSqlAstWalker(private val checks: Collection<PlSqlVisitor>) {\n\n    private val visitorsByNodeType = IdentityHashMap<AstNodeType, MutableList<PlSqlVisitor>>()\n    private var lastVisitedToken: Token? = null\n\n    fun walk(context: PlSqlVisitorContext) {\n        for (check in checks) {\n            check.context = context\n            check.startScan()\n            check.init()\n\n            for (type in check.subscribedKinds()) {\n                visitorsByNodeType.getOrPut(type) { mutableListOf() }.add(check)\n            }\n        }\n\n        val tree = context.rootTree()\n        if (tree != null) {\n            try {\n                for (check in checks) {\n                    check.visitFile(tree)\n                }\n                visit(tree)\n                for (check in checks) {\n                    check.leaveFile(tree)\n                }\n            } catch (e: Exception) {\n                val plsqlFile = context.plSqlFile()\n                if (plsqlFile != null) {\n                    throw AnalysisException(\"Error executing checks on file ${plsqlFile.fileName()}: ${e.message}\", e)\n                } else {\n                    throw AnalysisException(\"Error executing checks: ${e.message}\", e)\n                }\n            }\n        }\n    }\n\n    private fun visit(ast: AstNode) {\n        val nodeVisitors = getNodeVisitors(ast)\n        visitNode(ast, nodeVisitors)\n        visitToken(ast)\n        visitChildren(ast)\n        leaveNode(ast, nodeVisitors)\n    }\n\n    private fun leaveNode(ast: AstNode, nodeVisitors: List<PlSqlVisitor>) {\n        for (i in nodeVisitors.indices.reversed()) {\n            nodeVisitors[i].leaveNode(ast)\n        }\n    }\n\n    private fun visitChildren(ast: AstNode) {\n        for (child in ast.children) {\n            visit(child)\n        }\n    }\n\n    private fun visitToken(ast: AstNode) {\n        if (ast.hasToken() && lastVisitedToken !== ast.token) {\n            lastVisitedToken = ast.token\n            for (astAndTokenVisitor in checks) {\n                astAndTokenVisitor.visitToken(ast.token)\n\n                for (trivia in ast.token.trivia) {\n                    astAndTokenVisitor.visitComment(trivia,\n                            PlSqlCommentAnalyzer.getContents(trivia.token.originalValue))\n                }\n            }\n        }\n    }\n\n    private fun visitNode(ast: AstNode, nodeVisitors: List<PlSqlVisitor>) {\n        for (nodeVisitor in nodeVisitors) {\n            nodeVisitor.visitNode(ast)\n        }\n    }\n\n    private fun getNodeVisitors(ast: AstNode) =\n        visitorsByNodeType[ast.type] ?: emptyList()\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/squid/PlSqlConfiguration.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.squid\n\nimport java.nio.charset.Charset\n\nclass PlSqlConfiguration @JvmOverloads constructor(val charset: Charset, val isErrorRecoveryEnabled: Boolean = false)\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/squid/ProgressReport.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.squid\n\nimport com.felipebz.zpa.utils.log.Logger\nimport com.felipebz.zpa.utils.log.Loggers\nimport java.util.concurrent.atomic.AtomicBoolean\nimport java.util.concurrent.locks.Condition\nimport java.util.concurrent.locks.ReentrantLock\nimport kotlin.concurrent.withLock\n\nclass ProgressReport @JvmOverloads constructor(threadName: String,\n                                               private val period: Long,\n                                               private val logger: Logger = Loggers.getLogger(ProgressReport::class.java)) :\n    Runnable {\n\n    internal val lock = ReentrantLock()\n    internal val condition: Condition = lock.newCondition()\n\n    private var count: Int = 0\n    private var currentFileNumber = -1\n    private var currentFile: String? = null\n    private lateinit var iterator: Iterator<String>\n    private val thread: Thread = Thread(this, threadName).apply { isDaemon = true }\n    private var success = false\n    private val interrupted = AtomicBoolean().apply { set(false) }\n\n    override fun run() {\n        while (!(interrupted.get() || Thread.currentThread().isInterrupted)) {\n            try {\n                Thread.sleep(period)\n                lock.withLock {\n                    log(\"$currentFileNumber/$count files analyzed, current file: $currentFile\")\n                }\n            } catch (e: InterruptedException) {\n                interrupted.set(true)\n                thread.interrupt()\n                break\n            }\n\n        }\n\n        lock.withLock {\n            if (success) {\n                log(\"$count/$count source files have been analyzed\")\n            }\n        }\n    }\n\n    @Synchronized\n    fun start(files: Collection<String>) {\n        count = files.size\n        iterator = files.iterator()\n\n        nextFile()\n\n        log(\"$count source files to be analyzed\")\n        thread.start()\n    }\n\n    @Synchronized\n    fun nextFile() {\n        if (iterator.hasNext()) {\n            currentFileNumber++\n            currentFile = iterator.next()\n        }\n    }\n\n    @Synchronized\n    fun stop() {\n        interrupted.set(true)\n        success = true\n        thread.interrupt()\n        join()\n    }\n\n    @Synchronized\n    fun cancel() {\n        interrupted.set(true)\n        thread.interrupt()\n        join()\n    }\n\n    fun join() {\n        try {\n            thread.join()\n        } catch (e: InterruptedException) {\n            Thread.currentThread().interrupt();\n        }\n    }\n\n    private fun log(message: String) {\n        lock.withLock {\n            logger.info(message)\n            condition.signalAll()\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/sslr/ElseClause.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.sslr\n\nimport com.felipebz.zpa.api.squid.SemanticAstNode\n\nclass ElseClause(override val astNode: SemanticAstNode) : TreeWithStatements(astNode)\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/sslr/ElsifClause.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.sslr\n\nimport com.felipebz.zpa.asSemantic\nimport com.felipebz.zpa.api.squid.SemanticAstNode\n\nclass ElsifClause(override val astNode: SemanticAstNode) : TreeWithStatements(astNode) {\n\n    val condition : SemanticAstNode by lazy {\n        astNode.children[1].asSemantic()\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/sslr/IfStatement.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.sslr\n\nimport com.felipebz.zpa.asSemantic\nimport com.felipebz.zpa.asTree\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.squid.SemanticAstNode\n\nclass IfStatement(override val astNode: SemanticAstNode) : TreeWithStatements(astNode) {\n\n    val condition : SemanticAstNode by lazy {\n        astNode.children[1].asSemantic()\n    }\n\n    val elsifClauses : List<ElsifClause> by lazy {\n        astNode.getChildren(PlSqlGrammar.ELSIF_CLAUSE).asTree()\n    }\n\n    val elseClause : ElseClause? by lazy {\n        astNode.getFirstChildOrNull(PlSqlGrammar.ELSE_CLAUSE)?.asTree()\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/sslr/NullStatement.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.sslr\n\nimport com.felipebz.zpa.api.squid.SemanticAstNode\n\nclass NullStatement(astNode: SemanticAstNode) : TreeImpl(astNode)\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/sslr/PlSqlGrammarBuilder.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.sslr\n\nimport com.felipebz.flr.api.AstNodeType\nimport com.felipebz.flr.api.Grammar\nimport com.felipebz.flr.api.TokenType\nimport com.felipebz.flr.grammar.GrammarRuleBuilder\nimport com.felipebz.flr.grammar.GrammarRuleKey\nimport com.felipebz.flr.grammar.LexerfulGrammarBuilder\nimport kotlin.reflect.KClass\n\nclass PlSqlGrammarBuilder(private val builder: LexerfulGrammarBuilder) {\n\n    fun build(): Grammar = builder.build()\n\n    fun rule(ruleKey: GrammarRuleKey): GrammarRuleBuilder = rule(ruleKey, TreeImpl::class)\n\n    fun rule(ruleKey: GrammarRuleKey, clazz: KClass<out Tree>): GrammarRuleBuilder {\n        typedClasses[ruleKey] = clazz.java\n        return builder.rule(ruleKey)\n    }\n\n    fun setRootRule(ruleKey: GrammarRuleKey) {\n        builder.setRootRule(ruleKey)\n    }\n\n    fun sequence(e1: Any, e2: Any): Any = builder.sequence(e1, e2)\n\n    fun sequence(e1: Any, e2: Any, vararg rest: Any): Any = builder.sequence(e1, e2, *rest)\n\n    fun firstOf(e1: Any, e2: Any): Any = builder.firstOf(e1, e2)\n\n    fun firstOf(e1: Any, e2: Any, vararg rest: Any): Any = builder.firstOf(e1, e2, *rest)\n\n    fun optional(e: Any): Any = builder.optional(e)\n\n    fun optional(e1: Any, vararg rest: Any): Any = builder.optional(e1, *rest)\n\n    fun oneOrMore(e: Any): Any = builder.oneOrMore(e)\n\n    fun oneOrMore(e1: Any, vararg rest: Any): Any = builder.oneOrMore(e1, *rest)\n\n    fun zeroOrMore(e: Any): Any = builder.zeroOrMore(e)\n\n    fun zeroOrMore(e1: Any, vararg rest: Any): Any = builder.zeroOrMore(e1, *rest)\n\n    fun next(e: Any): Any = builder.next(e)\n\n    fun next(e1: Any, vararg rest: Any): Any = builder.next(e1, *rest)\n\n    fun nextNot(e: Any): Any = builder.nextNot(e)\n\n    fun nextNot(e1: Any, vararg rest: Any): Any = builder.nextNot(e1, *rest)\n\n    fun nothing(): Any = builder.nothing()\n\n    fun buildWithMemoizationOfMatchesForAllRules(): Grammar = builder.buildWithMemoizationOfMatchesForAllRules()\n\n    fun adjacent(e: Any): Any = builder.adjacent(e)\n\n    fun anyTokenButNot(e: Any): Any = builder.anyTokenButNot(e)\n\n    fun isOneOfThem(t1: TokenType, vararg rest: TokenType): Any = builder.isOneOfThem(t1, *rest)\n\n    fun bridge(from: TokenType, to: TokenType): Any = builder.bridge(from, to)\n\n    fun anyToken(): Any = builder.anyToken()\n\n    fun tillNewLine(): Any = builder.tillNewLine()\n\n    fun till(e: Any): Any = builder.till(e)\n\n    fun exclusiveTill(e: Any): Any = builder.exclusiveTill(e)\n\n    fun exclusiveTill(e1: Any, vararg rest: Any): Any = builder.exclusiveTill(e1, *rest)\n\n    companion object {\n        private val typedClasses = mutableMapOf<AstNodeType, Class<out Tree>>()\n\n        fun classForType(key: AstNodeType): Class<out Tree> = typedClasses.getOrDefault(key, TreeImpl::class.java)\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/sslr/RaiseStatement.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.sslr\n\nimport com.felipebz.zpa.asSemantic\nimport com.felipebz.zpa.api.PlSqlKeyword\nimport com.felipebz.zpa.api.squid.SemanticAstNode\n\nclass RaiseStatement(override val astNode: SemanticAstNode) : TreeImpl(astNode) {\n\n    val exception : SemanticAstNode? by lazy {\n        astNode.getFirstChildOrNull(PlSqlKeyword.RAISE)?.nextSibling?.asSemantic()\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/sslr/Statements.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.sslr\n\nimport com.felipebz.zpa.asSemantic\nimport com.felipebz.zpa.api.squid.SemanticAstNode\n\nclass Statements(override val astNode: SemanticAstNode) : TreeImpl(astNode), List<SemanticAstNode> {\n\n    private val children by lazy { astNode.children.asSemantic() }\n\n    override val size: Int =\n        children.size\n\n    override fun contains(element: SemanticAstNode): Boolean  =\n        children.contains(element)\n\n    override fun containsAll(elements: Collection<SemanticAstNode>): Boolean =\n        children.containsAll(elements)\n\n    override fun get(index: Int): SemanticAstNode =\n        children[index]\n\n    override fun indexOf(element: SemanticAstNode): Int =\n        children.indexOf(element)\n\n    override fun isEmpty(): Boolean =\n        children.isEmpty()\n\n    override fun iterator(): Iterator<SemanticAstNode> =\n        children.iterator()\n\n    override fun lastIndexOf(element: SemanticAstNode): Int =\n        children.lastIndexOf(element)\n\n    override fun listIterator(): ListIterator<SemanticAstNode>  =\n        children.listIterator()\n\n    override fun listIterator(index: Int): ListIterator<SemanticAstNode> =\n        children.listIterator(index)\n\n    override fun subList(fromIndex: Int, toIndex: Int): List<SemanticAstNode> =\n        children.subList(fromIndex, toIndex)\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/sslr/Tree.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.sslr\n\nimport com.felipebz.zpa.api.squid.SemanticAstNode\n\ninterface Tree {\n    val astNode: SemanticAstNode\n\n    val parent: Tree?\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/sslr/TreeImpl.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.sslr\n\nimport com.felipebz.zpa.asSemantic\nimport com.felipebz.zpa.api.squid.SemanticAstNode\n\nopen class TreeImpl(override val astNode: SemanticAstNode) : Tree {\n\n    override val parent: Tree? by lazy {\n        astNode.parent.asSemantic().tree\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/sslr/TreeWithStatements.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.sslr\n\nimport com.felipebz.zpa.asTree\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.squid.SemanticAstNode\n\nopen class TreeWithStatements(override val astNode: SemanticAstNode) : TreeImpl(astNode) {\n\n    val statements : Statements by lazy {\n        astNode.getFirstChild(PlSqlGrammar.STATEMENTS).asTree()\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/symbols/DefaultTypeSolver.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.symbols\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.PlSqlKeyword\nimport com.felipebz.zpa.api.PlSqlTokenType\nimport com.felipebz.zpa.api.symbols.Scope\nimport com.felipebz.zpa.api.symbols.Symbol\nimport com.felipebz.zpa.api.symbols.datatype.*\n\nopen class DefaultTypeSolver {\n\n    fun solve(node: AstNode, scope: Scope?): PlSqlDatatype {\n        if (node.type === PlSqlGrammar.DATATYPE) {\n            return solveDatatype(node, scope)\n        } else if (node.type === PlSqlGrammar.LITERAL) {\n            return solveLiteral(node)\n        }\n        return UnknownDatatype\n    }\n\n    open fun solveDatatype(node: AstNode, scope: Scope?): PlSqlDatatype {\n        var type: PlSqlDatatype = UnknownDatatype\n        if (node.hasDirectChildren(PlSqlGrammar.CHARACTER_DATAYPE)) {\n            type = CharacterDatatype(node)\n        } else if (node.hasDirectChildren(PlSqlGrammar.NUMERIC_DATATYPE)) {\n            type = NumericDatatype(node)\n        } else if (node.hasDirectChildren(PlSqlGrammar.DATE_DATATYPE)) {\n            type = DateDatatype()\n        } else if (node.hasDirectChildren(PlSqlGrammar.LOB_DATATYPE)) {\n            type = LobDatatype()\n        } else if (node.hasDirectChildren(PlSqlGrammar.BOOLEAN_DATATYPE)) {\n            type = BooleanDatatype()\n        } else if (node.hasDirectChildren(PlSqlGrammar.ANCHORED_DATATYPE)) {\n            val anchoredDatatype = node.firstChild\n            if (anchoredDatatype.lastChild.type === PlSqlKeyword.ROWTYPE) {\n                type = RowtypeDatatype()\n            }\n        } else if (node.hasDirectChildren(PlSqlGrammar.JSON_DATATYPE)) {\n            type = JsonDatatype()\n        } else {\n            val datatype = node.firstChild\n            type = scope?.getSymbol(datatype.tokenValue, Symbol.Kind.TYPE)?.datatype ?: UnknownDatatype\n        }\n        return type\n    }\n\n    open fun solveLiteral(node: AstNode): PlSqlDatatype {\n        var type: PlSqlDatatype = UnknownDatatype\n        if (node.hasDirectChildren(PlSqlGrammar.NULL_LITERAL) || isEmptyString(node)) {\n            type = NullDatatype()\n        } else if (node.hasDirectChildren(PlSqlGrammar.CHARACTER_LITERAL)) {\n            type = CharacterDatatype(node)\n        } else if (node.hasDirectChildren(PlSqlGrammar.NUMERIC_LITERAL)) {\n            type = NumericDatatype(node)\n        } else if (node.hasDirectChildren(PlSqlTokenType.DATE_LITERAL)) {\n            type = DateDatatype()\n        } else if (node.hasDirectChildren(PlSqlGrammar.BOOLEAN_LITERAL)) {\n            type = BooleanDatatype()\n        }\n        return type\n    }\n\n    private fun isEmptyString(node: AstNode): Boolean {\n        val characterLiteral = node.getFirstChildOrNull(PlSqlGrammar.CHARACTER_LITERAL) ?: return false\n        val value = characterLiteral.tokenValue\n        if (value == \"''\") {\n            return true\n        }\n        if (value.startsWith('n', ignoreCase = true) || value.startsWith('q', ignoreCase = true)) {\n            val actualStart = value.indexOf('\\'') + 2\n            val actualEnd = value.lastIndexOf('\\'') - 1\n            return actualStart == actualEnd\n        }\n        return false\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/symbols/ScopeImpl.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.symbols\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.flr.api.AstNodeType\nimport com.felipebz.flr.api.Token\nimport com.felipebz.zpa.api.PlSqlFile\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.symbols.Scope\nimport com.felipebz.zpa.api.symbols.Symbol\nimport java.util.*\nimport java.util.concurrent.locks.ReentrantLock\nimport kotlin.concurrent.withLock\n\nclass ScopeImpl(override val outer: Scope? = null,\n                node: AstNode? = null,\n                override val firstToken: Token? = null,\n                override val lastToken: Token? = null,\n                override val isAutonomousTransaction: Boolean = false,\n                override val hasExceptionHandler: Boolean = false,\n                override val isOverridingMember: Boolean = false,\n                identifier: String? = null,\n                type: AstNodeType? = null,\n                private val globalScope: Scope? = null,\n                override val plSqlFile: PlSqlFile? = null) : Scope {\n\n    private val mutex = ReentrantLock()\n\n    init {\n        outer?.addInnerScope(this)\n    }\n\n    override val tree: AstNode? = node\n\n    override val type: AstNodeType? = type ?: tree?.type\n\n    override val symbols = mutableListOf<Symbol>()\n\n    override val identifier: String? =\n        try {\n            identifier ?: node?.getFirstChildOrNull(PlSqlGrammar.IDENTIFIER_NAME, PlSqlGrammar.UNIT_NAME)?.tokenValue\n        } catch (e: Exception) {\n            \"\"\n        }\n\n    override val path: List<String> by lazy {\n        val path = ArrayList<String>()\n        var scope: Scope? = this\n        while (scope != null) {\n            val scopeIdentifier = scope.identifier\n            if (scopeIdentifier != null) {\n                path.add(scopeIdentifier)\n            }\n            scope = scope.outer\n        }\n        path\n    }\n    override val innerScopes = mutableListOf<Scope>()\n\n    override val isGlobal: Boolean = globalScope != null ||\n        (outer as? ScopeImpl)?.globalScope != null ||\n        (outer?.type in arrayOf(PlSqlGrammar.CREATE_PACKAGE, PlSqlGrammar.CREATE_TYPE) && outer?.isGlobal == true)\n\n    /**\n     * @param kind of the symbols to look for\n     * @return the symbols corresponding to the given kind\n     */\n    override fun getSymbols(kind: Symbol.Kind) =\n        symbols.filter { it.`is`(kind) }.toList()\n\n    override fun getSymbolsAcessibleInScope(name: String, vararg kinds: Symbol.Kind): Deque<Symbol> {\n        val result = ArrayDeque<Symbol>()\n        var scope: Scope? = this\n        while (scope != null) {\n            scope.symbols.filterTo(result) { it.called(name) && (kinds.isEmpty() || kinds.contains(it.kind)) }\n            scope = scope.outer\n        }\n\n        return result\n    }\n\n    override fun addSymbol(symbol: Symbol) {\n        symbols.add(symbol)\n    }\n\n    override fun addInnerScope(scope: Scope) {\n        mutex.withLock {\n            innerScopes.add(scope)\n        }\n    }\n\n    override fun getSymbol(name: String, vararg kinds: Symbol.Kind): Symbol? {\n        return getSymbol(name, emptyList(), *kinds)\n    }\n\n    override fun getSymbol(name: String, path: List<String>, vararg kinds: Symbol.Kind): Symbol? {\n        var scope: Scope? = this\n        while (scope != null) {\n            for (s in scope.symbols) {\n                if (s.called(name) && (path.isEmpty() || pathContainedIn(path, scope)) && (kinds.isEmpty() || kinds.contains(s.kind))) {\n                    return s\n                }\n            }\n            scope = scope.outer\n        }\n\n        return null\n    }\n\n    // check if path is a prefix of this scope's path\n    private fun pathContainedIn(path: List<String>, scope: Scope): Boolean {\n        if (path.size > scope.path.size) {\n            return false\n        }\n        for (i in path.indices) {\n            if (!path[i].equals(scope.path[i], ignoreCase = true)) {\n                return false\n            }\n        }\n        return true\n    }\n\n    override fun toString() = \"Scope name=${identifier ?: \"<unnamed>\"} type=$type path=$path\"\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/symbols/SymbolTableImpl.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.symbols\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.api.symbols.Scope\nimport com.felipebz.zpa.api.symbols.Symbol\nimport com.felipebz.zpa.api.symbols.SymbolTable\nimport com.felipebz.zpa.api.symbols.datatype.PlSqlDatatype\n\nclass SymbolTableImpl : SymbolTable {\n\n    override val symbols = ArrayList<Symbol>()\n    override val scopes = LinkedHashSet<Scope>()\n\n    fun addScope(scope: Scope) {\n        scopes.add(scope)\n    }\n\n    override fun getScopeFor(symbol: AstNode): Scope? {\n        for (scope in scopes) {\n            if (scope.tree == symbol) {\n                return scope\n            }\n        }\n        return null\n    }\n\n    fun declareSymbol(name: AstNode, kind: Symbol.Kind, scope: Scope, plSqlDatatype: PlSqlDatatype): Symbol {\n        val symbol = Symbol(name, kind, scope, plSqlDatatype)\n        symbols.add(symbol)\n        scope.addSymbol(symbol)\n        return symbol\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/symbols/SymbolVisitor.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.symbols\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.flr.api.AstNodeType\nimport com.felipebz.zpa.typeIs\nimport com.felipebz.zpa.api.DmlGrammar\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.PlSqlKeyword\nimport com.felipebz.zpa.api.checks.PlSqlCheck\nimport com.felipebz.zpa.api.squid.SemanticAstNode\nimport com.felipebz.zpa.api.symbols.Scope\nimport com.felipebz.zpa.api.symbols.Symbol\nimport com.felipebz.zpa.api.symbols.datatype.*\n\nclass SymbolVisitor(private val typeSolver: DefaultTypeSolver, private val globalScope: Scope? = null) : PlSqlCheck() {\n\n    private val scopeHolders = arrayOf<AstNodeType>(\n        PlSqlGrammar.CREATE_PROCEDURE,\n        PlSqlGrammar.PROCEDURE_DECLARATION,\n        PlSqlGrammar.CREATE_FUNCTION,\n        PlSqlGrammar.FUNCTION_DECLARATION,\n        PlSqlGrammar.CREATE_PACKAGE,\n        PlSqlGrammar.CREATE_PACKAGE_BODY,\n        PlSqlGrammar.SIMPLE_DML_TRIGGER,\n        PlSqlGrammar.INSTEAD_OF_DML_TRIGGER,\n        PlSqlGrammar.COMPOUND_DML_TRIGGER,\n        PlSqlGrammar.SYSTEM_TRIGGER,\n        PlSqlGrammar.TYPE_CONSTRUCTOR,\n        PlSqlGrammar.CREATE_TYPE,\n        PlSqlGrammar.CREATE_TYPE_BODY,\n        PlSqlGrammar.BLOCK_STATEMENT,\n        PlSqlGrammar.FOR_STATEMENT,\n        PlSqlGrammar.CURSOR_DECLARATION,\n        PlSqlGrammar.FORALL_STATEMENT,\n        DmlGrammar.SELECT_EXPRESSION)\n\n    val symbolTable = SymbolTableImpl()\n    private lateinit var fileScope: Scope\n    private var currentScope: Scope? = null\n\n    val symbols: List<Symbol> = symbolTable.symbols\n\n    override fun init() {\n        subscribeTo(*scopeHolders)\n        fileScope = ScopeImpl(globalScope = globalScope)\n        symbolTable.addScope(fileScope)\n        currentScope = fileScope\n    }\n\n    override fun visitFile(node: AstNode) {\n        visit(node)\n\n        context.symbolTable = symbolTable\n\n        if (globalScope != null) {\n            for (innerScope in fileScope.innerScopes) {\n                declareGlobalSymbols(innerScope, globalScope)\n            }\n        }\n    }\n\n    private fun declareGlobalSymbols(current: Scope, outer: Scope) {\n        val scope = ScopeImpl(\n            outer = outer,\n            firstToken = current.firstToken,\n            lastToken = current.lastToken,\n            isAutonomousTransaction = current.isAutonomousTransaction,\n            hasExceptionHandler = current.hasExceptionHandler,\n            isOverridingMember = current.isOverridingMember,\n            identifier = current.identifier,\n            type = current.type,\n            plSqlFile = context.plSqlFile()\n        )\n\n        for (symbol in current.symbols.filter { it.isGlobal }) {\n            val newSymbol = Symbol(null, symbol.kind, scope, symbol.datatype, symbol.name)\n            scope.addSymbol(newSymbol)\n        }\n\n        for (innerScope in current.innerScopes.filter { it.isGlobal }) {\n            declareGlobalSymbols(innerScope, scope)\n        }\n    }\n\n    override fun visitNode(node: AstNode) {\n        if (node.typeIs(scopeHolders)) {\n            context.currentScope = symbolTable.getScopeFor(node)\n        }\n    }\n\n    override fun leaveNode(node: AstNode) {\n        if (node.typeIs(scopeHolders)) {\n            context.currentScope = context.currentScope?.outer\n        }\n    }\n\n    override fun leaveFile(node: AstNode) {\n        currentScope = null\n    }\n\n    private fun visit(ast: AstNode) {\n        visitNodeInternal(ast)\n        visitChildren(ast)\n\n        if (ast.typeIs(scopeHolders)) {\n            leaveScope()\n        }\n    }\n\n    private fun visitChildren(ast: AstNode) {\n        for (child in ast.children) {\n            visit(child)\n        }\n    }\n\n    private fun visitNodeInternal(node: AstNode) {\n        if (node.type === PlSqlGrammar.VARIABLE_DECLARATION) {\n            visitVariableDeclaration(node)\n        } else if (node.type === PlSqlGrammar.EXCEPTION_DECLARATION) {\n            visitExceptionDeclaration(node)\n        } else if (node.type === PlSqlGrammar.CUSTOM_SUBTYPE) {\n            visitCustomSubtypeDeclaration(node)\n        } else if (node.type === PlSqlGrammar.TABLE_OF_DECLARATION) {\n            visitAssociativeArrayDeclaration(node)\n        } else if (node.type === PlSqlGrammar.VARRAY_DECLARATION) {\n            visitVarrayDeclaration(node)\n        } else if (node.type === PlSqlGrammar.RECORD_DECLARATION) {\n            visitRecordDeclaration(node)\n        } else if (node.type === PlSqlGrammar.VARIABLE_NAME) {\n            visitVariableName(node)\n        } else if (node.type === PlSqlGrammar.MEMBER_EXPRESSION) {\n            visitMemberExpression(node)\n        } else if (node.type === PlSqlGrammar.CURSOR_DECLARATION) {\n            visitCursor(node)\n        } else if (node.type === PlSqlGrammar.BLOCK_STATEMENT) {\n            visitBlock(node)\n        } else if (node.type === PlSqlGrammar.FOR_STATEMENT) {\n            visitFor(node)\n        } else if (node.type === PlSqlGrammar.FORALL_STATEMENT) {\n            visitForAll(node)\n        } else if (node.type === PlSqlGrammar.PARAMETER_DECLARATION || node.type === PlSqlGrammar.CURSOR_PARAMETER_DECLARATION) {\n            visitParameterDeclaration(node)\n        } else if (node.type === PlSqlGrammar.CREATE_PROCEDURE ||\n            node.type === PlSqlGrammar.PROCEDURE_DECLARATION ||\n            node.type === PlSqlGrammar.CREATE_FUNCTION ||\n            node.type === PlSqlGrammar.FUNCTION_DECLARATION ||\n            node.type === PlSqlGrammar.SIMPLE_DML_TRIGGER ||\n            node.type === PlSqlGrammar.INSTEAD_OF_DML_TRIGGER ||\n            node.type === PlSqlGrammar.COMPOUND_DML_TRIGGER ||\n            node.type === PlSqlGrammar.SYSTEM_TRIGGER ||\n            node.type === PlSqlGrammar.CREATE_TYPE ||\n            node.type === PlSqlGrammar.CREATE_TYPE_BODY ||\n            node.type === PlSqlGrammar.TYPE_CONSTRUCTOR) {\n            visitUnit(node)\n        } else if (node.type === PlSqlGrammar.CREATE_PACKAGE || node.type === PlSqlGrammar.CREATE_PACKAGE_BODY) {\n            visitPackage(node)\n        } else if (node.type === PlSqlGrammar.LITERAL) {\n            visitLiteral(node)\n        } else if (node.type === DmlGrammar.SELECT_EXPRESSION) {\n            visitSelectExpression(node)\n        }\n    }\n\n    private fun visitUnit(node: AstNode) {\n        val autonomousTransaction = node\n            .getFirstChildOrNull(PlSqlGrammar.DECLARE_SECTION)\n            ?.getChildren(PlSqlGrammar.PRAGMA_DECLARATION)\n            ?.any { it.hasDirectChildren(PlSqlGrammar.AUTONOMOUS_TRANSACTION_PRAGMA) }\n\n        val exceptionHandler = node\n            .getFirstChildOrNull(PlSqlGrammar.STATEMENTS_SECTION)\n            ?.hasDirectChildren(PlSqlGrammar.EXCEPTION_HANDLERS)\n\n        val inheritanceClause = node.parent.getFirstChildOrNull(PlSqlGrammar.INHERITANCE_CLAUSE)\n\n        val isOverridingMember = inheritanceClause != null &&\n            inheritanceClause.firstChild.type !== PlSqlKeyword.NOT &&\n            inheritanceClause.hasDirectChildren(PlSqlKeyword.OVERRIDING)\n\n        val nodeType: AstNodeType\n        val identifier = if (node.parent.type == PlSqlGrammar.CREATE_TRIGGER) {\n            nodeType = PlSqlGrammar.CREATE_TRIGGER\n            node.parent.getFirstChild(PlSqlGrammar.IDENTIFIER_NAME, PlSqlGrammar.UNIT_NAME)\n        } else {\n            nodeType = node.type\n            node.getFirstChild(PlSqlGrammar.IDENTIFIER_NAME, PlSqlGrammar.UNIT_NAME)\n        }\n\n        val datatype = node.getFirstChildOrNull(PlSqlKeyword.RETURN)?.nextSibling\n        val type = if (datatype != null) solveType(datatype) else UnknownDatatype\n        val symbolKind = when(node.type) {\n            PlSqlGrammar.CREATE_PROCEDURE -> Symbol.Kind.PROCEDURE\n            PlSqlGrammar.PROCEDURE_DECLARATION -> Symbol.Kind.PROCEDURE\n\n            PlSqlGrammar.CREATE_FUNCTION -> Symbol.Kind.FUNCTION\n            PlSqlGrammar.FUNCTION_DECLARATION -> Symbol.Kind.FUNCTION\n\n            PlSqlGrammar.SIMPLE_DML_TRIGGER -> Symbol.Kind.TRIGGER\n            PlSqlGrammar.INSTEAD_OF_DML_TRIGGER -> Symbol.Kind.TRIGGER\n            PlSqlGrammar.COMPOUND_DML_TRIGGER -> Symbol.Kind.TRIGGER\n            PlSqlGrammar.SYSTEM_TRIGGER  -> Symbol.Kind.TRIGGER\n\n            PlSqlGrammar.CREATE_TYPE -> Symbol.Kind.TYPE\n            PlSqlGrammar.CREATE_TYPE_BODY -> Symbol.Kind.TYPE\n            PlSqlGrammar.TYPE_CONSTRUCTOR  -> Symbol.Kind.TYPE\n            else -> {\n                throw IllegalArgumentException(\"Unknown unit type: ${node.type}\")\n            }\n        }\n\n        val symbol = createSymbol(identifier, symbolKind, type)\n        enterScope(node, autonomousTransaction, exceptionHandler, isOverridingMember, identifier.tokenValue,\n            nodeType)\n        symbol.innerScope = currentScope\n    }\n\n    private fun visitPackage(node: AstNode) {\n        val identifier = node.getFirstChild(PlSqlGrammar.UNIT_NAME)\n        val packageScope = symbolTable.scopes.lastOrNull { it.identifier == identifier.tokenValue && it.type == PlSqlGrammar.CREATE_PACKAGE }\n        if (packageScope != null) {\n            currentScope = packageScope\n            val symbol = currentScope?.getSymbol(identifier.tokenValue)\n            if (symbol != null) {\n                symbol.addUsage(identifier)\n                semantic(node).symbol = symbol\n            }\n            enterScope(node, autonomousTransaction = false, exceptionHandler = false)\n        } else {\n            val symbol = createSymbol(identifier, Symbol.Kind.PACKAGE, UnknownDatatype)\n            enterScope(node, autonomousTransaction = false, exceptionHandler = false)\n            symbol.innerScope = currentScope\n        }\n    }\n\n    private fun visitCursor(node: AstNode) {\n        val identifier = node.getFirstChild(PlSqlGrammar.IDENTIFIER_NAME)\n        val symbol = createSymbol(identifier, Symbol.Kind.CURSOR, UnknownDatatype)\n        enterScope(node)\n        symbol.innerScope = currentScope\n    }\n\n    private fun visitBlock(node: AstNode) {\n        val exceptionHandler = node\n            .getFirstChild(PlSqlGrammar.STATEMENTS_SECTION)\n            .hasDirectChildren(PlSqlGrammar.EXCEPTION_HANDLERS)\n        enterScope(node, exceptionHandler =  exceptionHandler)\n    }\n\n    private fun visitFor(node: AstNode) {\n        enterScope(node)\n        val iterator = node.getFirstChild(PlSqlGrammar.ITERATOR)\n        val declarations = iterator.getChildren(PlSqlGrammar.ITERAND_DECLARATION)\n        val control = iterator.getFirstChild(PlSqlGrammar.QUAL_ITERATION_CTL)\n\n        val iteratorType = if (control.hasDirectChildren(PlSqlGrammar.STEPPED_CONTROL)) {\n            NumericDatatype(node)\n        } else if (control.hasDirectChildren(PlSqlGrammar.SINGLE_EXPRESSION_CONTROL) ||\n                   control.hasDirectChildren(PlSqlGrammar.DYNAMIC_SQL)) {\n            RowtypeDatatype()\n        } else {\n            UnknownDatatype\n        }\n\n        for (declaration in declarations) {\n            val identifier = declaration.getFirstChild(PlSqlGrammar.IDENTIFIER_NAME)\n            val datatype = declaration.getFirstChildOrNull(PlSqlGrammar.DATATYPE)\n            val type = if (datatype != null) solveType(datatype) else iteratorType\n            createSymbol(identifier, Symbol.Kind.VARIABLE, type)\n        }\n    }\n\n    private fun visitForAll(node: AstNode) {\n        enterScope(node)\n        val identifier = node.getFirstChild(PlSqlKeyword.FORALL).nextSibling\n        createSymbol(identifier, Symbol.Kind.VARIABLE, NumericDatatype(node))\n    }\n\n    private fun visitVariableDeclaration(node: AstNode) {\n        val identifier = node.getFirstChild(PlSqlGrammar.IDENTIFIER_NAME)\n        val datatype = node.getFirstChild(PlSqlGrammar.DATATYPE)\n\n        val type = solveType(datatype)\n        createSymbol(identifier, Symbol.Kind.VARIABLE, type)\n    }\n\n    private fun visitExceptionDeclaration(node: AstNode) {\n        val identifier = node.getFirstChild(PlSqlGrammar.IDENTIFIER_NAME)\n\n        createSymbol(identifier, Symbol.Kind.VARIABLE, ExceptionDatatype())\n    }\n\n    private fun visitCustomSubtypeDeclaration(node: AstNode) {\n        val identifier = node.getFirstChild(PlSqlGrammar.IDENTIFIER_NAME)\n        val datatype = node.getFirstChild(PlSqlGrammar.DATATYPE)\n\n        val type = solveType(datatype)\n        createSymbol(identifier, Symbol.Kind.TYPE, type)\n    }\n\n    private fun visitAssociativeArrayDeclaration(node: AstNode) {\n        val identifier = node.getFirstChild(PlSqlGrammar.IDENTIFIER_NAME)\n        val datatype = node.getFirstChild(PlSqlGrammar.NESTED_TABLE_DEFINITION).getFirstChild(PlSqlGrammar.DATATYPE)\n        createSymbol(identifier, Symbol.Kind.TYPE, AssociativeArrayDatatype(node, currentScope, solveType(datatype)))\n    }\n\n    private fun visitVarrayDeclaration(node: AstNode) {\n        val identifier = node.getFirstChild(PlSqlGrammar.IDENTIFIER_NAME)\n        val datatype = node.getFirstChild(PlSqlGrammar.VARRAY_TYPE_DEFINITION).getFirstChild(PlSqlGrammar.DATATYPE)\n        createSymbol(identifier, Symbol.Kind.TYPE, AssociativeArrayDatatype(node, currentScope, solveType(datatype)))\n    }\n\n    private fun visitRecordDeclaration(node: AstNode) {\n        val identifier = node.getFirstChild(PlSqlGrammar.IDENTIFIER_NAME)\n\n        val scope = currentScope ?: throw IllegalStateException(\"Cannot create a symbol without a scope.\")\n\n        val fields = node.getChildren(PlSqlGrammar.RECORD_FIELD_DECLARATION).map { field ->\n            val fieldName = field.getFirstChild(PlSqlGrammar.IDENTIFIER_NAME)\n            val datatype = field.getFirstChild(PlSqlGrammar.DATATYPE)\n            val type = solveType(datatype)\n            Symbol(fieldName, Symbol.Kind.VARIABLE, scope, type)\n        }\n\n        createSymbol(identifier, Symbol.Kind.TYPE, RecordDatatype(node, currentScope, fields))\n    }\n\n    private fun visitParameterDeclaration(node: AstNode) {\n        val identifier = node.getFirstChild(PlSqlGrammar.IDENTIFIER_NAME)\n        val datatype = node.getFirstChild(PlSqlGrammar.DATATYPE)\n\n        val type = solveType(datatype)\n        createSymbol(identifier, Symbol.Kind.PARAMETER, type).addModifiers(node.getChildren(PlSqlKeyword.IN, PlSqlKeyword.OUT))\n    }\n\n    private fun visitVariableName(node: AstNode) {\n        val identifier = node.getFirstChildOrNull(PlSqlGrammar.IDENTIFIER_NAME)\n        if (identifier != null && currentScope != null) {\n            val symbol = currentScope?.getSymbol(identifier.tokenValue)\n            if (symbol != null) {\n                symbol.addUsage(identifier)\n                semantic(node).symbol = symbol\n\n                val parent = node.parent\n                if (parent.type == PlSqlGrammar.METHOD_CALL) {\n                    val isArrayAccess = symbol.datatype is AssociativeArrayDatatype && symbol.kind != Symbol.Kind.FUNCTION\n                    semantic(parent).plSqlDatatype = if (isArrayAccess)\n                        symbol.datatype.nestedType\n                    else\n                        symbol.datatype\n                }\n            }\n        }\n    }\n\n    private fun visitMemberExpression(node: AstNode) {\n        val parts = node.getChildren(PlSqlGrammar.IDENTIFIER_NAME, PlSqlGrammar.VARIABLE_NAME)\n        val path = parts.dropLast(1).map { it.tokenValue }.reversed()\n        val identifier = parts.last()\n\n        if (currentScope != null) {\n            val symbol = currentScope?.getSymbol(identifier.tokenValue, path)\n            if (symbol != null) {\n                symbol.addUsage(identifier)\n                semantic(node).symbol = symbol\n            }\n        }\n    }\n\n    private fun visitLiteral(node: AstNode) {\n        (node as SemanticAstNode).plSqlDatatype = solveType(node)\n    }\n\n    private fun visitSelectExpression(node: AstNode) {\n        enterScope(node)\n    }\n\n    private fun createSymbol(identifier: AstNode, kind: Symbol.Kind, plSqlDatatype: PlSqlDatatype): Symbol {\n        val scope = currentScope\n        if (scope == null) {\n            throw IllegalStateException(\"Cannot create a symbol without a scope.\")\n        } else {\n            val symbol = symbolTable.declareSymbol(identifier, kind, scope, plSqlDatatype)\n            semantic(identifier).symbol = symbol\n            return symbol\n        }\n    }\n\n    private fun enterScope(node: AstNode,\n                           autonomousTransaction: Boolean? = null,\n                           exceptionHandler: Boolean? = null,\n                           overridingMember: Boolean? = null,\n                           identifier: String? = null,\n                           type: AstNodeType? = null) {\n        var autonomous = false\n        var exception = false\n        val isOverridingMember = overridingMember ?: false\n\n        with(currentScope) {\n            if (autonomousTransaction != null) {\n                autonomous = autonomousTransaction\n            } else if (this != null) {\n                autonomous = this.isAutonomousTransaction\n            }\n\n            if (this != null) {\n                exception = this.hasExceptionHandler || (exceptionHandler == true)\n            } else if (exceptionHandler != null) {\n                exception = exceptionHandler\n            }\n        }\n\n        val scope = ScopeImpl(currentScope, node, node.token, node.lastToken, autonomous, exception, isOverridingMember, identifier, type)\n        symbolTable.addScope(scope)\n        currentScope = scope\n    }\n\n    private fun leaveScope() {\n        val scope = currentScope\n        requireNotNull(scope) { \"Current scope should never be null when calling method \\\"leaveScope\\\"\" }\n\n        currentScope = if (scope.type == PlSqlGrammar.CREATE_PACKAGE_BODY && scope.outer?.type == PlSqlGrammar.CREATE_PACKAGE){\n            scope.outer?.outer\n        } else {\n            scope.outer\n        }\n    }\n\n    private fun solveType(node: AstNode): PlSqlDatatype {\n        return typeSolver.solve(node, currentScope)\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/utils/ReflectionUtils.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.utils\n\nimport java.lang.reflect.Field\nimport java.lang.reflect.Modifier\nimport java.util.*\n\n\nfun <A : Annotation> getAnnotation(objectOrClass: Any, annotationClass: Class<A>): A? {\n    val initialClass = objectOrClass as? Class<*> ?: objectOrClass.javaClass\n\n    var aClass: Class<*>? = initialClass\n    while (aClass != null) {\n        val result = aClass.getAnnotation(annotationClass)\n        if (result != null) {\n            return result\n        }\n        aClass = aClass.superclass\n    }\n\n    for (anInterface in getAllInterfaces(initialClass)) {\n        val result = anInterface.getAnnotation(annotationClass)\n        if (result != null) {\n            return result\n        }\n    }\n\n    return null\n}\n\nfun getAllInterfaces(cls: Class<*>): Set<Class<*>> {\n\n    val interfacesFound = LinkedHashSet<Class<*>>()\n    getAllInterfaces(cls, interfacesFound)\n\n    return interfacesFound\n}\n\nprivate fun getAllInterfaces(cls: Class<*>, interfacesFound: HashSet<Class<*>>) {\n    var clss: Class<*>? = cls\n    while (clss != null) {\n        val interfaces = clss.interfaces\n\n        for (i in interfaces) {\n            if (interfacesFound.add(i)) {\n                getAllInterfaces(i, interfacesFound)\n            }\n        }\n\n        clss = clss.superclass\n    }\n}\n\n\nfun getFields(clazz: Class<*>, forceAccess: Boolean): List<Field> {\n    val result = ArrayList<Field>()\n    var c: Class<*>? = clazz\n    while (c != null) {\n        for (declaredField in c.declaredFields) {\n            if (!Modifier.isPublic(declaredField.modifiers)) {\n                if (forceAccess) {\n                    declaredField.isAccessible = true\n                } else {\n                    continue\n                }\n            }\n            result.add(declaredField)\n        }\n        c = c.superclass\n    }\n\n    for (anInterface in getAllInterfaces(clazz)) {\n        Collections.addAll(result, *anInterface.declaredFields)\n    }\n\n    return result\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/utils/log/Logger.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.utils.log\n\ninterface Logger {\n\n    fun trace(msg: String)\n\n    fun trace(msg: String, vararg args: Any?)\n\n    fun debug(msg: String)\n\n    fun debug(msg: String, vararg args: Any?)\n\n    fun info(msg: String)\n\n    fun info(msg: String, vararg args: Any?)\n\n    fun warn(msg: String)\n\n    fun warn(msg: String, vararg args: Any?)\n\n    fun error(msg: String)\n\n    fun error(msg: String, vararg args: Any?)\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/utils/log/Loggers.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.utils.log\n\nabstract class Loggers {\n\n    protected abstract fun getLogger(name: String): Logger\n\n    companion object {\n        var factory: Loggers = ZpaLoggers()\n\n        fun getLogger(name: Class<*>): Logger {\n            return factory.getLogger(name.name)\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/utils/log/ZpaLogger.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.utils.log\n\nclass ZpaLogger(private val logger: java.util.logging.Logger) : Logger {\n\n    private fun format(msg: String, args: Array<out Any?>): String {\n        var result = msg\n        for (arg in args) {\n            result = result.replaceFirst(\"{}\", arg.toString())\n        }\n        return result\n    }\n\n    override fun trace(msg: String) {\n        logger.finest(msg)\n    }\n\n    override fun trace(msg: String, vararg args: Any?) {\n        logger.finest(format(msg, args))\n    }\n\n    override fun debug(msg: String) {\n        logger.fine(msg)\n    }\n\n    override fun debug(msg: String, vararg args: Any?) {\n        logger.fine(format(msg, args))\n    }\n\n    override fun info(msg: String) {\n        logger.info(msg)\n    }\n\n    override fun info(msg: String, vararg args: Any?) {\n        logger.info(format(msg, args))\n    }\n\n    override fun warn(msg: String) {\n        logger.warning(msg)\n    }\n\n    override fun warn(msg: String, vararg args: Any?) {\n        logger.warning(format(msg, args))\n    }\n\n    override fun error(msg: String) {\n        logger.severe(msg)\n    }\n\n    override fun error(msg: String, vararg args: Any?) {\n        logger.severe(format(msg, args))\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/main/kotlin/com/felipebz/zpa/utils/log/ZpaLoggers.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.utils.log\n\nclass ZpaLoggers : Loggers() {\n    override fun getLogger(name: String): Logger {\n        return ZpaLogger(java.util.logging.Logger.getLogger(name))\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/CustomAnnotationBasedRulesDefinitionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa\n\nimport com.felipebz.zpa.api.annotations.ConstantRemediation\nimport com.felipebz.zpa.api.annotations.Rule\nimport com.felipebz.zpa.api.annotations.RuleProperty\nimport com.felipebz.zpa.rules.Repository\nimport com.felipebz.zpa.rules.RuleMetadataLoader\nimport com.felipebz.zpa.rules.ZpaRule\nimport com.felipebz.zpa.rules.ZpaRuleParam\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport java.util.*\n\nclass CustomAnnotationBasedRulesDefinitionTest {\n\n    @BeforeEach\n    fun setup() {\n        Locale.setDefault(Locale.ROOT)\n    }\n\n    @Test\n    fun noClassToAdd() {\n        assertThat(buildRepository().availableRules).isEmpty()\n    }\n\n    @Test\n    fun classWithoutRuleAnnotation() {\n        class NotRuleClass\n        assertThrows<IllegalArgumentException> {\n            buildSingleRuleRepository(NotRuleClass::class.java)\n        }\n    }\n\n    @Test\n    fun ruleAnnotationData() {\n        @Rule(key = \"key1\", name = \"name1\", description = \"description1\", tags = [\"mytag\"])\n        class RuleClass {\n            @RuleProperty(key = \"param1Key\", description = \"param1 description\")\n            var param1 = \"x\"\n        }\n\n        val rule = buildSingleRuleRepository(RuleClass::class.java)\n        assertThat(rule.key).isEqualTo(\"key1\")\n        assertThat(rule.name).isEqualTo(\"name1\")\n        assertThat(rule.htmlDescription).isEqualTo(\"description1\")\n        assertThat(rule.tags).containsOnly(\"mytag\")\n        assertThat(rule.template).isFalse\n        assertThat(rule.params).hasSize(1)\n        assertParam(rule.params[0], \"param1Key\", \"param1 description\")\n    }\n\n    @Rule(name = \"name1\", description = \"description1\")\n    internal class RuleClassWithoutAnnotationDefinedKey\n\n    @Test\n    fun ruleWithoutExplicitKeyCanBeAcceptable() {\n        val repository = buildRepository(LANGUAGE_KEY_WITH_RESOURCE_BUNDLE, RuleClassWithoutAnnotationDefinedKey::class.java)\n        val rule = repository.availableRules[0]\n        assertThat(rule.key).isEqualTo(RuleClassWithoutAnnotationDefinedKey::class.java.simpleName)\n        assertThat(rule.name).isEqualTo(\"name1\")\n    }\n\n    @Test\n    fun externalNamesAndDescriptions() {\n        @Rule(key = \"ruleWithExternalInfo\")\n        class RuleClass {\n            @RuleProperty(key = \"param1Key\")\n            var param1 = \"x\"\n            @RuleProperty\n            var param2 = \"x\"\n        }\n\n        val rule = buildSingleRuleRepository(RuleClass::class.java)\n        assertThat(rule.key).isEqualTo(\"ruleWithExternalInfo\")\n        assertThat(rule.name).isEqualTo(\"external name for ruleWithExternalInfo\")\n        assertThat(rule.htmlDescription).isEqualTo(\"description for ruleWithExternalInfo\")\n        assertThat(rule.params).hasSize(2)\n        assertParam(rule.params[0], \"param1Key\", \"description for param1\")\n        assertParam(rule.params[1], \"param2\", \"\")\n    }\n\n    @Test\n    fun classWithSqaleConstantRemediation() {\n        @Rule(key = \"key1\", name = \"name1\", description = \"description1\")\n        @ConstantRemediation(\"10min\")\n        class RuleClass\n\n        val rule = buildSingleRuleRepository(RuleClass::class.java)\n        assertThat(rule.remediationConstant).isEqualTo(\"10min\")\n    }\n\n    @Test\n    fun invalidSqaleAnnotation() {\n        @Rule(key = \"key1\", name = \"name1\", description = \"description1\")\n        @ConstantRemediation(\"xxx\")\n        class MyInvalidRuleClass\n\n        assertThrows<IllegalArgumentException> {\n            buildSingleRuleRepository(MyInvalidRuleClass::class.java)\n        }\n    }\n\n    @Test\n    fun loadMethodWithClassWithSqaleAnnotations() {\n        @Rule(key = \"key1\", name = \"name1\", description = \"description1\")\n        @ConstantRemediation(\"10min\")\n        class RuleClass\n\n        val repository = load(RuleClass::class.java)\n        assertThat(repository.availableRules).hasSize(1)\n    }\n\n    private fun assertParam(param: ZpaRuleParam, expectedKey: String, expectedDescription: String?) {\n        assertThat(param.key).isEqualTo(expectedKey)\n        assertThat(param.description).isEqualTo(expectedDescription)\n    }\n\n    private fun buildSingleRuleRepository(ruleClass: Class<*>): ZpaRule {\n        val repository = buildRepository(ruleClass)\n        assertThat(repository.availableRules).hasSize(1)\n        return repository.availableRules[0]\n    }\n\n    private fun buildRepository(vararg classes: Class<*>): Repository {\n        return buildRepository(LANGUAGE_KEY_WITH_RESOURCE_BUNDLE, *classes)\n    }\n\n    private fun buildRepository(languageKey: String, vararg classes: Class<*>): Repository {\n        val newRepository = createRepository()\n        CustomAnnotationBasedRulesDefinition(newRepository, languageKey, RuleMetadataLoader())\n                .addRuleClasses(classes.toList())\n        return newRepository\n    }\n\n    private fun load(vararg classes: Class<*>): Repository {\n        val languageKey = LANGUAGE_KEY_WITH_RESOURCE_BUNDLE\n        val newRepository = createRepository()\n        CustomAnnotationBasedRulesDefinition.load(newRepository, languageKey, classes.toList(), RuleMetadataLoader())\n        return newRepository\n    }\n\n    private fun createRepository(): Repository {\n        return Repository(REPO_KEY)\n    }\n\n    companion object {\n        private const val REPO_KEY = \"plsql\"\n        private const val LANGUAGE_KEY_WITH_RESOURCE_BUNDLE = \"languageKey\"\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/PlSqlChecksTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa\n\nimport com.felipebz.zpa.api.ZpaRulesDefinition\nimport com.felipebz.zpa.api.annotations.Rule\nimport com.felipebz.zpa.api.checks.PlSqlCheck\nimport com.felipebz.zpa.api.checks.PlSqlVisitor\nimport com.felipebz.zpa.rules.*\nimport org.assertj.core.api.Assertions.assertThat\nimport org.assertj.core.api.Assertions.fail\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\n\nclass PlSqlChecksTest {\n\n    private lateinit var activeRules: ActiveRules\n    private lateinit var customRulesDefinition: MyCustomPlSqlRulesDefinition\n    private val ruleMetadataLoader = RuleMetadataLoader()\n\n    @BeforeEach\n    fun setUp() {\n        val repository = Repository(DEFAULT_REPOSITORY_KEY)\n        CustomAnnotationBasedRulesDefinition(repository, \"plsqlopen\", RuleMetadataLoader())\n            .addRuleClasses(listOf(MyRule::class.java))\n\n        val customRepository = Repository(CUSTOM_REPOSITORY_KEY)\n        customRulesDefinition = MyCustomPlSqlRulesDefinition()\n        customRulesDefinition.define(customRepository)\n\n        activeRules = ActiveRules().addRepository(repository).addRepository(customRepository)\n    }\n\n    @Test\n    fun shouldReturnDefaultChecks() {\n        val checks = PlSqlChecks.createPlSqlCheck(activeRules, ruleMetadataLoader)\n        checks.addChecks(DEFAULT_REPOSITORY_KEY, listOf(MyRule::class.java))\n\n        val defaultVisitor = visitor(checks, DEFAULT_REPOSITORY_KEY, DEFAULT_RULE_KEY)\n\n        assertThat(checks.all()).hasSize(1)\n        assertThat(checks.ruleKey(defaultVisitor)).isNotNull\n        assertThat(checks.ruleKey(defaultVisitor)?.rule).isEqualTo(DEFAULT_RULE_KEY)\n        assertThat(checks.ruleKey(defaultVisitor)?.repository).isEqualTo(DEFAULT_REPOSITORY_KEY)\n    }\n\n    @Test\n    fun shouldReturnCustomChecks() {\n        val checks = PlSqlChecks.createPlSqlCheck(activeRules, ruleMetadataLoader)\n        checks.addCustomChecks(arrayOf(customRulesDefinition))\n\n        val customVisitor = visitor(checks, CUSTOM_REPOSITORY_KEY, CUSTOM_RULE_KEY)\n\n        assertThat(checks.all()).hasSize(1)\n        assertThat(checks.ruleKey(customVisitor)).isNotNull\n        assertThat(checks.ruleKey(customVisitor)?.rule).isEqualTo(CUSTOM_RULE_KEY)\n        assertThat(checks.ruleKey(customVisitor)?.repository).isEqualTo(CUSTOM_REPOSITORY_KEY)\n    }\n\n    @Test\n    fun shouldWorkWithoutCustomChecks() {\n        val checks = PlSqlChecks.createPlSqlCheck(activeRules, ruleMetadataLoader)\n        checks.addCustomChecks(null)\n        assertThat(checks.all()).hasSize(0)\n    }\n\n    @Test\n    fun shouldNotReturnRuleKeyIfCheckDoesNotExists() {\n        val checks = PlSqlChecks.createPlSqlCheck(activeRules, ruleMetadataLoader)\n        checks.addChecks(DEFAULT_REPOSITORY_KEY, listOf(MyRule::class.java))\n\n        assertThat(checks.ruleKey(MyCustomRule())).isNull()\n    }\n\n    private fun visitor(plSqlChecks: PlSqlChecks, repository: String, rule: String): PlSqlVisitor {\n        val key = RuleKey(repository, rule)\n\n        var visitor: PlSqlVisitor? = null\n\n        for (checks in plSqlChecks.checks) {\n            visitor = checks.of(key)\n\n            if (visitor != null) {\n                return visitor\n            }\n        }\n        return visitor ?: fail(\"Should return a visitor.\")\n    }\n\n    @Rule(key = DEFAULT_RULE_KEY, name = \"This is the default rules\", description = \"desc\")\n    class MyRule : PlSqlCheck()\n\n    @Rule(key = CUSTOM_RULE_KEY, name = \"This is a custom rules\", description = \"desc\")\n    class MyCustomRule : PlSqlCheck()\n\n    class MyCustomPlSqlRulesDefinition : ZpaRulesDefinition {\n        fun define(repository: ZpaRepository) {\n            CustomAnnotationBasedRulesDefinition(repository, \"plsqlopen\", RuleMetadataLoader())\n                .addRuleClasses(checkClasses().toList())\n        }\n\n        override fun repositoryName(): String {\n            return \"Custom Rule Repository\"\n        }\n\n        override fun repositoryKey(): String {\n            return CUSTOM_REPOSITORY_KEY\n        }\n\n        override fun checkClasses(): Array<Class<*>> {\n            return arrayOf(MyCustomRule::class.java)\n        }\n    }\n\n    companion object {\n        private const val DEFAULT_REPOSITORY_KEY = \"DefaultRuleRepository\"\n        private const val DEFAULT_RULE_KEY = \"MyRule\"\n        private const val CUSTOM_REPOSITORY_KEY = \"CustomRuleRepository\"\n        private const val CUSTOM_RULE_KEY = \"MyCustomRule\"\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/AnchoredDatatypeTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\n\nclass AnchoredDatatypeTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.ANCHORED_DATATYPE)\n    }\n\n    @Test\n    fun matchesSimpleTypeAttribute() {\n        assertThat(p).matches(\"name%type\")\n    }\n\n    @Test\n    fun matchesTableColumn() {\n        assertThat(p).matches(\"tab.name%type\")\n    }\n\n    @Test\n    fun matchesTableColumnWithExplicitSchema() {\n        assertThat(p).matches(\"schema.tab.name%type\")\n    }\n\n    @Test\n    fun matchesSimpleRowtypeAttribute() {\n        assertThat(p).matches(\"name%rowtype\")\n    }\n\n    @Test\n    fun matchesTypeAsColumnName() {\n        assertThat(p).matches(\"tab.type%type\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/DatatypeTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\n\nclass DatatypeTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.DATATYPE)\n    }\n\n    @Test\n    fun test() {\n        assertThat(p).matches(\"number\")\n        assertThat(p).matches(\"number(10)\")\n        assertThat(p).matches(\"number(10, 2)\")\n        assertThat(p).matches(\"number(*, 2)\")\n        assertThat(p).matches(\"number(10, -2)\")\n        assertThat(p).matches(\"number($\\$len)\")\n        assertThat(p).matches(\"number(1+2)\")\n        assertThat(p).matches(\"number(const_val)\")\n        assertThat(p).matches(\"number($\\$len, $\\$decimals)\")\n        assertThat(p).matches(\"clob character set any_cs\")\n        assertThat(p).matches(\"clob character set str%charset\")\n        assertThat(p).matches(\"varchar2(10)\")\n        assertThat(p).matches(\"varchar2(10 char)\")\n        assertThat(p).matches(\"varchar2(10) character set any_cs\")\n        assertThat(p).matches(\"varchar2(10) character set str%charset\")\n        assertThat(p).matches(\"varchar2($\\$len)\")\n        assertThat(p).matches(\"varchar2(const_val)\")\n        assertThat(p).matches(\"date\")\n        assertThat(p).matches(\"timestamp\")\n        assertThat(p).matches(\"timestamp(3)\")\n        assertThat(p).matches(\"timestamp with time zone\")\n        assertThat(p).matches(\"timestamp(3) with time zone\")\n        assertThat(p).matches(\"timestamp with local time zone\")\n        assertThat(p).matches(\"interval year to month\")\n        assertThat(p).matches(\"interval year(2) to month\")\n        assertThat(p).matches(\"interval day to second\")\n        assertThat(p).matches(\"interval day(2) to second\")\n        assertThat(p).matches(\"interval day to second(6)\")\n        assertThat(p).matches(\"interval day(2) to second(6)\")\n        assertThat(p).matches(\"my_datatype\")\n        assertThat(p).matches(\"my_char(5)\")\n        assertThat(p).matches(\"my_char(5 char)\")\n        assertThat(p).matches(\"my_char character set any_cs\")\n        assertThat(p).matches(\"my_number(10,2)\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/HostAndIndicatorVariableTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\n\nclass HostAndIndicatorVariableTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.HOST_AND_INDICATOR_VARIABLE)\n    }\n\n    @Test\n    fun matchesSimpleBindingVariable() {\n        assertThat(p).matches(\":var\")\n    }\n\n    @Test\n    fun matchesSimpleNumericBindingVariable() {\n        assertThat(p).matches(\":1\")\n    }\n\n    @Test\n    fun matchesShortIndicatorVariable() {\n        assertThat(p).matches(\":var:ind\")\n    }\n\n    @Test\n    fun matchesLongIndicatorVariable() {\n        assertThat(p).matches(\":var indicator :ind\")\n    }\n\n    @Test\n    fun matchesQuestionMarkBinding() {\n        assertThat(p).matches(\"?\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/IdentifierNameTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\n\nclass IdentifierNameTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.IDENTIFIER_NAME)\n    }\n\n    @Test\n    fun matchesSimpleIdentifier() {\n        assertThat(p).matches(\"x\")\n    }\n\n    @Test\n    fun matchesIdentifierWithNumber() {\n        assertThat(p).matches(\"t2\")\n    }\n\n    @Test\n    fun matchesIdentifierWithNumberSign() {\n        assertThat(p).matches(\"phone#\")\n        assertThat(p).matches(\"SN##\")\n    }\n\n    @Test\n    fun matchesIdentifierWithUnderscore() {\n        assertThat(p).matches(\"credit_limit\")\n        assertThat(p).matches(\"try_again_\")\n    }\n\n    @Test\n    fun matchesIdentifierWithDollarSign() {\n        assertThat(p).matches(\"oracle\\$number\")\n        assertThat(p).matches(\"money$$\\$tree\")\n    }\n\n    @Test\n    fun matchesQuotedIdentifier() {\n        assertThat(p).matches(\"\\\"X+Y\\\"\")\n        assertThat(p).matches(\"\\\"last name\\\"\")\n        assertThat(p).matches(\"\\\"on/off switch\\\"\")\n        assertThat(p).matches(\"\\\"employee(s)\\\"\")\n        assertThat(p).matches(\"\\\"*** header info ***\\\"\")\n    }\n\n    @Test\n    fun matchesNonReservedKeywords() {\n        assertThat(p).matches(\"cursor\")\n        assertThat(p).matches(\"rowid\")\n    }\n\n    @Test\n    fun matchesIdentifierWithSpecialCharacters() {\n        assertThat(p).matches(\"variável\")\n    }\n\n    @Test\n    fun notMatchesIdentifierStartingWithNumber() {\n        assertThat(p).notMatches(\"2foo\")\n    }\n\n    @Test\n    fun notMatchesIdentifierWithAmpersand() {\n        assertThat(p).notMatches(\"mine&yours\")\n    }\n\n    @Test\n    fun notMatchesIdentifierWithHyphen() {\n        assertThat(p).notMatches(\"debit-amount\")\n    }\n\n    @Test\n    fun notMatchesIdentifierWithSlash() {\n        assertThat(p).notMatches(\"on/off\")\n    }\n\n    @Test\n    fun notMatchesIdentifierWithSpace() {\n        assertThat(p).notMatches(\"user id\")\n    }\n\n    @Test\n    fun notMatchesQuotedIdentifierCornerCases() {\n        assertThat(p).notMatches(\"\\\"\\\"\")\n        assertThat(p).notMatches(\"\\\"\\\"\\\"\\\"\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/InquiryDirectiveTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\n\nclass InquiryDirectiveTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.INQUIRY_DIRECTIVE)\n    }\n\n    @Test\n    fun test() {\n        assertThat(p).matches(\"$\\$PLSQL_UNIT\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/IntervalLiteralTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\n\nclass IntervalLiteralTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.INTERVAL_LITERAL)\n    }\n\n    @Test\n    fun intervalYearToMonthLiteral() {\n        assertThat(p).matches(\"INTERVAL '4' YEAR\")\n        assertThat(p).matches(\"interval '4' year\")\n        assertThat(p).matches(\"INTERVAL '4' MONTH\")\n        assertThat(p).matches(\"INTERVAL '4' YEAR(3)\")\n        assertThat(p).matches(\"INTERVAL '4-2' YEAR TO MONTH\")\n    }\n\n    @Test\n    fun intervalDayToSecondLiteral() {\n        assertThat(p).matches(\"INTERVAL '4' DAY\")\n        assertThat(p).matches(\"interval '4' day\")\n        assertThat(p).matches(\"INTERVAL '25' HOUR\")\n        assertThat(p).matches(\"INTERVAL '40' MINUTE\")\n        assertThat(p).matches(\"INTERVAL '120' HOUR(3)\")\n        assertThat(p).matches(\"INTERVAL '10' MINUTE\")\n        assertThat(p).matches(\"INTERVAL '10' HOUR\")\n        assertThat(p).matches(\"INTERVAL '10:22' MINUTE TO SECOND\")\n        assertThat(p).matches(\"INTERVAL '30.12345' SECOND(2,4)\")\n        assertThat(p).matches(\"INTERVAL '11:20' HOUR TO MINUTE\")\n        assertThat(p).matches(\"INTERVAL '11:12:10.2222222' HOUR TO SECOND(7)\")\n        assertThat(p).matches(\"INTERVAL '400' DAY(3)\")\n        assertThat(p).matches(\"INTERVAL '400 5' DAY(3) TO HOUR\")\n        assertThat(p).matches(\"INTERVAL '4 5:12' DAY TO MINUTE\")\n        assertThat(p).matches(\"INTERVAL '4 5:12:10.222' DAY TO SECOND(3)\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/OperatorsTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.Test\n\nclass OperatorsTest : RuleTest() {\n\n    @Test\n    fun concatenation() {\n        setRootRule(PlSqlGrammar.CONCATENATION_OPERATOR)\n        assertThat(p).matches(\"||\")\n    }\n\n    @Test\n    fun equals() {\n        setRootRule(PlSqlGrammar.EQUALS_OPERATOR)\n        assertThat(p).matches(\"=\")\n    }\n\n    @Test\n    fun notEquals() {\n        setRootRule(PlSqlGrammar.NOTEQUALS_OPERATOR)\n        assertThat(p).matches(\"<>\")\n        assertThat(p).matches(\"!=\")\n        assertThat(p).matches(\"^=\")\n        assertThat(p).matches(\"~=\") // this operator is supported in Oracle Forms\n    }\n\n    @Test\n    fun lessThan() {\n        setRootRule(PlSqlGrammar.LESSTHAN_OPERATOR)\n        assertThat(p).matches(\"<\")\n    }\n\n    @Test\n    fun lessThanOrEquals() {\n        setRootRule(PlSqlGrammar.LESSTHANOREQUALS_OPERATOR)\n        assertThat(p).matches(\"<=\")\n    }\n\n    @Test\n    fun greaterThan() {\n        setRootRule(PlSqlGrammar.GREATERTHAN_OPERATOR)\n        assertThat(p).matches(\">\")\n    }\n\n    @Test\n    fun greaterThanOrEquals() {\n        setRootRule(PlSqlGrammar.GREATERTHANOREQUALS_OPERATOR)\n        assertThat(p).matches(\">=\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/RefDatatypeTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\n\nclass RefDatatypeTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.REF_DATATYPE)\n    }\n\n    @Test\n    fun matchesSimpleRef() {\n        assertThat(p).matches(\"ref custom\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/RuleTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api\n\nimport com.felipebz.flr.api.Grammar\nimport com.felipebz.flr.grammar.GrammarRuleKey\nimport com.felipebz.flr.impl.Parser\nimport com.felipebz.zpa.parser.PlSqlParser\nimport com.felipebz.zpa.squid.PlSqlConfiguration\nimport java.nio.charset.StandardCharsets\n\nabstract class RuleTest {\n    private var errorRecoveryEnabled: Boolean = false\n\n    lateinit var p: Parser<Grammar>\n\n    protected fun setRootRule(ruleKey: GrammarRuleKey) {\n        p = PlSqlParser.create(PlSqlConfiguration(StandardCharsets.UTF_8, errorRecoveryEnabled))\n        p.setRootRule(p.grammar.rule(ruleKey))\n    }\n\n    protected fun setErrorRecoveryEnabled(value: Boolean) {\n        errorRecoveryEnabled = value\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/conditions/IsJsonConditionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.conditions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.ConditionsGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass IsJsonConditionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(ConditionsGrammar.CONDITION)\n    }\n\n    @Test\n    fun matchesSimpleIsJson() {\n        assertThat(p).matches(\"foo is json\")\n    }\n\n    @Test\n    fun matchesSimpleIsNotJson() {\n        assertThat(p).matches(\"foo is not json\")\n    }\n\n    @Test\n    fun matchesIsJsonFormatJson() {\n        assertThat(p).matches(\"foo is json format json\")\n    }\n\n    @Test\n    fun matchesIsJsonStrictLax() {\n        assertThat(p).matches(\"foo is json strict\")\n        assertThat(p).matches(\"foo is json lax\")\n    }\n\n    @Test\n    fun matchesIsJsonStrictAllowDisallowScalars() {\n        assertThat(p).matches(\"foo is json allow scalars\")\n        assertThat(p).matches(\"foo is json disallow scalars\")\n    }\n\n    @Test\n    fun matchesIsJsonStrictWithWithoutUniqueKeys() {\n        assertThat(p).matches(\"foo is json with unique keys\")\n        assertThat(p).matches(\"foo is json without unique keys\")\n    }\n\n    @Test\n    fun matchesIsJsonValidate() {\n        assertThat(p).matches(\"foo is json validate '{}'\")\n    }\n\n    @Test\n    fun matchesIsJsonValidateCast() {\n        assertThat(p).matches(\"foo is json validate cast '{}'\")\n    }\n\n    @Test\n    fun matchesIsJsonValidateUsing() {\n        assertThat(p).matches(\"foo is json validate cast '{}'\")\n    }\n\n    @Test\n    fun matchesIsJsonWithColumnModifier() {\n        assertThat(p).matches(\"foo is json object\")\n    }\n\n    @Test\n    fun matchesIsJsonWithColumnModifierInParenthesis() {\n        assertThat(p).matches(\"foo is json (object)\")\n    }\n\n    @Test\n    fun matchesIsJsonWithMultipleColumnModifier() {\n        assertThat(p).matches(\"foo is json (value, array, object, scalar number, scalar timestamp with time zone)\")\n    }\n\n    @Test\n    fun matchesLongIsJson() {\n        assertThat(p).matches(\"\"\"\n            foo is json (value, array, object, scalar number, scalar timestamp with time zone)\n            format json strict allow scalars with unique keys\n            \"\"\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/conditions/IsOfConditionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.conditions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.ConditionsGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass IsOfConditionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(ConditionsGrammar.CONDITION)\n    }\n\n    @Test\n    fun matchesSimpleIsOf() {\n        assertThat(p).matches(\"foo is of (bar)\")\n    }\n\n    @Test\n    fun matchesSimpleIsNotOf() {\n        assertThat(p).matches(\"foo is not of (bar)\")\n    }\n\n    @Test\n    fun matchesIsOfType() {\n        assertThat(p).matches(\"foo is of type (bar)\")\n    }\n\n    @Test\n    fun matchesIsNotOfType() {\n        assertThat(p).matches(\"foo is not of type (bar)\")\n    }\n\n    @Test\n    fun matchesIsOfMultipleType() {\n        assertThat(p).matches(\"foo is of type (bar, baz, foobar)\")\n    }\n\n    @Test\n    fun matchesIsOfOnly() {\n        assertThat(p).matches(\"foo is of type (only bar)\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/conditions/JsonEqualConditionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.conditions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.ConditionsGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass JsonEqualConditionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(ConditionsGrammar.CONDITION)\n    }\n\n    @Test\n    fun matchesSimpleJsonEqual() {\n        assertThat(p).matches(\"json_equal('{}', '{}')\")\n    }\n\n    @Test\n    fun matchesJsonEqualOnErrorClause() {\n        assertThat(p).matches(\"json_equal('{}', '{}' error on error)\")\n        assertThat(p).matches(\"json_equal('{}', '{}' true on error)\")\n        assertThat(p).matches(\"json_equal('{}', '{}' false on error)\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/conditions/JsonExistsConditionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.conditions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.ConditionsGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass JsonExistsConditionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(ConditionsGrammar.CONDITION)\n    }\n\n    @Test\n    fun matchesSimpleJsonExists() {\n        assertThat(p).matches(\"json_exists(doc, '$.a')\")\n    }\n\n    @Test\n    fun matchesJsonExistsFormatJson() {\n        assertThat(p).matches(\"json_exists(doc format json, '$.a')\")\n    }\n\n    @Test\n    fun matchesJsonExistsWithPassing() {\n        assertThat(p).matches(\"json_exists(doc, '$.a' passing var1 as a, var2 as b)\")\n    }\n\n    @Test\n    fun matchesJsonExistsOnError() {\n        assertThat(p).matches(\"json_exists(doc, '$.a' error on error)\")\n    }\n\n    @Test\n    fun matchesJsonExistsStrict() {\n        assertThat(p).matches(\"json_exists(doc, '$.a' type strict)\")\n    }\n\n    @Test\n    fun matchesJsonExistsOnEmpty() {\n        assertThat(p).matches(\"json_exists(doc, '$.a' error on empty)\")\n    }\n\n    @Test\n    fun matchesLongJsonExists() {\n        assertThat(p).matches(\"\"\"\n            json_exists(doc format json, '$.a'\n            passing var1 as a, var2 as b\n            false on error\n            type lax\n            true on empty)\n            \"\"\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/conditions/JsonTextContainsConditionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.conditions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.ConditionsGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass JsonTextContainsConditionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(ConditionsGrammar.CONDITION)\n    }\n\n    @Test\n    fun matchesSimpleJsonTextcontains() {\n        assertThat(p).matches(\"json_textcontains(doc, '$.a', val)\")\n    }\n\n    @Test\n    fun notMatchesJsonTextcontainsIfPathIsNotString() {\n        assertThat(p).notMatches(\"json_textcontains(doc, path, val)\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/dcl/GrantStatementTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.dcl\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.DclGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass GrantStatementTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(DclGrammar.GRANT_STATEMENT)\n    }\n\n    @Test\n    fun matchesSimpleSystemGrant() {\n        assertThat(p).matches(\"grant connect to user1;\")\n    }\n\n    @Test\n    fun matchesGrantToPublic() {\n        assertThat(p).matches(\"grant connect to public;\")\n    }\n\n    @Test\n    fun matchesSystemGrantWithLongPrivilegeName() {\n        assertThat(p).matches(\"grant execute any procedure to user1;\")\n    }\n\n    @Test\n    fun matchesSimpleSystemGrantAllPrivileges() {\n        assertThat(p).matches(\"grant all privileges to user1;\")\n    }\n\n    @Test\n    fun matchesMultipleRoleGrantToUser() {\n        assertThat(p).matches(\"grant connect, resource to user1;\")\n    }\n\n    @Test\n    fun matchesSystemGrantWithGranteeIdentifiedBy() {\n        assertThat(p).matches(\"grant connect to user1 identified by pass;\")\n    }\n\n    @Test\n    fun matchesSystemGrantWithMultipleGranteeIdentifiedBy() {\n        assertThat(p).matches(\"grant connect to user1, user2 identified by pass1, pass2;\")\n    }\n\n    @Test\n    fun matchesSystemGrantWithAdminOption() {\n        assertThat(p).matches(\"grant foo to bar with admin option;\")\n    }\n\n    @Test\n    fun matchesSystemGrantWithDelegateOption() {\n        assertThat(p).matches(\"grant foo to bar with delegate option;\")\n    }\n\n    @Test\n    fun matchesSystemGrantInCurrentContainer() {\n        assertThat(p).matches(\"grant foo to bar container = current;\")\n    }\n\n    @Test\n    fun matchesSystemGrantInAllContainers() {\n        assertThat(p).matches(\"grant foo to bar container = all;\")\n    }\n\n    @Test\n    fun matchesLongSystemGrant() {\n        assertThat(p).matches(\"grant foo to bar with admin option container = all;\")\n    }\n\n    @Test\n    fun matchesSimpleGrantOnObject() {\n        assertThat(p).matches(\"grant execute on proc to user1;\")\n    }\n\n    @Test\n    fun matchesGrantOnObjectToPublic() {\n        assertThat(p).matches(\"grant execute on proc to public;\")\n    }\n\n    @Test\n    fun matchesGrantWithColumnOnObject() {\n        assertThat(p).matches(\"grant select (col) on tab to user1;\")\n    }\n\n    @Test\n    fun matchesGrantWithMultipleColumnsOnObject() {\n        assertThat(p).matches(\"grant select (col, col2) on tab to user1;\")\n    }\n\n    @Test\n    fun matchesGrantOnObjectWithHierarchyOption() {\n        assertThat(p).matches(\"grant execute on proc to user1 with hierarchy option;\")\n    }\n\n    @Test\n    fun matchesGrantOnObjectWithGrantOption() {\n        assertThat(p).matches(\"grant execute on proc to user1 with grant option;\")\n    }\n\n    @Test\n    fun matchesGrantOnObjectWithHierarchyAndGrantOption() {\n        assertThat(p).matches(\"grant execute on proc to user1 with hierarchy option with grant option;\")\n    }\n\n    @Test\n    fun matchesGrantRoleToFunction() {\n        assertThat(p).matches(\"grant foo to function bar;\")\n    }\n\n    @Test\n    fun matchesGrantRoleToProcedure() {\n        assertThat(p).matches(\"grant foo to procedure bar;\")\n    }\n\n    @Test\n    fun matchesGrantRoleToPackage() {\n        assertThat(p).matches(\"grant foo to package bar;\")\n    }\n\n    @Test\n    fun matchesGrantRoleToMultiplePrograms() {\n        assertThat(p).matches(\"grant foo, bar to package foo2, procedure bar2;\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/ddl/AlterFunctionUnitTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.ddl\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.DdlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass AlterFunctionUnitTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(DdlGrammar.ALTER_FUNCTION)\n    }\n\n    @Test\n    fun matchesAlterFunctionCompile() {\n        assertThat(p).matches(\"alter function foo compile;\")\n    }\n\n    @Test\n    fun matchesAlterFunctionIfExists() {\n        assertThat(p).matches(\"alter function if exists foo compile;\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/ddl/AlterPackageUnitTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.ddl\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.DdlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass AlterPackageUnitTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(DdlGrammar.ALTER_PACKAGE)\n    }\n\n    @Test\n    fun matchesAlterPackageCompile() {\n        assertThat(p).matches(\"alter package foo compile;\")\n    }\n\n    @Test\n    fun matchesAlterPackageIfExists() {\n        assertThat(p).matches(\"alter package if exists foo compile;\")\n    }\n\n    @Test\n    fun matchesAlterPackageCompileBody() {\n        assertThat(p).matches(\"alter package foo compile body;\")\n    }\n\n    @Test\n    fun matchesAlterPackageCompileBodyDebug() {\n        assertThat(p).matches(\"alter package foo compile debug body;\")\n    }\n\n    @Test\n    fun matchesAlterPackageCompilePackage() {\n        assertThat(p).matches(\"alter package foo compile package;\")\n    }\n\n    @Test\n    fun matchesAlterPackageCompileSpecification() {\n        assertThat(p).matches(\"alter package foo compile specification;\")\n    }\n\n    @Test\n    fun matchesAlterPackageCompileSpecificationReuseSettings() {\n        assertThat(p).matches(\"alter package foo compile debug specification reuse settings;\")\n    }\n\n    @Test\n    fun matchesAlterPackageCompileSpecificationWithOptionAndReuseSettings() {\n        assertThat(p).matches(\"alter package foo compile debug specification plsql_ccflags='no_op:true' plsql_ccflags='no_op:true' reuse settings;\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/ddl/AlterProcedureUnitTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.ddl\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.DdlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass AlterProcedureUnitTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(DdlGrammar.ALTER_PROCEDURE)\n    }\n\n    @Test\n    fun matchesAlterProcedureCompile() {\n        assertThat(p).matches(\"alter procedure foo compile;\")\n    }\n\n    @Test\n    fun matchesAlterProcedureIfExists() {\n        assertThat(p).matches(\"alter procedure if exists foo compile;\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/ddl/AlterTableTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.ddl\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.DdlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass AlterTableTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(DdlGrammar.ALTER_TABLE)\n    }\n\n    @Test\n    fun matchesAlterTableWithOutOfLineConstraint() {\n        assertThat(p).matches(\"alter table tab add constraint c_name foreign key (f_key) references tab.col (name);\")\n    }\n\n    @Test\n    fun matchesAlterTableWithOutOfLineConstraintUsingAndTablespace() {\n        assertThat(p).matches(\"alter table tab add constraint c_name primary key (col1, col2) using index;\")\n    }\n\n    @Test\n    fun matchesAlterTableAddColumnWithDefaultOnNull() {\n        assertThat(p).matches(\"alter table tab add col varchar2(100) default on null 'Default String';\")\n    }\n\n    @Test\n    fun matchesAlterTableAddColumnWithDefaultWithoutOnNull() {\n        assertThat(p).matches(\"alter table tab add col varchar2(100) default 'Default String';\")\n    }\n\n    @Test\n    fun matchesAlterTableAddColumnWithDefaultOnNullForInsertOnly() {\n        assertThat(p).matches(\"alter table tab add col varchar2(100) default on null for insert only 'Default String';\")\n    }\n\n    @Test\n    fun matchesAlterTableAddColumnWithDefaultOnNullForInsertAndUpdate() {\n        assertThat(p).matches(\"alter table tab add col varchar2(100) default on null for insert and update 'Default String';\")\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/ddl/AlterTriggerUnitTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.ddl\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.DdlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass AlterTriggerUnitTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(DdlGrammar.ALTER_TRIGGER)\n    }\n\n    @Test\n    fun matchesAlterTriggerDisable() {\n        assertThat(p).matches(\"alter trigger foo disable;\")\n    }\n\n    @Test\n    fun matchesAlterTriggerEnable() {\n        assertThat(p).matches(\"alter trigger foo enable;\")\n    }\n\n    @Test\n    fun matchesAlterTriggerDisableWithSchema() {\n        assertThat(p).matches(\"alter trigger foo.bar disable;\")\n    }\n\n    @Test\n    fun matchesAlterTriggerDisableWithQuotedIdentifier() {\n        assertThat(p).matches(\"alter trigger \\\"foo\\\" rename to \\\"bar\\\";\")\n    }\n\n    @Test\n    fun matchesAlterTriggerCompile() {\n        assertThat(p).matches(\"alter trigger foo compile;\")\n    }\n\n    @Test\n    fun matchesAlterTriggerIfExists() {\n        assertThat(p).matches(\"alter trigger if exists foo compile;\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/ddl/CreateDirectoryTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.ddl\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.DdlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass CreateDirectoryTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(DdlGrammar.CREATE_DIRECTORY)\n    }\n\n    @Test\n    fun matchesSimpleCreateDirectory() {\n        assertThat(p).matches(\"create directory foo as 'path';\")\n    }\n\n    @Test\n    fun matchesSimpleCreateOrReplaceDirectory() {\n        assertThat(p).matches(\"create or replace directory foo as 'path';\")\n    }\n\n    @Test\n    fun matchesCreateIfNotExistsDirectory() {\n        assertThat(p).matches(\"create directory if not exists foo as 'path';\")\n    }\n\n    @Test\n    fun matchesLongCreateDirectory() {\n        assertThat(p).matches(\"create directory if not exists foo sharing = metadata as 'path';\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/ddl/CreateSequenceTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.ddl\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.DdlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass CreateSequenceTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(DdlGrammar.CREATE_SEQUENCE)\n    }\n\n    @Test\n    fun matchesSimpleCreateSequence() {\n        assertThat(p).matches(\"create sequence seq_name;\")\n    }\n\n    @Test\n    fun matchesCreateSequenceStart() {\n        assertThat(p).matches(\"create sequence seq_name start with 1;\")\n    }\n\n    @Test\n    fun matchesCreateSequenceIncrement() {\n        assertThat(p).matches(\"create sequence seq_name increment by 1;\")\n    }\n\n    @Test\n    fun matchesCreateSequenceStartIncrement() {\n        assertThat(p).matches(\"create sequence seq_name start with 1 increment by 1;\")\n    }\n\n    @Test\n    fun matchesCreateSequenceCache() {\n        assertThat(p).matches(\"create sequence seq_name cache 10;\")\n    }\n\n    @Test\n    fun matchesCreateSequenceNoCache() {\n        assertThat(p).matches(\"create sequence seq_name nocache;\")\n    }\n\n    @Test\n    fun matchesCreateSequenceXXX() {\n        assertThat(p).matches(\"create sequence seq_name start with 1 MAXVALUE 9999 MINVALUE 1 NOCYCLE CACHE 20 ORDER;\")\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/ddl/CreateSynonymTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.ddl\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.DdlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass CreateSynonymTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(DdlGrammar.CREATE_SYNONYM)\n    }\n\n    @Test\n    fun matchesSimpleCreateSynonym() {\n        assertThat(p).matches(\"create synonym foo for bar;\")\n    }\n\n    @Test\n    fun matchesCreatePublicSynonym() {\n        assertThat(p).matches(\"create public synonym foo for bar;\")\n    }\n\n    @Test\n    fun matchesEditionableSynonym() {\n        assertThat(p).matches(\"create editionable synonym foo for bar;\")\n    }\n\n    @Test\n    fun matchesNonEditionableSynonym() {\n        assertThat(p).matches(\"create noneditionable synonym foo for bar;\")\n    }\n\n    @Test\n    fun matchesSynonymWithSharingMetada() {\n        assertThat(p).matches(\"create synonym foo sharing = metadata for bar;\")\n    }\n\n    @Test\n    fun matchesSynonymWithSharingNone() {\n        assertThat(p).matches(\"create synonym foo sharing = none for bar;\")\n    }\n\n    @Test\n    fun matchesCreateorReplaceSynonym() {\n        assertThat(p).matches(\"create or replace synonym foo for bar;\")\n    }\n\n    @Test\n    fun matchesLongSynonym() {\n        assertThat(p).matches(\"create or replace public synonym sch.foo for sch.bar@link;\")\n        assertThat(p).matches(\"create or replace public synonym sch.foo for sch.bar@link.domain.com;\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/ddl/CreateTableTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.ddl\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.DdlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass CreateTableTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(DdlGrammar.CREATE_TABLE)\n    }\n\n    @Test\n    fun matchesSimpleCreateTable() {\n        assertThat(p).matches(\"create table tab (id number);\")\n    }\n\n    @Test\n    fun matchesMultipleColumns() {\n        assertThat(p).matches(\"create table tab (id number, name number);\")\n    }\n\n    @Test\n    fun matchesTableWithSchema() {\n        assertThat(p).matches(\"create table sch.tab (id number);\")\n    }\n\n    @Test\n    fun matchesTemporaryTable() {\n        assertThat(p).matches(\"create global temporary table tab (id number);\")\n    }\n\n    @Test\n    fun matchesTemporaryTableWithTablespace() {\n        assertThat(p).matches(\"create global temporary table tab (id number) tablespace table_space;\")\n    }\n\n    @Test\n    fun matchesTemporaryTableOnCommitDeleteRows() {\n        assertThat(p).matches(\"create global temporary table tab (id number) on commit delete rows;\")\n    }\n\n    @Test\n    fun matchesTemporaryTableOnCommitPreserveRows() {\n        assertThat(p).matches(\"create global temporary table tab (id number) on commit preserve rows;\")\n    }\n\n    @Test\n    fun matchesCreateTableWithOutOfLineConstraint() {\n        assertThat(p).matches(\"create table tab (id number, constraint pk primary key(id));\")\n    }\n\n    @Test\n    fun matchesPartitionByRangeMulti() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id1, column_id2) (partition patition_id values less than (column_id));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_RVC_I() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (column_id));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_RVC_IE() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition values less than (column_id));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_RVC_IM() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (column_id1, column_id2));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_RV_MV() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_SAC_PAC_PCTFREE() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) pctfree 100);\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_SAC_PAC_PCTUSED() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) pctused 100);\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_SAC_PAC_INITRANS() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) initrans 100);\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_SAC_PAC_SC_ISC_K() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) storage (initial 100 k));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_SAC_PAC_SC_ISC_M() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) storage (initial 100 m));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_SAC_PAC_SC_ISC_G() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) storage (initial 100 g));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_SAC_PAC_SC_ISC_T() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) storage (initial 100 t));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_SAC_PAC_SC_ISC_P() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) storage (initial 100 p));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_SAC_PAC_SC_ISC_NEXT() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) storage (next 100 k));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_SAC_PAC_SC_ISC_MINE() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) storage (minextents 100));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_SAC_PAC_SC_ISC_MAXE() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) storage (maxextents 100));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_SAC_PAC_SC_ISC_MAXE_U() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) storage (maxextents unlimited));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_SAC_PAC_SC_ISC_PCTI() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) storage (pctincrease 100) );\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_SAC_PAC_SC_ISC_FLS() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) storage (freelists 100));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_SAC_PAC_SC_ISC_FL() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) storage (freelist groups 100));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_SAC_PAC_SC_ISC_OP() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) storage (optimal 100 k));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_SAC_PAC_SC_ISC_OP_NULL() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) storage (optimal null));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_SAC_PAC_SC_ISC_BP_K() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) storage (buffer_pool keep));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_SAC_PAC_SC_ISC_BP_R() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) storage (buffer_pool recycle));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_SAC_PAC_SC_ISC_BP_D() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) storage (buffer_pool default));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_SAC_TB() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) pctfree 100 tablespace tablespace_id1);\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_SAC_LOG() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) pctfree 100 tablespace tablespace_id1 logging);\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_TC() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) compress);\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_TNC() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) nocompress);\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_KC() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) mapping table);\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_NP() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) nomapping);\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_OF() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) overflow pctfree 100 tablespace tablespace_id1 logging);\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_LSC_LPAR_TS() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) lob (lob_id) store as (tablespace tablespace_id));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_LSC_LPAR_TSM() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) lob (lob_id) store as (tablespace tablespace_id1 tablespace tablespace_id2));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_LSC_LPAR_SNE() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) lob (lob_id) store as (enable storage in now));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_LSC_LPAR_SND() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) lob (lob_id) store as (disable storage in now));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_LSC_LPAR_SC() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) lob (lob_id) store as (storage (initial 100 k)));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_LSC_LPAR_C() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) lob (lob_id) store as (chunk 100));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_LSC_LPAR_PCT() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) lob (lob_id) store as (pctversion 100));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_LSC_LPAR_R() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) lob (lob_id) store as (retention));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_LSC_LPAR_FP() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) lob (lob_id) store as (freepools 100));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_LSC_LPAR_CACHE() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) lob (lob_id) store as (cache));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_LSC_LPAR_NCACHE() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) lob (lob_id) store as (nocache));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_LSC_LPAR_NCACHE_LOG() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) lob (lob_id) store as (nocache logging));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_LSC_LPAR_CACHE_R() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) lob (lob_id) store as (cache reads));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_LSC_LPARSL() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) lob (lob_id) store as segment_id (tablespace tablespace_id));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_LSC_LPARSI() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) lob (lob_id) store as segment_id);\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_LSC_VARRAY_LPAR() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) varray array_id store as lob segment_id);\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_LSC_VARRAY_SCCET_DT_LPAR() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) varray array_id element is of type (only number) store as lob segment_id (tablespace tablespace_id));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_LSC_VARRAY_SCCET_DT() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) varray array_id element is of type (only number) store as lob segment_id);\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_LSC_VARRAY_SCCT_DT() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) varray array_id is of type (only number) store as lob segment_id);\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_LSC_VARRAY_SCC_DT() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) varray array_id is of (only number) store as lob segment_id);\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_LSC_VARRAY_SCCS_DT() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) varray array_id substitutable at all levels);\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_LSC_VARRAY_SCCNS_DT() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) varray array_id not substitutable at all levels);\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_PLS_STORE_TBL() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) subpartitions 1 store in (tablespace_id));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_PLS_STORE_TBLS() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) subpartitions 1 store in (tablespace_id1, tablespace_id2));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_PLS_SS_IDENT_LVCL() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) (subpartition subpartition_id values ('value')));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_PLS_SS_IDENT_LVCLM() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) (subpartition subpartition_id values ('value', null)));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_PLS_SS_IDENT_LVCN() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) (subpartition subpartition_id values (null)));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_PLS_SS_IDENT_LVCD() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) (subpartition subpartition_id values (default)));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_PLS_SS_IDENT_LVCL_PSC_TBL() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) (subpartition subpartition_id values ('value') tablespace tablespace_id));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_PLS_SS_IDENT_LVCL_PSC_OVFL_TBL() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) (subpartition subpartition_id values ('value') overflow tablespace tablespace_id));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_PLS_SS_IDENT_LVCL_PSC_OVFL() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) (subpartition subpartition_id values ('value') overflow));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_PLS_SS_IDENT_LVCL_PSC_LOBST() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) (subpartition subpartition_id values ('value') lob (lob_id) store as segment_id (tablespace tablespace_id)));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_PLS_SS_IDENT_LVCL_PSC_LOBS() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) (subpartition subpartition_id values ('value') lob (lob_id) store as segment_id));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_PLS_SS_IDENT_LVCL_PSC_LOBT() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) (subpartition subpartition_id values ('value') lob (lob_id) store as (tablespace tablespace_id)));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_PLS_SS_IDENT_LVCL_PSC_LOBTM() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) (subpartition subpartition_id values ('value') lob (lob_id1) store as (tablespace tablespace_id1) lob (lob_id2) store as (tablespace tablespace_id2)));\")\n    }\n\n    @Test\n    fun matchesPartitionByRange_TPD_PLS_SS_IDENT_LVCL_PSC_VARRAY() {\n        assertThat(p).matches(\"create global temporary table table_id (id number) partition by range (column_id) (partition patition_id values less than (maxvalue) (subpartition subpartition_id values ('value') varray array_id store as lob segment_id));\")\n    }\n\n    @Test\n    fun matchesPartitionByHash_IHP_PSC() {\n        assertThat(p).matches(\"create table table_id (id number) partition by hash (column_id) (partition partition_id tablespace tablespace_id);\")\n    }\n\n    @Test\n    fun matchesPartitionByHashM_IHP_PSC() {\n        assertThat(p).matches(\"create table table_id (id1 number, id2 varchar) partition by hash (column_id) (partition partition_id tablespace tablespace_id);\")\n    }\n\n    @Test\n    fun matchesPartitionByHash_IHPM_PSC() {\n        assertThat(p).matches(\"create table table_id (id number) partition by hash (column_id) (partition partition_id1 tablespace tablespace_id1, partition partition_id2 tablespace tablespace_id2);\")\n    }\n\n    @Test\n    fun matchesPartitionByHash_HPBQ() {\n        assertThat(p).matches(\"create table table_id (id number) partition by hash (column_id) partitions 1;\")\n    }\n\n    @Test\n    fun matchesPartitionByHash_HPBQ_STORE() {\n        assertThat(p).matches(\"create table table_id (id number) partition by hash (column_id) partitions 1 store in (tablespace_id);\")\n    }\n\n    @Test\n    fun matchesPartitionByHash_HPBQ_STOREM() {\n        assertThat(p).matches(\"create table table_id (id number) partition by hash (column_id) partitions 1 store in (tablespace_id1, tablespace_id2);\")\n    }\n\n    @Test\n    fun matchesPartitionByHash_HPBQ_STORE_OFLW() {\n        assertThat(p).matches(\"create table table_id (id number) partition by hash (column_id) partitions 1 store in (tablespace_id) overflow store in (tablespace_id);\")\n    }\n\n    @Test\n    fun matchesPartitionByHash_HPBQ_STORE_OFLWM() {\n        assertThat(p).matches(\"create table table_id (id number) partition by hash (column_id) partitions 1 store in (tablespace_id) overflow store in (tablespace_id1, tablespace_id2);\")\n    }\n\n    @Test\n    fun matchesPartitionByHash_PBL_LVC() {\n        assertThat(p).matches(\"create table table_id (id number) partition by list (column_id) (partition partition_id values (default) compress);\")\n    }\n\n    @Test\n    fun matchesPartitionByHash_PBLN_LVC() {\n        assertThat(p).matches(\"create table table_id (id number) partition by list (column_id) (partition values (default) compress);\")\n    }\n\n    @Test\n    fun matchesPartitionByHash_PBLM_LVC() {\n        assertThat(p).matches(\"create table table_id (id number) partition by list (column_id) (partition partition_id1 values (default) compress, partition partition_id2 values (null) nocompress);\")\n    }\n\n    @Test\n    fun matchesPartitionComposite_SBL_ST_LVC_PSC_IDENT() {\n        assertThat(p).matches(\"create table table_id (id number) partition by range (column_id) subpartition by list (column_id) subpartition template (subpartition subpartition_id values (default) tablespace tablespace_id) (partition partition_id values less than (maxvalue) compress);\")\n    }\n\n    @Test\n    fun matchesPartitionComposite_SBL_ST_LVC_PSC() {\n        assertThat(p).matches(\"create table table_id (id number) partition by range (column_id) subpartition by list (column_id) subpartition template (subpartition subpartition_id values (default) tablespace tablespace_id) (partition values less than (maxvalue) compress);\")\n    }\n\n    @Test\n    fun matchesPartitionComposite_SBL_ST_LVC() {\n        assertThat(p).matches(\"create table table_id (id number) partition by range (column_id) subpartition by list (column_id) subpartition template (subpartition subpartition_id values (default)) (partition values less than (maxvalue) compress);\")\n    }\n\n    @Test\n    fun matchesPartitionComposite_SBL_ST_LVCM() {\n        assertThat(p).matches(\"create table table_id (id number) partition by range (column_id) subpartition by list (column_id) subpartition template (subpartition subpartition_id1 values (default), subpartition subpartition_id2 values (null)) (partition values less than (maxvalue) compress);\")\n    }\n\n    @Test\n    fun matchesPartitionComposite_SBL_ST() {\n        assertThat(p).matches(\"create table table_id (id number) partition by range (column_id) subpartition by list (column_id) subpartition template 1 (partition values less than (maxvalue) compress);\")\n    }\n\n    @Test\n    fun matchesPartitionComposite_SBL_ST_HSQ() {\n        assertThat(p).matches(\"create table table_id (id number) partition by range (column_id) subpartition by list (column_id) subpartition template (subpartition subpartition_id) (partition values less than (maxvalue) compress);\")\n    }\n\n    @Test\n    fun matchesPartitionComposite_SBL_ST_LVC_PSC_MULT() {\n        assertThat(p).matches(\"create table table_id (id number) partition by range (column_id) subpartition by list (column_id) subpartition template (subpartition subpartition_id values (default) tablespace tablespace_id) (partition partition_id1 values less than (maxvalue) compress, partition partition_id2 values less than (maxvalue) compress);\")\n    }\n\n    @Test\n    fun matchesPartitionComposite_SBH_SUB_STORE() {\n        assertThat(p).matches(\"create table table_id (id number) partition by range (column_id) subpartition by hash (column_id) subpartitions 1 store in (tablespace_id) (partition values less than (maxvalue) compress);\")\n    }\n\n    @Test\n    fun matchesPartitionComposite_SBH_SUB_STOREM() {\n        assertThat(p).matches(\"create table table_id (id number) partition by range (column_id) subpartition by hash (column_id) subpartitions 1 store in (tablespace_id1, tablespace_id2) (partition values less than (maxvalue) compress);\")\n    }\n\n    @Test\n    fun matchesPartitionComposite_SBH_ST() {\n        assertThat(p).matches(\"create table table_id (id number) partition by range (column_id) subpartition by hash (column_id) subpartition template 1 (partition values less than (maxvalue) compress);\")\n    }\n\n    @Test\n    fun matchesPartitionComposite_SBH() {\n        assertThat(p).matches(\"create table table_id (id number) partition by range (column_id) subpartition by hash (column_id) (partition values less than (maxvalue) compress);\")\n    }\n\n    @Test\n    fun matchesColumnDefaultOnNull() {\n        assertThat(p).matches(\"create table table_id (id number, name varchar2(100) default on null 'Default String');\")\n    }\n\n    @Test\n    fun matchesColumnDefaultOnNullWithExpression() {\n        assertThat(p).matches(\"create table table_id (id number, created_date date default on null sysdate);\")\n    }\n\n    @Test\n    fun matchesColumnDefault() {\n        assertThat(p).matches(\"create table table_id (id number, name varchar2(100) default 'Default String');\")\n    }\n\n    @Test\n    fun matchesColumnDefaultOnNullForInsertOnly() {\n        assertThat(p).matches(\"create table table_id (id number, name varchar2(100) default on null for insert only 'Default String');\")\n    }\n\n    @Test\n    fun matchesColumnDefaultOnNullForInsertOnlyWithExpression() {\n        assertThat(p).matches(\"create table table_id (id number, created_date date default on null for insert only sysdate);\")\n    }\n\n    @Test\n    fun matchesColumnDefaultOnNullForInsertAndUpdate() {\n        assertThat(p).matches(\"create table table_id (id number, name varchar2(100) default on null for insert and update 'Default String');\")\n    }\n\n    @Test\n    fun matchesColumnDefaultOnNullForInsertAndUpdateWithExpression() {\n        assertThat(p).matches(\"create table table_id (id number, created_date date default on null for insert and update sysdate);\")\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/ddl/DdlCommentTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.ddl\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.DdlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass DdlCommentTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(DdlGrammar.DDL_COMMENT)\n    }\n\n    @Test\n    fun matchesCommentOnTableWithSemicolon() {\n        assertThat(p).matches(\"comment on table tab is 'test';\")\n    }\n\n    @Test\n    fun matchesCommentOnTable() {\n        assertThat(p).matches(\"comment on table tab is 'test'\")\n    }\n\n    @Test\n    fun matchesCommentOnTableWithSchema() {\n        assertThat(p).matches(\"comment on table sch.tab is 'test'\")\n    }\n\n    @Test\n    fun matchesCommentOnColumn() {\n        assertThat(p).matches(\"comment on column tab.col is 'test'\")\n    }\n\n    @Test\n    fun matchesCommentOnColumnWithSchema() {\n        assertThat(p).matches(\"comment on column sch.tab.col is 'test'\")\n    }\n\n    @Test\n    fun matchesCommentOnOperator() {\n        assertThat(p).matches(\"comment on operator foo is 'test'\")\n    }\n\n    @Test\n    fun matchesCommentOnOperatorWithSchema() {\n        assertThat(p).matches(\"comment on operator sch.foo is 'test'\")\n    }\n\n    @Test\n    fun matchesCommentOnIndextype() {\n        assertThat(p).matches(\"comment on indextype foo is 'test'\")\n    }\n\n    @Test\n    fun matchesCommentOnIndextypeWithSchema() {\n        assertThat(p).matches(\"comment on indextype sch.foo is 'test'\")\n    }\n\n    @Test\n    fun matchesCommentOnMaterializedView() {\n        assertThat(p).matches(\"comment on materialized view foo is 'test'\")\n    }\n\n    @Test\n    fun matchesCommentOnMaterializedViewWithSchema() {\n        assertThat(p).matches(\"comment on materialized view sch.foo is 'test'\")\n    }\n\n    @Test\n    fun matchesCommentOnMiningModelView() {\n        assertThat(p).matches(\"comment on materialized view foo is 'test'\")\n    }\n\n    @Test\n    fun matchesCommentOnMiningModelWithSchema() {\n        assertThat(p).matches(\"comment on materialized view sch.foo is 'test'\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/ddl/DropCommandTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.ddl\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.DdlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass DropCommandTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(DdlGrammar.DROP_COMMAND)\n    }\n\n    @Test\n    fun matchesDropTable() {\n        assertThat(p).matches(\"drop table x;\")\n        assertThat(p).matches(\"drop table x\")\n    }\n\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/ddl/DropDirectoryTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.ddl\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.DdlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass DropDirectoryTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(DdlGrammar.DROP_DIRECTORY)\n    }\n\n    @Test\n    fun matchesSimpleDropDirectory() {\n        assertThat(p).matches(\"drop directory foo;\")\n    }\n\n    @Test\n    fun matchesDropDirectoryIfExists() {\n        assertThat(p).matches(\"drop directory if exists foo;\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/ddl/InlineConstraintTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.ddl\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.DdlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass InlineConstraintTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(DdlGrammar.INLINE_CONSTRAINT)\n    }\n\n    @Test\n    fun matchesNotNull() {\n        assertThat(p).matches(\"not null\")\n    }\n\n    @Test\n    fun matchesNull() {\n        assertThat(p).matches(\"null\")\n    }\n\n    @Test\n    fun matchesUnique() {\n        assertThat(p).matches(\"unique\")\n    }\n\n    @Test\n    fun matchesPrimaryKey() {\n        assertThat(p).matches(\"primary key\")\n    }\n\n    @Test\n    fun matchesReferences() {\n        assertThat(p).matches(\"references tab (col)\")\n    }\n\n    @Test\n    fun matchesReferencesWithSchema() {\n        assertThat(p).matches(\"references sch.tab (col)\")\n    }\n\n    @Test\n    fun matchesReferencesWithMoreColumns() {\n        assertThat(p).matches(\"references tab (col, col2, col3)\")\n    }\n\n    @Test\n    fun matchesReferencesOnDeleteCascade() {\n        assertThat(p).matches(\"references tab (col) on delete cascade\")\n    }\n\n    @Test\n    fun matchesReferencesOnDeleteSetNull() {\n        assertThat(p).matches(\"references tab (col) on delete set null\")\n    }\n\n    @Test\n    fun matchesCheck() {\n        assertThat(p).matches(\"check (x > 1)\")\n        assertThat(p).matches(\"check (x > 1) disable precheck\")\n        assertThat(p).matches(\"check (x > 1) precheck\")\n    }\n\n    @Test\n    fun matchesConstraintWithName() {\n        assertThat(p).matches(\"constraint pk primary key\")\n        assertThat(p).matches(\"constraints pk primary key\")\n    }\n\n    @Test\n    fun matchesUniqueWithMultipleStates() {\n        assertThat(p).matches(\"unique initially deferred\")\n        assertThat(p).matches(\"unique initially immediate\")\n        assertThat(p).matches(\"unique initially deferred deferrable\")\n        assertThat(p).matches(\"unique initially deferred not deferrable\")\n        assertThat(p).matches(\"unique deferrable\")\n        assertThat(p).matches(\"unique not deferrable\")\n        assertThat(p).matches(\"unique deferrable initially deferred\")\n        assertThat(p).matches(\"unique not deferrable initially deferred\")\n        assertThat(p).matches(\"unique rely\")\n        assertThat(p).matches(\"unique norely\")\n        assertThat(p).matches(\"unique enable\")\n        assertThat(p).matches(\"unique disable\")\n        assertThat(p).matches(\"unique validate\")\n        assertThat(p).matches(\"unique novalidate\")\n        assertThat(p).matches(\"unique exceptions into sch.tab\")\n        assertThat(p).matches(\"unique not deferrable initially deferred rely disable validate exceptions into sch.tab\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/ddl/OutOfLineConstraintTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.ddl\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.DdlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass OutOfLineConstraintTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(DdlGrammar.OUT_OF_LINE_CONSTRAINT)\n    }\n\n    @Test\n    fun matchesUnique() {\n        assertThat(p).matches(\"unique (foo)\")\n    }\n\n    @Test\n    fun matchesUniqueWithMoreColumns() {\n        assertThat(p).matches(\"unique (foo, bar, baz)\")\n    }\n\n    @Test\n    fun matchesPrimaryKey() {\n        assertThat(p).matches(\"primary key (foo)\")\n    }\n\n    @Test\n    fun matchesPrimaryKeyWithMoreColumns() {\n        assertThat(p).matches(\"primary key (foo, bar, baz)\")\n    }\n\n    @Test\n    fun matchesForeignKey() {\n        assertThat(p).matches(\"foreign key (col) references tab (col)\")\n    }\n\n    @Test\n    fun matchesReferencesWithMoreColumns() {\n        assertThat(p).matches(\"foreign key (col, col2, col3) references tab (col, col2, col3)\")\n    }\n\n    @Test\n    fun matchesCheck() {\n        assertThat(p).matches(\"check (x > 1)\")\n        assertThat(p).matches(\"check (x > 1) disable precheck\")\n        assertThat(p).matches(\"check (x > 1) precheck\")\n    }\n\n    @Test\n    fun matchesConstraintWithName() {\n        assertThat(p).matches(\"constraint pk primary key (foo)\")\n        assertThat(p).matches(\"constraints pk primary key (foo)\")\n    }\n\n    @Test\n\n    fun matchesUniqueWithMultipleStates() {\n        assertThat(p).matches(\"unique (foo) initially deferred\")\n        assertThat(p).matches(\"unique (foo) initially immediate\")\n        assertThat(p).matches(\"unique (foo) initially deferred deferrable\")\n        assertThat(p).matches(\"unique (foo) initially deferred not deferrable\")\n        assertThat(p).matches(\"unique (foo) deferrable\")\n        assertThat(p).matches(\"unique (foo) not deferrable\")\n        assertThat(p).matches(\"unique (foo) deferrable initially deferred\")\n        assertThat(p).matches(\"unique (foo) not deferrable initially deferred\")\n        assertThat(p).matches(\"unique (foo) rely\")\n        assertThat(p).matches(\"unique (foo) norely\")\n        assertThat(p).matches(\"unique (foo) enable\")\n        assertThat(p).matches(\"unique (foo) disable\")\n        assertThat(p).matches(\"unique (foo) validate\")\n        assertThat(p).matches(\"unique (foo) novalidate\")\n        assertThat(p).matches(\"unique (foo) exceptions into sch.tab\")\n        assertThat(p).matches(\"unique (foo) not deferrable initially deferred rely disable validate exceptions into sch.tab\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/ddl/TableColumnDefinitionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.ddl\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.DdlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass TableColumnDefinitionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(DdlGrammar.TABLE_COLUMN_DEFINITION)\n    }\n\n    @Test\n    fun matchesSimpleDefinition() {\n        assertThat(p).matches(\"id number\")\n    }\n\n    @Test\n    fun matchesSort() {\n        assertThat(p).matches(\"id number sort\")\n    }\n\n    @Test\n    fun matcheseDefault() {\n        assertThat(p).matches(\"id number default 1\")\n    }\n\n    @Test\n    fun matchesSimpleEncrypt() {\n        assertThat(p).matches(\"id number encrypt\")\n    }\n\n    @Test\n    fun matchesInlineConstraint() {\n        assertThat(p).matches(\"id number constraint pktab primary key\")\n    }\n\n    @Test\n    fun matchesMultipleConstraints() {\n        assertThat(p).matches(\"id number constraint pktab primary key check (id > 0)\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/ddl/TruncateTableTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.ddl\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.DdlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass TruncateTableTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(DdlGrammar.TRUNCATE_TABLE)\n    }\n\n    @Test\n    fun matchesSimpleTruncate() {\n        assertThat(p).matches(\"truncate table foo;\")\n    }\n\n    @Test\n    fun matchesTruncatePreserveMaterializedViewLog() {\n        assertThat(p).matches(\"truncate table foo preserve materialized view log;\")\n    }\n\n    @Test\n    fun matchesTruncatePurgeMaterializedViewLog() {\n        assertThat(p).matches(\"truncate table foo purge materialized view log;\")\n    }\n\n    @Test\n    fun matchesTruncateDropStorage() {\n        assertThat(p).matches(\"truncate table foo drop storage;\")\n        assertThat(p).matches(\"truncate table foo drop all storage;\")\n    }\n\n    @Test\n    fun matchesTruncateReuseStorage() {\n        assertThat(p).matches(\"truncate table foo reuse storage;\")\n    }\n\n    @Test\n    fun matchesTruncateCascade() {\n        assertThat(p).matches(\"truncate table foo cascade;\")\n    }\n\n    @Test\n    fun matchesLongTruncate() {\n        assertThat(p).matches(\"truncate table sch.foo  purge materialized view log drop all storage cascade;\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/declarations/CallSpecificationTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.declarations\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass CallSpecificationTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.CALL_SPECIFICATION)\n    }\n\n    @Test\n    fun matchesJavaCallSpec() {\n        assertThat(p).matches(\"language java name 'foo';\")\n    }\n\n    @Test\n    fun matchesLanguageCNameLibrary() {\n        assertThat(p).matches(\"language c name \\\"foo\\\" library bar;\")\n    }\n\n    @Test\n    fun matchesLanguageCLibraryName() {\n        assertThat(p).matches(\"language c library bar name \\\"foo\\\";\")\n    }\n\n    @Test\n    fun matchesExternal() {\n        assertThat(p).matches(\"external name \\\"foo\\\" library bar;\")\n    }\n\n    @Test\n    fun matchesAgentIn() {\n        assertThat(p).matches(\"language c library bar name \\\"foo\\\" agent in (agent);\")\n    }\n\n    @Test\n    fun matchesAgentInMultiple() {\n        assertThat(p).matches(\"language c library bar name \\\"foo\\\" agent in (agent, agent2);\")\n    }\n\n    @Test\n    fun matchesWithContext() {\n        assertThat(p).matches(\"language c library bar name \\\"foo\\\" with context;\")\n    }\n\n    @Test\n    fun matchesParameterContext() {\n        assertThat(p).matches(\"language c library bar name \\\"foo\\\" parameters (context);\")\n    }\n\n    @Test\n    fun matchesParameterSelf() {\n        assertThat(p).matches(\"language c library bar name \\\"foo\\\" parameters (self);\")\n        assertThat(p).matches(\"language c library bar name \\\"foo\\\" parameters (self tdo);\")\n        assertThat(p).matches(\"language c library bar name \\\"foo\\\" parameters (self indicator);\")\n        assertThat(p).matches(\"language c library bar name \\\"foo\\\" parameters (self indicator struct);\")\n        assertThat(p).matches(\"language c library bar name \\\"foo\\\" parameters (self indicator tdo);\")\n        assertThat(p).matches(\"language c library bar name \\\"foo\\\" parameters (self length);\")\n        assertThat(p).matches(\"language c library bar name \\\"foo\\\" parameters (self duration);\")\n        assertThat(p).matches(\"language c library bar name \\\"foo\\\" parameters (self maxlen);\")\n        assertThat(p).matches(\"language c library bar name \\\"foo\\\" parameters (self charsetid);\")\n        assertThat(p).matches(\"language c library bar name \\\"foo\\\" parameters (self charsetform);\")\n    }\n\n    @Test\n    fun matchesParameterSimple() {\n        assertThat(p).matches(\"language c library bar name \\\"foo\\\" parameters (x int);\")\n    }\n\n    @Test\n    fun matchesMultipleParameters() {\n        assertThat(p).matches(\"language c library bar name \\\"foo\\\" parameters (x int, y int);\")\n    }\n\n    @Test\n    fun matchesParameterReturn() {\n        assertThat(p).matches(\"language c library bar name \\\"foo\\\" parameters (return int);\")\n    }\n\n    @Test\n    fun matchesParameterWithProperty() {\n        assertThat(p).matches(\"language c library bar name \\\"foo\\\" parameters (x length int);\")\n    }\n\n    @Test\n    fun matchesParameterByReference() {\n        assertThat(p).matches(\"language c library bar name \\\"foo\\\" parameters (x by reference int);\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/declarations/CursorDeclarationTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.declarations\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass CursorDeclarationTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.CURSOR_DECLARATION)\n    }\n\n    @Test\n    fun matchesSimpleCursor() {\n        assertThat(p).matches(\"cursor cur is select 1 from dual;\")\n    }\n\n    @Test\n    fun matchesCursorWithParameter() {\n        assertThat(p).matches(\"cursor cur(x number) is select 1 from dual;\")\n    }\n\n    @Test\n    fun matchesCursorWithMultipleParameters() {\n        assertThat(p).matches(\"cursor cur(x number, y number) is select 1 from dual;\")\n    }\n\n    @Test\n    fun matchesCursorWithExplicitInParameter() {\n        assertThat(p).matches(\"cursor cur(x in number) is select 1 from dual;\")\n    }\n\n    @Test\n    fun matchesCursorWithDefaultParameter() {\n        assertThat(p).matches(\"cursor cur(x number default 1) is select 1 from dual;\")\n    }\n\n    @Test\n    fun matchesCursorWithDefaultParameterAlternative() {\n        assertThat(p).matches(\"cursor cur(x number := 1) is select 1 from dual;\")\n    }\n\n    @Test\n    fun matchesCursorWithReturnType() {\n        assertThat(p).matches(\"cursor cur return my_type is select 1 from dual;\")\n    }\n\n    @Test\n    fun matchesCursorSpecification() {\n        assertThat(p).matches(\"cursor cur return my_type;\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/declarations/CustomSubtypeTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.declarations\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass CustomSubtypeTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.CUSTOM_SUBTYPE)\n    }\n\n    @Test\n    fun matchesSimpleSubtype() {\n        assertThat(p).matches(\"subtype sub is char;\")\n    }\n\n    @Test\n    fun matchesSubtypeWithScale() {\n        assertThat(p).matches(\"subtype sub is number(5);\")\n    }\n\n    @Test\n    fun matchesSubtypeWithScaleAndPrecision() {\n        assertThat(p).matches(\"subtype sub is number(5,1);\")\n    }\n\n    @Test\n    fun matchesSubtypeWithNotNullConstraint() {\n        assertThat(p).matches(\"subtype sub is number not null;\")\n    }\n\n    @Test\n    fun matchesSubtypeWithRange() {\n        assertThat(p).matches(\"subtype sub is number range 1..2;\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/declarations/FunctionDeclarationTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.declarations\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass FunctionDeclarationTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.FUNCTION_DECLARATION)\n    }\n\n    @Test\n    fun matchesSimpleFunction() {\n        assertThat(p).matches(\"\"\n                + \"function test return number is\\n\"\n                + \"begin\\n\"\n                + \"return 0;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesSimpleFunctionAlternative() {\n        assertThat(p).matches(\"\"\n                + \"function test return number as\\n\"\n                + \"begin\\n\"\n                + \"return 0;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesFunctionWithParameter() {\n        assertThat(p).matches(\"\"\n                + \"function test(parameter in number) return number is\\n\"\n                + \"begin\\n\"\n                + \"return 0;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesFunctionWithMultipleParameters() {\n        assertThat(p).matches(\"\"\n                + \"function test(parameter1 in number, parameter2 in number) return number is\\n\"\n                + \"begin\\n\"\n                + \"return 0;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesFunctionWithVariableDeclaration() {\n        assertThat(p).matches(\"\"\n                + \"function test return number is\\n\"\n                + \"var number;\"\n                + \"begin\\n\"\n                + \"return 0;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesFunctionWithMultipleVariableDeclaration() {\n        assertThat(p).matches(\"\"\n                + \"function test return number is\\n\"\n                + \"var number;\"\n                + \"var2 number;\"\n                + \"begin\\n\"\n                + \"return 0;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesDeterministicFunction() {\n        assertThat(p).matches(\"\"\n                + \"function test return number deterministic is\\n\"\n                + \"begin\\n\"\n                + \"return 0;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesPipelinedFunction() {\n        assertThat(p).matches(\"\"\n                + \"function test return number pipelined is\\n\"\n                + \"begin\\n\"\n                + \"return 0;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesParallelEnableFunction() {\n        assertThat(p).matches(\"\"\n            + \"function test return number parallel_enable is\\n\"\n            + \"begin\\n\"\n            + \"return 0;\\n\"\n            + \"end;\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/declarations/ParameterDeclarationTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.declarations\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass ParameterDeclarationTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.PARAMETER_DECLARATION)\n    }\n\n    @Test\n    fun matchesSimpleParameter() {\n        assertThat(p).matches(\"parameter number\")\n    }\n\n    @Test\n    fun matchesExplicitInParameter() {\n        assertThat(p).matches(\"parameter in number\")\n    }\n\n    @Test\n    fun matchesExplicitInParameterWithDefaultValue() {\n        assertThat(p).matches(\"parameter in number := 1\")\n    }\n\n    @Test\n    fun matchesExplicitInParameterWithDefaultValueAlternative() {\n        assertThat(p).matches(\"parameter in number default 1\")\n    }\n\n    @Test\n    fun matchesOutParameter() {\n        assertThat(p).matches(\"parameter out number\")\n    }\n\n    @Test\n    fun matchesInOutParameter() {\n        assertThat(p).matches(\"parameter in out number\")\n    }\n\n    @Test\n    fun matchesOutParameterWithNocopy() {\n        assertThat(p).matches(\"parameter out nocopy number\")\n    }\n\n    @Test\n    fun matchesInOutParameterWithNocopy() {\n        assertThat(p).matches(\"parameter in out nocopy number\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/declarations/PragmaDeclarationTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.declarations\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass PragmaDeclarationTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.PRAGMA_DECLARATION)\n    }\n\n    @Test\n    fun matchesAutonomousTransaction() {\n        assertThat(p).matches(\"pragma autonomous_transaction;\")\n    }\n\n    @Test\n    fun matchesExceptionInit() {\n        assertThat(p).matches(\"pragma exception_init(1, 1);\")\n    }\n\n    @Test\n    fun matchesSeriallyReusable() {\n        assertThat(p).matches(\"pragma serially_reusable;\")\n    }\n\n    @Test\n    fun matchesInterface() {\n        assertThat(p).matches(\"pragma interface(c, func, 1);\")\n    }\n\n    @Test\n    fun matchesRestrictReferencesPragma() {\n        assertThat(p).matches(\"pragma restrict_references(foo, rnds, wnds);\")\n    }\n\n    @Test\n    fun matchesUdfPragma() {\n        assertThat(p).matches(\"pragma udf;\")\n    }\n\n    @Test\n    fun matchesDeprecatePragma() {\n        assertThat(p).matches(\"pragma deprecate(object);\")\n        assertThat(p).matches(\"pragma deprecate(object, 'object is deprecated');\")\n    }\n\n    @Test\n    fun matchesCoveragePragma() {\n        assertThat(p).matches(\"pragma coverage('NOT_FEASIBLE_START');\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/declarations/ProcedureDeclarationTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.declarations\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass ProcedureDeclarationTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.PROCEDURE_DECLARATION)\n    }\n\n    @Test\n    fun matchesSimpleProcedure() {\n        assertThat(p).matches(\"\"\n                + \"procedure test is\\n\"\n                + \"begin\\n\"\n                + \"null;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesSimpleProcedureAlternative() {\n        assertThat(p).matches(\"\"\n                + \"procedure test as\\n\"\n                + \"begin\\n\"\n                + \"null;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesProcedureWithParameter() {\n        assertThat(p).matches(\"\"\n                + \"procedure test(parameter in number) is\\n\"\n                + \"begin\\n\"\n                + \"null;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesProcedureWithMultipleParameters() {\n        assertThat(p).matches(\"\"\n                + \"procedure test(parameter1 in number, parameter2 in number) is\\n\"\n                + \"begin\\n\"\n                + \"null;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesProcedureWithVariableDeclaration() {\n        assertThat(p).matches(\"\"\n                + \"procedure test is\\n\"\n                + \"var number;\"\n                + \"begin\\n\"\n                + \"null;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesProcedureWithMultipleVariableDeclaration() {\n        assertThat(p).matches(\"\"\n                + \"procedure test is\\n\"\n                + \"var number;\"\n                + \"var2 number;\"\n                + \"begin\\n\"\n                + \"null;\\n\"\n                + \"end;\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/declarations/RecordDeclarationTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.declarations\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass RecordDeclarationTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.RECORD_DECLARATION)\n    }\n\n    @Test\n    fun matchesSimpleRecord() {\n        assertThat(p).matches(\"type foo is record(x number);\")\n    }\n\n    @Test\n    fun matchesRecordWithMultipleFields() {\n        assertThat(p).matches(\"type foo is record(x number, y number);\")\n    }\n\n    @Test\n    fun matchesRecordWithDefaultField() {\n        assertThat(p).matches(\"type foo is record(x number default 1);\")\n    }\n\n    @Test\n    fun matchesRecordWithDefaultFieldAlternative() {\n        assertThat(p).matches(\"type foo is record(x number := 1);\")\n    }\n\n    @Test\n    fun matchesRecordWithNotNullField() {\n        assertThat(p).matches(\"type foo is record(x number not null default 1);\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/declarations/RefCursorDeclarationTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.declarations\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass RefCursorDeclarationTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.REF_CURSOR_DECLARATION)\n    }\n\n    @Test\n    fun matchesSimpleRefCursor() {\n        assertThat(p).matches(\"type myref is ref cursor;\")\n    }\n\n    @Test\n    fun matchesSimpleRefCursorWithReturn() {\n        assertThat(p).matches(\"type myref is ref cursor return number;\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/declarations/TableOfDeclarationTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.declarations\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass TableOfDeclarationTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.TABLE_OF_DECLARATION)\n    }\n\n    @Test\n    fun matchesSimpleDeclaration() {\n        assertThat(p).matches(\"type foo is table of bar;\")\n    }\n\n    @Test\n    fun matchesSimpleDeclarationNotNull() {\n        assertThat(p).matches(\"type foo is table of bar not null;\")\n    }\n\n    @Test\n    fun matchesIndexedDeclaration() {\n        assertThat(p).matches(\"type foo is table of bar index by binary_integer;\")\n    }\n\n    @Test\n    fun matchesDeclarationWithBuiltinDatatypes() {\n        assertThat(p).matches(\"type foo is table of varchar2(10) index by number(5);\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/declarations/VariableDeclarationTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.declarations\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass VariableDeclarationTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.VARIABLE_DECLARATION)\n    }\n\n    @Test\n    fun matchesSimpleDeclaration() {\n        assertThat(p).matches(\"var number;\")\n    }\n\n    @Test\n    fun matchesDeclarationWithPrecision() {\n        assertThat(p).matches(\"var number(1);\")\n    }\n\n    @Test\n    fun matchesDeclarationWithPrecisionAndScale() {\n        assertThat(p).matches(\"var number(1,1);\")\n    }\n\n    @Test\n    fun matchesDeclarationWithInitialization() {\n        assertThat(p).matches(\"var number := 1;\")\n        assertThat(p).matches(\"var varchar2(1) := 'a';\")\n        assertThat(p).matches(\"var boolean := true;\")\n        assertThat(p).matches(\"var boolean := var2;\")\n    }\n\n    @Test\n    fun matchesDeclarationWithDefaultValue() {\n        assertThat(p).matches(\"var number default 1;\")\n        assertThat(p).matches(\"var varchar2(1) default 'a';\")\n        assertThat(p).matches(\"var boolean default true;\")\n        assertThat(p).matches(\"var boolean default var2;\")\n    }\n\n    @Test\n    fun matchesDeclarationWithNotNullConstraint() {\n        assertThat(p).matches(\"var number not null := 1;\")\n        assertThat(p).matches(\"var number not null default 1;\")\n    }\n\n    @Test\n    fun matchesDeclarationExplicitNullable() {\n        assertThat(p).matches(\"var number null := 1;\")\n        assertThat(p).matches(\"var number null default 1;\")\n    }\n\n    @Test\n    fun matchesTypeAnchoredDeclaration() {\n        assertThat(p).matches(\"var custom%type;\")\n    }\n\n    @Test\n    fun matchesObjectDeclaration() {\n        assertThat(p).matches(\"var custom;\")\n    }\n\n    @Test\n    fun matchesObjectDeclarationWithPackage() {\n        assertThat(p).matches(\"var pack.custom;\")\n    }\n\n    @Test\n    fun matchesObjectDeclarationWithPackageAndSchema() {\n        assertThat(p).matches(\"var sch.pack.custom;\")\n    }\n\n    @Test\n    fun matchesTableAnchoredDeclaration() {\n        assertThat(p).matches(\"var tab%rowtype;\")\n    }\n\n    @Test\n    fun matchesTableColumnAnchoredDeclaration() {\n        assertThat(p).matches(\"var tab.column%type;\")\n    }\n\n    @Test\n    fun matchesRefObjectDeclaration() {\n        assertThat(p).matches(\"var ref custom;\")\n    }\n\n    @Test\n    fun matchesSimpleConstant() {\n        assertThat(p).matches(\"var constant number := 1;\")\n        assertThat(p).matches(\"var constant number default 1;\")\n    }\n\n    @Test\n    fun matchesSimpleConstantWithConstraints() {\n        assertThat(p).matches(\"var constant number not null := 1;\")\n        assertThat(p).matches(\"var constant number not null default 1;\")\n    }\n\n    @Test\n    fun matchesRemoteTableColumnAnchoredDeclaration() {\n        assertThat(p).matches(\"var tab.col@link%type;\")\n        assertThat(p).matches(\"var tab.col@link.domain.com%type;\")\n    }\n\n    @Test\n    fun matchesExceptionDeclaration() {\n        assertThat(p).matches(\"var exception;\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/declarations/VarrayDeclarationTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.declarations\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass VarrayDeclarationTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.VARRAY_DECLARATION)\n    }\n\n    @Test\n    fun matchesSimpleVarray() {\n        assertThat(p).matches(\"type foo is varray(5) of number(2);\")\n    }\n\n    @Test\n    fun matchesSimpleVarrayNotNull() {\n        assertThat(p).matches(\"type foo is varray(5) of number(2) not null;\")\n    }\n\n    @Test\n    fun matchesVaryingArray() {\n        assertThat(p).matches(\"type foo is varying array(5) of number(2);\")\n    }\n\n    @Test\n    fun matchesArray() {\n        assertThat(p).matches(\"type foo is array(5) of number(2);\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/AtTimeZoneExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass AtTimeZoneExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesSimpleAtTimeZone() {\n        assertThat(p).matches(\"foo at time zone 'gmt'\")\n    }\n\n    @Test\n    fun matchesSimpleAtLocal() {\n        assertThat(p).matches(\"foo at local\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/BetweenExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass BetweenExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesBetween() {\n        assertThat(p).matches(\"var between 1 and 2\")\n    }\n\n    @Test\n    fun matchesNotBetween() {\n        assertThat(p).matches(\"var not between 1 and 2\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/BooleanExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass BooleanExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesSimpleAndExpression() {\n        assertThat(p).matches(\"true and true\")\n    }\n\n    @Test\n    fun matchesSimpleOrExpression() {\n        assertThat(p).matches(\"true or true\")\n    }\n\n    @Test\n    fun matchesMultipleExpression() {\n        assertThat(p).matches(\"true and true or true\")\n    }\n\n    @Test\n    fun matchesMultipleExpressionWithNotOperator() {\n        assertThat(p).matches(\"true and not false\")\n    }\n\n    @Test\n    fun matchesExpressionWithVariables() {\n        assertThat(p).matches(\"var and var\")\n    }\n\n    @Test\n    fun matchesExpressionWithFunctionCall() {\n        assertThat(p).matches(\"func(var) and func(var)\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/CaseExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass CaseExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.CASE_EXPRESSION)\n    }\n\n    @Test\n    fun matchesSimpleSearchedCase() {\n        assertThat(p).matches(\"case when x = 1 then 1 end\")\n    }\n\n    @Test\n    fun matchesSimpleCase() {\n        assertThat(p).matches(\"case x when 1 then 1 end\")\n    }\n\n    @Test\n    fun matchesCaseWithMultipleWhen() {\n        assertThat(p).matches(\"case x when 1 then 1 when 2 then 2 end\")\n    }\n\n    @Test\n    fun matchesCaseWithElse() {\n        assertThat(p).matches(\"case x when 1 then 1 else 2 end\")\n    }\n\n    @Test\n    fun matchesCaseWithMemberIdentifier() {\n        assertThat(p).matches(\"case foo.bar when 1 then 1 end\")\n    }\n\n    @Test\n    fun matchesCaseWithSelectorExpression() {\n        assertThat(p).matches(\"case foo + bar when 1 then 1 end\")\n    }\n\n    @Test\n    fun matchesBooleanSearchedCase() {\n        assertThat(p).matches(\"case when foo is not null and bar is null then 1 end\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/CastExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass CastExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesSimpleCast() {\n        assertThat(p).matches(\"cast(foo as number)\")\n    }\n\n    @Test\n    fun matchesCastWithDefaultClause() {\n        assertThat(p).matches(\"cast(foo as number default 0 on conversion error)\")\n    }\n\n    @Test\n    fun matchesCastWithMultipleArguments() {\n        assertThat(p).matches(\"cast('01/01/2000' as date, 'dd/mm/yyyy', 'NLS_DATE_LANGUAGE = American')\")\n    }\n\n    @Test\n    fun matchesCastMultiset() {\n        assertThat(p).matches(\"cast(multiset (select 1 from dual) as number)\")\n    }\n\n    @Test\n    fun matchesComplexCast() {\n        assertThat(p).matches(\"cast((cast(localtimestamp as domain timestamp with time zone validate) at time zone 'gmt') at time zone custom_zone as timestamp default 0 on conversion error)\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/CharacterExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass CharacterExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesSimpleConcatenation() {\n        assertThat(p).matches(\"'a'||'b'\")\n    }\n\n    @Test\n    fun matchesMultipleConcatenation() {\n        assertThat(p).matches(\"'a'||'b'||'c'\")\n    }\n\n    @Test\n    fun matchesVariableConcatenation() {\n        assertThat(p).matches(\"var||var\")\n    }\n\n    @Test\n    fun matchesFunctionCallConcatenation() {\n        assertThat(p).matches(\"func(var)||func(var)\")\n    }\n\n    @Test\n    fun matchesHostVariableConcatenation() {\n        assertThat(p).matches(\":var||:var\")\n    }\n\n    @Test\n    fun matchesIndicatorVariableConcatenation() {\n        assertThat(p).matches(\":var:indicator||:var:indicator\")\n    }\n\n    @Test\n    fun matchesReplace() {\n        assertThat(p).matches(\"replace(var, 'x', 'y')\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/CollectExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass CollectExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesSimpleCollect() {\n        assertThat(p).matches(\"collect(foo)\")\n    }\n\n    @Test\n    fun matchesCollectWithDistinct() {\n        assertThat(p).matches(\"collect(distinct foo)\")\n    }\n\n    @Test\n    fun matchesCollectWithUnique() {\n        assertThat(p).matches(\"collect(unique foo)\")\n    }\n\n    @Test\n    fun matchesCollectWithDistinctAndOrderBy() {\n        assertThat(p).matches(\"collect(distinct foo order by bar)\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/CursorExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass CursorExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesCursorExpression() {\n        assertThat(p).matches(\"cursor(select 1 from dual)\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/DateExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass DateExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesDateLiteralAddition() {\n        assertThat(p).matches(\"DATE '2015-01-01' + 1\")\n    }\n\n    @Test\n    fun matchesDateLiteralSubtraction() {\n        assertThat(p).matches(\"DATE '2015-01-01' - 1\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/ExtractDatetimeExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass ExtractDatetimeExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesExtractDay() {\n        assertThat(p).matches(\"extract(day from foo)\")\n    }\n\n    @Test\n    fun matchesExtractMonth() {\n        assertThat(p).matches(\"extract(month from foo)\")\n    }\n\n    @Test\n    fun matchesExtractYear() {\n        assertThat(p).matches(\"extract(year from foo)\")\n    }\n\n    @Test\n    fun matchesExtractYour() {\n        assertThat(p).matches(\"extract(hour from foo)\")\n    }\n\n    @Test\n    fun matchesExtractMinute() {\n        assertThat(p).matches(\"extract(minute from foo)\")\n    }\n\n    @Test\n    fun matchesExtractSecond() {\n        assertThat(p).matches(\"extract(second from foo)\")\n    }\n\n    @Test\n    fun matchesExtractTimezoneHour() {\n        assertThat(p).matches(\"extract(timezone_hour from foo)\")\n    }\n\n    @Test\n    fun matchesExtractTimezoneMinute() {\n        assertThat(p).matches(\"extract(timezone_minute from foo)\")\n    }\n\n    @Test\n    fun matchesExtractTimezoneRegion() {\n        assertThat(p).matches(\"extract(timezone_region from foo)\")\n    }\n\n    @Test\n    fun matchesExtractTimezoneAbbreviation() {\n        assertThat(p).matches(\"extract(timezone_abbr from foo)\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/JsonArrayAggTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass JsonArrayAggTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesJsonArrayAgg() {\n        assertThat(p).matches(\"json_arrayagg(1)\")\n    }\n\n    @Test\n    fun matchesJsonArrayAggWithFormat() {\n        assertThat(p).matches(\"json_arrayagg('{}' format json)\")\n    }\n\n    @Test\n    fun matchesJsonArrayAggWithOrderBy() {\n        assertThat(p).matches(\"json_arrayagg(foo order by col)\")\n    }\n\n    @Test\n    fun matchesJsonArrayAggWithNullOnNull() {\n        assertThat(p).matches(\"json_arrayagg(foo null on null)\")\n    }\n\n    @Test\n    fun matchesJsonArrayAggWithAbsentOnNull() {\n        assertThat(p).matches(\"json_arrayagg(foo absent on null)\")\n    }\n\n    @Test\n    fun matchesJsonArrayAggWithReturning() {\n        assertThat(p).matches(\"json_arrayagg(foo returning json)\")\n    }\n\n    @Test\n    fun matchesJsonArrayAggWithStrict() {\n        assertThat(p).matches(\"json_arrayagg(foo strict)\")\n    }\n\n    @Test\n    fun matchesLongJsonArrayAgg() {\n        assertThat(p).matches(\"json_arrayagg(foo order by col null on null returning json strict)\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/JsonArrayTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass JsonArrayTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesJsonArrayWithOneElement() {\n        assertThat(p).matches(\"json_array(1)\")\n    }\n\n    @Test\n    fun matchesJsonArrayWithManyElement() {\n        assertThat(p).matches(\"json_array(1, 'test', sysdate)\")\n    }\n\n    @Test\n    fun matchesJsonArrayWithFormat() {\n        assertThat(p).matches(\"json_array('{}' format json)\")\n    }\n\n    @Test\n    fun matchesJsonArrayWithNullOnNull() {\n        assertThat(p).matches(\"json_array(foo null on null)\")\n    }\n\n    @Test\n    fun matchesJsonArrayWithAbsentOnNull() {\n        assertThat(p).matches(\"json_array(foo absent on null)\")\n    }\n\n    @Test\n    fun matchesJsonArrayWithReturning() {\n        assertThat(p).matches(\"json_array(foo returning json)\")\n    }\n\n    @Test\n    fun matchesJsonArrayWithStrict() {\n        assertThat(p).matches(\"json_array(foo strict)\")\n    }\n\n    @Test\n    fun matchesLongJsonArray() {\n        assertThat(p).matches(\"json_array(json_array(1,2,3), 100, 'test', null null on null returning json strict)\")\n    }\n\n    @Test\n    fun matchesJsonArrayFromQuery() {\n        assertThat(p).matches(\"json_array(select * from tab null on null returning json strict)\")\n    }\n\n    @Test\n    fun matchesAlternativeSyntaxOfJsonArray() {\n        assertThat(p).matches(\"json[1]  \")\n        assertThat(p).matches(\"json[json[1,2,3], 100, 'test', null null on null returning json strict]\")\n        assertThat(p).matches(\"json[select * from tab]\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/JsonConstructorTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass JsonConstructorTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matches() {\n        assertThat(p).matches(\"json('{}')\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/JsonDataguideExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass JsonDataguideExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesJsonDataguide() {\n        assertThat(p).matches(\"json_dataguide(expr)\")\n        assertThat(p).matches(\"json_dataguide(expr, format)\")\n        assertThat(p).matches(\"json_dataguide(expr, format, flag)\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/JsonMergepatchExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass JsonMergepatchExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesSimpleJsonMergepatch() {\n        assertThat(p).matches(\"json_mergepatch(target, patch)\")\n    }\n\n    @Test\n    fun matchesJsonMergepatchWithReturning() {\n        assertThat(p).matches(\"json_mergepatch(target, patch returning clob)\")\n    }\n\n    @Test\n    fun matchesJsonMergepatchWithNullOnError() {\n        assertThat(p).matches(\"json_mergepatch(target, patch null on error)\")\n    }\n\n    @Test\n    fun matchesLongJsonMergepatch() {\n        assertThat(p).matches(\"\"\"json_mergepatch(target, patch\n            returning varchar2(200)\n            pretty ascii truncate\n            error on error)\"\"\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/JsonObjectAggExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass JsonObjectAggExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesSimpleJsonObjectAgg() {\n        assertThat(p).matches(\"json_objectagg(k value 'v')\")\n    }\n\n    @Test\n    fun matchesJsonObjectAggWithExplicitKey() {\n        assertThat(p).matches(\"json_objectagg(key k value 'v')\")\n    }\n\n    @Test\n    fun matchesJsonObjectAggWithFormatJson() {\n        assertThat(p).matches(\"json_objectagg('k' value '{}' format json)\")\n    }\n\n    @Test\n    fun matchesJsonObjectAggWithReturning() {\n        assertThat(p).matches(\"json_objectagg(k value 'v' returning clob)\")\n    }\n\n    @Test\n    fun matchesJsonObjectAggWithAbsentOnNull() {\n        assertThat(p).matches(\"json_objectagg('v' value val absent on null)\")\n    }\n\n    @Test\n    fun matchesLongJsonObjectAgg() {\n        assertThat(p).matches(\"\"\"json_objectagg('a' value '{}' format json\n            null on null\n            returning varchar2(200)\n            strict with unique keys)\"\"\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/JsonObjectExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass JsonObjectExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesSimpleJsonObject() {\n        assertThat(p).matches(\"json_object(foo)\")\n    }\n\n    @Test\n    fun matchesJsonObjectWithKey() {\n        assertThat(p).matches(\"json_object(k value 'v')\")\n    }\n\n    @Test\n    fun matchesJsonObjectWithExplicitKey() {\n        assertThat(p).matches(\"json_object(key k value 'v')\")\n    }\n\n    @Test\n    fun matchesJsonObjectWithStringKeys() {\n        assertThat(p).matches(\"json_object('k': 'v')\")\n    }\n\n    @Test\n    fun matchesJsonObjectWithFormatJson() {\n        assertThat(p).matches(\"json_object('k': '{}' format json)\")\n    }\n\n    @Test\n    fun matchesJsonObjectWithReturning() {\n        assertThat(p).matches(\"json_object(foo returning clob)\")\n    }\n\n    @Test\n    fun matchesJsonObjectWithAbsentOnNull() {\n        assertThat(p).matches(\"json_object(* absent on null)\")\n    }\n\n    @Test\n    fun matchesLongJsonObject() {\n        assertThat(p).matches(\"\"\"json_object('k' value 'v',\n            'a': '{}' format json\n            null on null\n            returning varchar2(200)\n            strict with unique keys)\"\"\")\n    }\n\n    @Test\n    fun matchesAlternativeSyntaxOfJsonObject() {\n        assertThat(p).matches(\"json { foo }\")\n        assertThat(p).matches(\"json { 'k': 'v' }\")\n        assertThat(p).matches(\n            \"\"\"json { 'k' value 'v',\n            'a': '{}' format json\n            null on null\n            returning varchar2(200)\n            strict with unique keys }\"\"\"\n        )\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/JsonQueryExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass JsonQueryExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesSimpleJsonQuery() {\n        assertThat(p).matches(\"json_query(foo, '$')\")\n    }\n\n    @Test\n    fun matchesJsonQuery() {\n        assertThat(p).matches(\"json_query(foo format json, '$')\")\n    }\n\n    @Test\n    fun matchesJsonQueryWithType() {\n        assertThat(p).matches(\"json_query(foo, '$' type strict)\")\n    }\n\n    @Test\n    fun matchesJsonQueryWithPassing() {\n        assertThat(p).matches(\"json_query(foo, '$' passing 'x' as bar)\")\n    }\n\n    @Test\n    fun matchesJsonQueryWithNullOnEmpty() {\n        assertThat(p).matches(\"json_query(foo, '$' null on empty)\")\n    }\n\n    @Test\n    fun matchesJsonQueryWithNullOnError() {\n        assertThat(p).matches(\"json_query(foo, '$' null on error)\")\n    }\n\n    @Test\n    fun matchesJsonQueryWithNullOnMismatch() {\n        assertThat(p).matches(\"json_query(foo, '$' null on mismatch)\")\n    }\n\n    @Test\n    fun matchesJsonQueryWithReturning() {\n        assertThat(p).matches(\"json_query(foo, '$' returning json)\")\n    }\n\n    @Test\n    fun matchesJsonQueryWithPassingMoreValues() {\n        assertThat(p).matches(\"json_query(foo, '$' passing 1 as bar, 2 as bar2 returning json)\")\n    }\n\n    @Test\n    fun matchesJsonQueryWithWrapper() {\n        assertThat(p).matches(\"json_query(foo, '$' with array wrapper)\")\n    }\n\n    @Test\n    fun matchesJsonQueryWithQuotesClause() {\n        assertThat(p).matches(\"json_query(foo, '$' keep quotes)\")\n    }\n\n    @Test\n    fun matchesLongJsonQuery() {\n        assertThat(p).matches(\"\"\"json_query(foo, '$' \n            passing 1 as bar, 2 as baz \n            returning json allow scalars pretty ascii \n            with conditional array wrapper \n            keep quotes on scalar string \n            empty object on error \n            empty array on empty \n            error on mismatch \n            type lax)\"\"\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/JsonScalarTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass JsonScalarTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesJsonScalar() {\n        assertThat(p).matches(\"json_scalar(val)\")\n    }\n\n    @Test\n    fun matchesJsonScalarJsonNullOnNull() {\n        assertThat(p).matches(\"json_scalar(val json null on null)\")\n    }\n\n    @Test\n    fun matchesJsonScalarSqlNullOnNull() {\n        assertThat(p).matches(\"json_scalar(val sql null on null)\")\n    }\n\n    @Test\n    fun matchesJsonScalarEmptyStringOnNull() {\n        assertThat(p).matches(\"json_scalar(val empty string on null)\")\n    }\n\n    @Test\n    fun matchesJsonScalarJsonNullOnError() {\n        assertThat(p).matches(\"json_scalar(val null on error)\")\n    }\n\n    @Test\n    fun matchesLongJsonScalar() {\n        assertThat(p).matches(\"json_scalar(val sql null on null error on error)\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/JsonSerializeTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass JsonSerializeTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesJsonSerialize() {\n        assertThat(p).matches(\"json_serialize(val)\")\n    }\n\n    @Test\n    fun matchesJsonSerializeWithReturning() {\n        assertThat(p).matches(\"json_serialize(val returning clob)\")\n    }\n\n    @Test\n    fun matchesJsonSerializeSqlNullOnError() {\n        assertThat(p).matches(\"json_serialize(val null on error)\")\n    }\n\n    @Test\n    fun matchesJsonSerializeSqlErrorOnError() {\n        assertThat(p).matches(\"json_serialize(val error on error)\")\n    }\n\n    @Test\n    fun matchesJsonSerializeSqlEmptyArrayOnError() {\n        assertThat(p).matches(\"json_serialize(val empty array on error)\")\n    }\n\n    @Test\n    fun matchesJsonSerializeSqlEmptyObjectOnError() {\n        assertThat(p).matches(\"json_serialize(val empty object on error)\")\n    }\n\n    @Test\n    fun matchesLongJsonSerialize() {\n        assertThat(p).matches(\"json_serialize(val returning blob pretty ascii ordered truncate empty object on error)\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/JsonTableTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass JsonTableTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesJsonWithValueColumn() {\n        assertThat(p).matches(\"json_table(doc, '$' columns (c1 path '$.c1'))\")\n    }\n\n    @Test\n    fun matchesJsonWithExistsColumn() {\n        assertThat(p).matches(\"json_table(doc, '$' columns (c1 exists path '$.c1'))\")\n    }\n\n    @Test\n    fun matchesJsonWithQueryColumn() {\n        assertThat(p).matches(\"json_table(doc, '$' columns (c1 format json path '$.c1'))\")\n    }\n\n    @Test\n    fun matchesJsonWithNestedColumn() {\n        assertThat(p).matches(\"json_table(doc, '$' columns (nested '$.c1' columns (c2 path '$.c2')))\")\n    }\n\n    @Test\n    fun matchesJsonWithOrdinalityColumn() {\n        assertThat(p).matches(\"json_table(doc, '$' columns (c1 for ordinality))\")\n    }\n\n    @Test\n    fun matchesJsonWithColumnWithoutParenthesis() {\n        assertThat(p).matches(\"json_table(doc, '$' columns c1 for ordinality)\")\n    }\n\n    @Test\n    fun matchesLongJsonTable() {\n        assertThat(p).matches(\"\"\"\n            json_table(doc, '$'\n            error on error\n            type strict\n            error on empty\n            columns (\n              c1 clob truncate path '$.c1' error on error error on empty error on mismatch(missing data),\n              c1 varchar2(10) format json allow scalars without wrapper path '$.c1' error on error,\n              c1 number exists path '$.c1' error on error error on empty,\n              nested path subDoc[*] columns (c2 path '$.c2'),\n              c1 for ordinality\n            ))\n            \"\"\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/JsonTransformExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass JsonTransformExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesJsonTransformAppend() {\n        assertThat(p).matches(\"json_transform(foo, append 'a' = 'b')\")\n    }\n\n    @Test\n    fun matchesJsonTransformCase() {\n        assertThat(p).matches(\"json_transform(foo, case when 'x' then (append 'a' = 'b') end)\")\n    }\n\n    @Test\n    fun matchesJsonTransformCopy() {\n        assertThat(p).matches(\"json_transform(foo, copy 'a' = 'b')\")\n    }\n\n    @Test\n    fun matchesJsonTransformInsert() {\n        assertThat(p).matches(\"json_transform(foo, insert 'a' = 'b')\")\n    }\n\n    @Test\n    fun matchesJsonTransformIntersect() {\n        assertThat(p).matches(\"json_transform(foo, intersect 'a' = 'b')\")\n    }\n\n    @Test\n    fun matchesJsonTransformKeep() {\n        assertThat(p).matches(\"json_transform(foo, keep 'a')\")\n    }\n\n    @Test\n    fun matchesJsonTransformMerge() {\n        assertThat(p).matches(\"json_transform(foo, merge 'a' = 'b')\")\n    }\n\n    @Test\n    fun matchesJsonTransformMinus() {\n        assertThat(p).matches(\"json_transform(foo, minus 'a' = 'b')\")\n    }\n\n    @Test\n    fun matchesJsonTransformNested() {\n        assertThat(p).matches(\"json_transform(foo, nested path 'x' (copy 'a' = 'b'))\")\n    }\n\n    @Test\n    fun matchesJsonTransformPrepend() {\n        assertThat(p).matches(\"json_transform(foo, prepend 'a' = 'b')\")\n    }\n\n    @Test\n    fun matchesJsonTransformRemove() {\n        assertThat(p).matches(\"json_transform(foo, remove 'a')\")\n    }\n\n    @Test\n    fun matchesJsonTransformRename() {\n        assertThat(p).matches(\"json_transform(foo, rename 'a' with 'b')\")\n    }\n\n    @Test\n    fun matchesJsonTransformReplace() {\n        assertThat(p).matches(\"json_transform(foo, replace 'a' = 'b')\")\n    }\n\n    @Test\n    fun matchesJsonTransformSet() {\n        assertThat(p).matches(\"json_transform(foo, set 'a' = 'b')\")\n    }\n\n    @Test\n    fun matchesJsonTransformSort() {\n        assertThat(p).matches(\"json_transform(foo, sort 'a')\")\n    }\n\n    @Test\n    fun matchesJsonTransformUnion() {\n        assertThat(p).matches(\"json_transform(foo, union 'a' = 'b')\")\n    }\n\n    @Test\n    fun matchesLongJsonTransform() {\n        assertThat(p).matches(\"\"\"json_transform(foo, \n            append 'a' = 'b' ignore on missing ignore on mismatch ignore on null ignore on empty,\n            case when 'x' then (\n              append 'a' = 'b',\n              append 'c' = 'd'\n            ) else (\n              append 'e' = 'f',\n              append 'g' = 'h'\n            ) end,\n            copy 'a' = 'b' ignore on missing ignore on null ignore on empty,\n            insert 'a' = 'b' ignore on existing ignore on null ignore on empty ignore on error,\n            intersect 'a' = 'b' ignore on missing ignore on null,\n            keep 'a', 'b', 'c' ignore on missing,\n            merge 'a' = 'b' ignore on missing ignore on mismatch ignore on null ignore on empty,\n            minus 'a' = 'b' ignore on missing ignore on null,\n            nested path 'x' (\n              copy 'a' = 'b',\n              insert 'c' = 'd'\n            ),\n            prepend 'a' = 'b' ignore on missing ignore on mismatch ignore on null ignore on empty,\n            remove 'a' ignore on missing,\n            rename 'a' with 'b' ignore on missing,\n            replace 'a' = 'b' ignore on missing ignore on null ignore on empty ignore on error,\n            set 'a' = 'b' ignore on existing ignore on missing ignore on null ignore on empty ignore on error,\n            sort 'a' reverse,\n            sort 'a' remove nulls order by 'b' desc, 'c' asc,\n            sort 'a' desc unique remove nulls ignore on missing ignore on mismatch ignore on empty ignore on error,\n            union 'a' = 'b' ignore on missing ignore on null)\"\"\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/JsonValueTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass JsonValueTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesJsonValue() {\n        assertThat(p).matches(\"json_value(doc, '$')\")\n    }\n\n    @Test\n    fun matchesJsonValueFormatJson() {\n        assertThat(p).matches(\"json_value('{}' format json, '$')\")\n    }\n\n    @Test\n    fun matchesJsonValueWithPassingClause() {\n        assertThat(p).matches(\"json_value(doc, '$' passing 1 as x, 2 as y)\")\n    }\n\n    @Test\n    fun matchesJsonValueWithReturning() {\n        assertThat(p).matches(\"json_value(doc, '$' returning clob)\")\n    }\n\n    @Test\n    fun matchesJsonValueWithReturningAscii() {\n        assertThat(p).matches(\"json_value(doc, '$' returning clob ascii)\")\n    }\n\n    @Test\n    fun matchesLongJsonValue() {\n        assertThat(p).matches(\"\"\"\n            json_value(doc, '$'\n            passing 'a' as a\n            returning varchar2(10) truncate\n            error on error\n            error on empty\n            error on mismatch (missing data)\n            ignore on mismatch (extra data)\n            type strict)\"\"\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/LikeExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass LikeExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesLike() {\n        assertThat(p).matches(\"var like 'test'\")\n    }\n\n    @Test\n    fun matchesNotLike() {\n        assertThat(p).matches(\"var not like 'test'\")\n    }\n\n    @Test\n    fun matchesLikeWithEscape() {\n        assertThat(p).matches(\"var like 'test|_foo' escape '|'\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/ListAggExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass ListAggExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesSimpleListAgg() {\n        assertThat(p).matches(\"listagg(foo) within group (order by bar)\")\n    }\n\n    @Test\n    fun matchesListAggAll() {\n        assertThat(p).matches(\"listagg(all foo) within group (order by bar)\")\n    }\n\n    @Test\n    fun matchesListAggDistinct() {\n        assertThat(p).matches(\"listagg(distinct foo) within group (order by bar)\")\n    }\n\n    @Test\n    fun matchesListAggWithDelimiter() {\n        assertThat(p).matches(\"listagg(foo, ',') within group (order by bar)\")\n    }\n\n    @Test\n    fun matchesListAggWithDelimiter2() {\n        assertThat(p).matches(\"listagg(foo, chr(10)) within group (order by bar)\")\n    }\n\n    @Test\n    fun matchesListAggOverflowError() {\n        assertThat(p).matches(\"listagg(foo on overflow error) within group (order by bar)\")\n    }\n\n    @Test\n    fun matchesListAggOverflowTruncate() {\n        assertThat(p).matches(\"listagg(foo on overflow truncate) within group (order by bar)\")\n    }\n\n    @Test\n    fun matchesListAggOverflowTruncateWithIndicator() {\n        assertThat(p).matches(\"listagg(foo on overflow truncate '...') within group (order by bar)\")\n    }\n\n    @Test\n    fun matchesListAggOverflowTruncateWithCount() {\n        assertThat(p).matches(\"listagg(foo on overflow truncate '...' with count) within group (order by bar)\")\n    }\n\n    @Test\n    fun matchesListAggOverflowTruncateWithoutCount() {\n        assertThat(p).matches(\"listagg(foo on overflow truncate '...' without count) within group (order by bar)\")\n    }\n\n    @Test\n    fun matchesListAggPartitionBy() {\n        assertThat(p).matches(\"listagg(foo) within group (order by bar) over (partition by baz)\")\n    }\n\n    @Test\n    fun matchesLongListAgg() {\n        assertThat(p).matches(\"listagg(foo, ',') within group (order by bar) over (partition by baz)\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/MultisetExpressionsTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass MultisetExpressionsTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesIsASet() {\n        assertThat(p).matches(\"foo is a set\")\n    }\n\n    @Test\n    fun matchesIsNotASet() {\n        assertThat(p).matches(\"foo is not a set\")\n    }\n\n    @Test\n    fun matchesIsEmpty() {\n        assertThat(p).matches(\"foo is not a set\")\n    }\n\n    @Test\n    fun matchesIsNotEmpty() {\n        assertThat(p).matches(\"foo is not a set\")\n    }\n\n    @Test\n    fun matchesMemberExpression() {\n        assertThat(p).matches(\"foo member bar\")\n    }\n\n    @Test\n    fun matchesMemberOfExpression() {\n        assertThat(p).matches(\"foo member of bar\")\n    }\n\n    @Test\n    fun matchesNotMemberOfExpression() {\n        assertThat(p).matches(\"foo not member of bar\")\n    }\n\n    @Test\n    fun matchesSimpleSubmultiset() {\n        assertThat(p).matches(\"foo submultiset bar\")\n    }\n\n    @Test\n    fun matchesSubmultisetOf() {\n        assertThat(p).matches(\"foo submultiset of bar\")\n    }\n\n    @Test\n    fun matchesNotSubmultiset() {\n        assertThat(p).matches(\"foo not submultiset bar\")\n    }\n\n    @Test\n    fun matchesNotSubmultisetOf() {\n        assertThat(p).matches(\"foo not submultiset of bar\")\n    }\n\n    @Test\n    fun matchesMultisetExcept() {\n        assertThat(p).matches(\"foo multiset except bar\")\n    }\n\n    @Test\n    fun matchesMultisetExceptAll() {\n        assertThat(p).matches(\"foo multiset except all bar\")\n    }\n\n    @Test\n    fun matchesMultisetExceptDistinct() {\n        assertThat(p).matches(\"foo multiset except distinct bar\")\n    }\n\n    @Test\n    fun doesNotMatcheMultisetExceptAllDistinct() {\n        assertThat(p).notMatches(\"foo multiset except all distinct\")\n    }\n\n    @Test\n    fun matchesMultisetIntersect() {\n        assertThat(p).matches(\"foo multiset intersect bar\")\n    }\n\n    @Test\n    fun matchesMultisetIntersectWithFunctions() {\n        assertThat(p).matches(\"foo(1,2,3) multiset intersect bar('a', 'b', 'c')\")\n    }\n\n    @Test\n    fun matchesMultisetUnion() {\n        assertThat(p).matches(\"foo multiset union bar\")\n    }\n\n    @Test\n    fun matchesMultipleMultisetUnion() {\n        assertThat(p).matches(\"a multiset union b multiset union c multiset union d\")\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/NewObjectExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass NewObjectExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesSimpleNewObject() {\n        assertThat(p).matches(\"new foo.bar\")\n    }\n\n    @Test\n    fun matchesNewObjectWithEmptyParameterList() {\n        assertThat(p).matches(\"new foo()\")\n    }\n\n    @Test\n    fun matchesNewObjectWithSimpleParameterList() {\n        assertThat(p).matches(\"new foo(1, foo, 'bar', foo + bar)\")\n    }\n\n    @Test\n    fun matchesNewObjectWithNamedParameterList() {\n        assertThat(p).matches(\"new foo(p1 => 1, p2 => foo, p3 => 'bar', p4 => foo + bar)\")\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/NotExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass NotExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.NOT_EXPRESSION)\n    }\n\n    @Test\n    fun matchesSimpleNotExpression() {\n        assertThat(p).matches(\"not x\")\n    }\n\n    @Test\n    fun matchesNotExpression() {\n        assertThat(p).matches(\"not x = a\")\n    }\n\n    @Test\n    fun matchesNotExpressionWithParenthesis() {\n        assertThat(p).matches(\"not (x = a)\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/NumericExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass NumericExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesNumericAddition() {\n        assertThat(p).matches(\"1 + 1\")\n        assertThat(p).matches(\"1+1\")\n    }\n\n    @Test\n    fun matchesNumericSubtraction() {\n        assertThat(p).matches(\"1 - 1\")\n        assertThat(p).matches(\"1-1\")\n    }\n\n    @Test\n    fun matchesNumericMultiplication() {\n        assertThat(p).matches(\"1 * 1\")\n    }\n\n    @Test\n    fun matchesNumericDivision() {\n        assertThat(p).matches(\"1 / 1\")\n    }\n\n    @Test\n    fun matchesNumericExponentiation() {\n        assertThat(p).matches(\"1 ** 1\")\n    }\n\n    @Test\n    fun matchesModulo() {\n        assertThat(p).matches(\"1 mod 1\")\n    }\n\n    @Test\n    fun matchesMathematicalOperationBetweenTwoQueries() {\n        assertThat(p).matches(\"(select 1 from dual) + (select 1 from dual)\")\n    }\n\n    @Test\n    fun matchesMathematicalOperationBetweenTwoCaseExpressions() {\n        assertThat(p).matches(\"(case when 1 = 1 then 1 end) + (case when 1 = 1 then 1 end)\")\n    }\n\n    @Test\n    fun matchesCursorRowcount() {\n        assertThat(p).matches(\"cur%rowcount + 1\")\n    }\n\n    @Test\n    fun matchesHostCursorRowcount() {\n        assertThat(p).matches(\":cur%rowcount + 1\")\n    }\n\n    @Test\n    fun matchesSqlRowcount() {\n        assertThat(p).matches(\"sql%rowcount + 1\")\n    }\n\n    @Test\n    fun matchesSqlBulkRowcount() {\n        assertThat(p).matches(\"sql%bulk_rowcount(1) + 1\")\n    }\n\n    @Test\n    fun matchesHostVariableExpression() {\n        assertThat(p).matches(\":var + 1\")\n    }\n\n    @Test\n    fun matchesIndicatorVariableExpression() {\n        assertThat(p).matches(\":var:indicator + 1\")\n    }\n\n    @Test\n    fun matchesVariableExpression() {\n        assertThat(p).matches(\"var + 1\")\n    }\n\n    @Test\n    fun matchesFunctionCallExpression() {\n        assertThat(p).matches(\"func(var) + 1\")\n    }\n\n    @Test\n    fun matchesCollectionCount() {\n        assertThat(p).matches(\"collection.count\")\n    }\n\n    @Test\n    fun matchesCollectionFirst() {\n        assertThat(p).matches(\"collection.first + 1\")\n    }\n\n    @Test\n    fun matchesCollectionLast() {\n        assertThat(p).matches(\"collection.last + 1\")\n    }\n\n    @Test\n    fun matchesCollectionLimit() {\n        assertThat(p).matches(\"collection.limit + 1\")\n    }\n\n    @Test\n    fun matchesCollectionNext() {\n        assertThat(p).matches(\"collection.next(1) + 1\")\n    }\n\n    @Test\n    fun matchesCollectionPrior() {\n        assertThat(p).matches(\"collection.prior(1) + 1\")\n    }\n\n    @Test\n    fun notMatchesQueries() {\n        assertThat(p).notMatches(\"1 + select 1 from dual\")\n        assertThat(p).notMatches(\"(select 1 from dual) / select 1 from dual\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/OtherExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass OtherExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesCollectionExists() {\n        assertThat(p).matches(\"collection.exists(0)\")\n    }\n\n    @Test\n    fun matchesCursorMethods() {\n        assertThat(p).matches(\"cur%found\")\n        assertThat(p).matches(\"cur%notfound\")\n        assertThat(p).matches(\"cur%isopen\")\n    }\n\n    @Test\n    fun matchesHostCursorMethods() {\n        assertThat(p).matches(\":cur%found\")\n        assertThat(p).matches(\":cur%notfound\")\n        assertThat(p).matches(\":cur%isopen\")\n    }\n\n    @Test\n    fun matchesSqlMethods() {\n        assertThat(p).matches(\"sql%found\")\n        assertThat(p).matches(\"sql%notfound\")\n        assertThat(p).matches(\"sql%isopen\")\n    }\n\n    @Test\n    fun matchesIsNull() {\n        assertThat(p).matches(\"var is null\")\n    }\n\n    @Test\n    fun matchesIsNotNull() {\n        assertThat(p).matches(\"var is not null\")\n    }\n\n    @Test\n    fun matchesIsTrue() {\n        assertThat(p).matches(\"var is true\")\n    }\n\n    @Test\n    fun matchesIsNotTrue() {\n        assertThat(p).matches(\"var is not true\")\n    }\n\n    @Test\n    fun matchesIsFalse() {\n        assertThat(p).matches(\"var is false\")\n    }\n\n    @Test\n    fun matchesIsNotFalse() {\n        assertThat(p).matches(\"var is not false\")\n    }\n\n    @Test\n    fun matchesBasicIn() {\n        assertThat(p).matches(\"var in (1)\")\n    }\n\n    @Test\n    fun matchesBasicInWithMultipleValues() {\n        assertThat(p).matches(\"var in (1, 2, 3)\")\n    }\n\n    @Test\n    fun matchesExpressionWithInWithMultipleValues() {\n        setRootRule(PlSqlGrammar.IN_EXPRESSION)\n        assertThat(p).matches(\"v1||v2 in ('ab', 'bc', 'ac')\")\n    }\n\n    @Test\n    fun matchesBasicInWithoutParenthesis() {\n        assertThat(p).matches(\"var in 1\")\n    }\n\n    @Test\n    fun matchesMultidimensionalCollection() {\n        assertThat(p).matches(\"foo(1)(1)\")\n    }\n\n    @Test\n    fun InExpressionShouldNotMatchAdditionalExpressions() {\n        setRootRule(PlSqlGrammar.IN_EXPRESSION)\n        assertThat(p).notMatches(\"var in (select 1 from dual) and x = y\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/QalifiedExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass QalifiedExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.QUALIFIED_EXPRESSION)\n    }\n\n    @Test\n    fun matchesNamedChoice() {\n        assertThat(p).matches(\"foo(b | b => 1)\")\n    }\n\n    @Test\n    fun matchesIndexedChoice() {\n        assertThat(p).matches(\"foo(1 => 'A', 2 => 'B', 3 | 4 => 'C', fun() => 4)\")\n    }\n\n    @Test\n    fun matchesSequenceIteratorChoice() {\n        assertThat(p).matches(\"foo(for i in 1..10 sequence => i)\")\n    }\n\n    @Test\n    fun matchesBasicIteratorChoice() {\n        assertThat(p).matches(\"foo(for i in 1..10 => i)\")\n    }\n\n    @Test\n    fun matchesIndexIteratorChoice() {\n        assertThat(p).matches(\"foo(for i in 1..10 index i => i)\")\n    }\n\n    @Test\n    fun matchesOthersChoice() {\n        assertThat(p).matches(\"foo(a | b => 3, others => 0)\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/RelationalExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass RelationalExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesEqualTo() {\n        assertThat(p).matches(\"1 = 1\")\n    }\n\n    @Test\n    fun matchesNotEqualTo() {\n        assertThat(p).matches(\"1 <> 2\")\n        assertThat(p).matches(\"1 != 2\")\n        assertThat(p).matches(\"1 ~= 2\")\n        assertThat(p).matches(\"1 ^= 2\")\n    }\n\n    @Test\n    fun matchesLessThan() {\n        assertThat(p).matches(\"1 < 2\")\n    }\n\n    @Test\n    fun matchesGreaterThen() {\n        assertThat(p).matches(\"2 > 1\")\n    }\n\n    @Test\n    fun matchesLessThanOrEqualTo() {\n        assertThat(p).matches(\"1 <= 2\")\n    }\n\n    @Test\n    fun matchesGreaterThenOrEqualTo() {\n        assertThat(p).matches(\"2 >= 1\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/SetExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass SetExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesSimpleTreatAs() {\n        assertThat(p).matches(\"set(foo)\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/TableExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass TableExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesSimpleTable() {\n        assertThat(p).matches(\"table(foo)\")\n    }\n\n    @Test\n    fun matchesTableExpressionWithQuery() {\n        assertThat(p).matches(\"table(select 1 from dual)\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/TheExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass TheExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesSimpleThe() {\n        assertThat(p).matches(\"the(foo)\")\n    }\n\n    @Test\n    fun matchesTheExpressionWithQuery() {\n        assertThat(p).matches(\"the(select 1 from dual)\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/ToBinaryDoubleExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass ToBinaryDoubleExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesSimple() {\n        assertThat(p).matches(\"to_binary_double(foo)\")\n    }\n\n    @Test\n    fun matchesDefaultClause() {\n        assertThat(p).matches(\"to_binary_double(foo default 0 on conversion error)\")\n    }\n\n    @Test\n    fun matchesMultipleArguments() {\n        assertThat(p).matches(\"to_binary_double(foo, '9999', 'NLS_DATE_LANGUAGE = American')\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/ToBinaryFloatExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass ToBinaryFloatExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesSimple() {\n        assertThat(p).matches(\"to_binary_float(foo)\")\n    }\n\n    @Test\n    fun matchesDefaultClause() {\n        assertThat(p).matches(\"to_binary_float(foo default 0 on conversion error)\")\n    }\n\n    @Test\n    fun matchesMultipleArguments() {\n        assertThat(p).matches(\"to_binary_float(foo, '9999', 'NLS_DATE_LANGUAGE = American')\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/ToBooleanExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass ToBooleanExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesSimple() {\n        assertThat(p).matches(\"to_boolean(foo)\")\n    }\n\n    @Test\n    fun matchesDefaultClause() {\n        assertThat(p).matches(\"to_boolean(foo default false on conversion error)\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/ToDateExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass ToDateExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesSimple() {\n        assertThat(p).matches(\"to_date(foo)\")\n    }\n\n    @Test\n    fun matchesDefaultClause() {\n        assertThat(p).matches(\"to_date(foo default sysdate on conversion error)\")\n    }\n\n    @Test\n    fun matchesMultipleArguments() {\n        assertThat(p).matches(\"to_date(foo, 'dd/mm/rrrr', 'NLS_DATE_LANGUAGE = American')\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/ToDsintervalExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass ToDsintervalExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesSimple() {\n        assertThat(p).matches(\"to_dsinterval(foo)\")\n    }\n\n    @Test\n    fun matchesDefaultClause() {\n        assertThat(p).matches(\"to_dsinterval(foo default false on conversion error)\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/ToNumberExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass ToNumberExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesSimple() {\n        assertThat(p).matches(\"to_number(foo)\")\n    }\n\n    @Test\n    fun matchesDefaultClause() {\n        assertThat(p).matches(\"to_number(foo default 0 on conversion error)\")\n    }\n\n    @Test\n    fun matchesMultipleArguments() {\n        assertThat(p).matches(\"to_number(foo, '999G999', 'NLS_DATE_LANGUAGE = American')\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/ToTimestampExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass ToTimestampExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesSimple() {\n        assertThat(p).matches(\"to_timestamp(foo)\")\n    }\n\n    @Test\n    fun matchesDefaultClause() {\n        assertThat(p).matches(\"to_timestamp(foo default systimestamp on conversion error)\")\n    }\n\n    @Test\n    fun matchesMultipleArguments() {\n        assertThat(p).matches(\"to_timestamp(foo, 'dd/mm/rrrr', 'NLS_DATE_LANGUAGE = American')\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/ToTimestampTzExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass ToTimestampTzExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesSimple() {\n        assertThat(p).matches(\"to_timestamp_tz(foo)\")\n    }\n\n    @Test\n    fun matchesDefaultClause() {\n        assertThat(p).matches(\"to_timestamp_tz(foo default systimestamp on conversion error)\")\n    }\n\n    @Test\n    fun matchesMultipleArguments() {\n        assertThat(p).matches(\"to_timestamp_tz(foo, 'dd/mm/rrrr', 'NLS_DATE_LANGUAGE = American')\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/ToYmintervalExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass ToYmintervalExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesSimple() {\n        assertThat(p).matches(\"to_yminterval(foo)\")\n    }\n\n    @Test\n    fun matchesDefaultClause() {\n        assertThat(p).matches(\"to_yminterval(foo default '00-00' on conversion error)\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/TreatAsExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass TreatAsExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesSimpleTreatAs() {\n        assertThat(p).matches(\"treat(foo as bar)\")\n    }\n\n    @Test\n    fun matchesTreatAsRef() {\n        assertThat(p).matches(\"treat(foo as ref bar)\")\n    }\n\n    @Test\n    fun matchesTreatAsRef2() {\n        assertThat(p).matches(\"treat(foo as ref bar).test\")\n    }\n\n    @Test\n    fun matchesAsExpression() {\n        assertThat(p).matches(\"(foo as bar)\")\n    }\n\n    @Test\n    fun matchesAsExpressionWithMethodCall() {\n        assertThat(p).matches(\"(foo as bar).baz()\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/TrimExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass TrimExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesSimpleTrim() {\n        assertThat(p).matches(\"trim(foo)\")\n    }\n\n    @Test\n    fun matchesTrimCharacterFrom() {\n        assertThat(p).matches(\"trim(',' from foo)\")\n    }\n\n    @Test\n    fun matchesTrimLeadingCharacterFrom() {\n        assertThat(p).matches(\"trim(leading ',' from foo)\")\n    }\n\n    @Test\n    fun matchesTrimTrailingCharacterFrom() {\n        assertThat(p).matches(\"trim(trailing ',' from foo)\")\n    }\n\n    @Test\n    fun matchesTrimBothCharacterFrom() {\n        assertThat(p).matches(\"trim(both ',' from foo)\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/XmlAggExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass XmlAggExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesSimpleXmlAgg() {\n        assertThat(p).matches(\"xmlagg(foo)\")\n    }\n\n    @Test\n    fun matchesXmlAggWithOrderBy() {\n        assertThat(p).matches(\"xmlagg(foo order by bar)\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/XmlAttributesExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass XmlAttributesExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesSimpleXmlAttributes() {\n        assertThat(p).matches(\"xmlattributes(foo)\")\n    }\n\n    @Test\n    fun matchesXmlAttributesEntityEscaping() {\n        assertThat(p).matches(\"xmlattributes(entityescaping foo)\")\n    }\n\n    @Test\n    fun matchesXmlAttributesNoEntityEscaping() {\n        assertThat(p).matches(\"xmlattributes(noentityescaping foo)\")\n    }\n\n    @Test\n    fun matchesXmlAttributesSchemaCheck() {\n        assertThat(p).matches(\"xmlattributes(schemacheck foo)\")\n    }\n\n    @Test\n    fun matchesXmlAttributesNoSchemaCheck() {\n        assertThat(p).matches(\"xmlattributes(noschemacheck foo)\")\n    }\n\n    @Test\n    fun matchesXmlAttributesWithExpressionWithoutAs() {\n        assertThat(p).matches(\"xmlattributes(foo \\\"bar\\\")\")\n    }\n\n    @Test\n    fun matchesXmlAttributesWithExpression() {\n        assertThat(p).matches(\"xmlattributes(foo as \\\"bar\\\")\")\n    }\n\n    @Test\n    fun matchesXmlAttributesWithEvalNameExpression() {\n        assertThat(p).matches(\"xmlattributes(foo as evalname bar)\")\n    }\n\n    @Test\n    fun matchesXmlAttributesWithMultipleAttributes() {\n        assertThat(p).matches(\"xmlattributes(foo as \\\"bar\\\", foo2 as \\\"bar2\\\")\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/XmlCastExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass XmlCastExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesSimpleXmlCast() {\n        assertThat(p).matches(\"xmlcast(xmltype('<foo/>') as varchar2)\")\n    }\n\n    @Test\n    fun matchesXmlCastWithXmlQuery() {\n        assertThat(p).matches(\"xmlcast(xmlquery('<foo/>' passing bar returning content) as varchar2)\")\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/XmlColattvalExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass XmlColattvalExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesSimpleXmlCollattval() {\n        assertThat(p).matches(\"xmlcolattval(foo, bar, foo2, bar2)\")\n    }\n\n    @Test\n    fun matchesXmlColattvalWithExpressionWithoutAs() {\n        assertThat(p).matches(\"xmlcolattval(foo \\\"bar\\\")\")\n    }\n\n    @Test\n    fun matchesXmlColattvalWithEvalname() {\n        assertThat(p).matches(\"xmlcolattval(foo as bar, foo as evalname bar)\")\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/XmlElementExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass XmlElementExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesSimpleXmlElement() {\n        assertThat(p).matches(\"xmlelement(\\\"xml\\\")\")\n    }\n\n    @Test\n    fun matchesXmlElementEntityEscaping() {\n        assertThat(p).matches(\"xmlelement(entityescaping \\\"xml\\\")\")\n    }\n\n    @Test\n    fun matchesXmlElementEntityNoEscaping() {\n        assertThat(p).matches(\"xmlelement(noentityescaping \\\"xml\\\")\")\n    }\n\n    @Test\n    fun matchesXmlElementExplicitNameKeyword() {\n        assertThat(p).matches(\"xmlelement(name \\\"xml\\\")\")\n    }\n\n    @Test\n    fun matchesXmlElementEvalNameKeyword() {\n        assertThat(p).matches(\"xmlelement(evalname \\\"xml\\\")\")\n    }\n\n    @Test\n    fun matchesXmlElementWithXmlAttributes() {\n        assertThat(p).matches(\"xmlelement(\\\"xml\\\", xmlattributes(foo as \\\"bar\\\"))\")\n    }\n\n    @Test\n    fun matchesXmlElementWithValue() {\n        assertThat(p).matches(\"xmlelement(\\\"xml\\\", foo)\")\n    }\n\n    @Test\n    fun matchesXmlElementWithValueAndAlias() {\n        assertThat(p).matches(\"xmlelement(\\\"xml\\\", foo as bar)\")\n        assertThat(p).matches(\"xmlelement(\\\"xml\\\", foo bar)\")\n    }\n\n    @Test\n    fun matchesXmlElementWithMultipleValues() {\n        assertThat(p).matches(\"xmlelement(\\\"xml\\\", foo, bar, baz)\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/XmlExistsExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass XmlExistsExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesSimpleXmlExists() {\n        assertThat(p).matches(\"xmlexists('/foo')\")\n    }\n\n    @Test\n    fun matchesXmlExistsWithPassingClause() {\n        assertThat(p).matches(\"xmlexists('/foo' passing bar)\")\n    }\n\n    @Test\n    fun matchesXmlExistsWithPassingByValueClause() {\n        assertThat(p).matches(\"xmlexists('/foo' passing by value bar)\")\n    }\n\n    @Test\n    fun matchesXmlExistsWithPassingMoreValues() {\n        assertThat(p).matches(\"xmlexists('/foo' passing \\\"bar\\\" as bar, \\\"bar2\\\" as bar2)\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/XmlForestExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass XmlForestExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesSimpleXmlForest() {\n        assertThat(p).matches(\"xmlforest(foo)\")\n    }\n\n    @Test\n    fun matchesXmlForestWithExpressionWithoutAs() {\n        assertThat(p).matches(\"xmlforest(foo \\\"bar\\\")\")\n    }\n\n    @Test\n    fun matchesXmlForestWithExpression() {\n        assertThat(p).matches(\"xmlforest(foo as \\\"bar\\\")\")\n    }\n\n    @Test\n    fun matchesXmlForestWithEvalNameExpression() {\n        assertThat(p).matches(\"xmlforest(foo as evalname bar)\")\n    }\n\n    @Test\n    fun matchesXmlForestWithMultipleAttributes() {\n        assertThat(p).matches(\"xmlforest(foo as \\\"bar\\\", foo2 as \\\"bar2\\\")\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/XmlParseExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass XmlParseExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesSimpleXmlParse() {\n        assertThat(p).matches(\"xmlparse(content '<foo>bar</bar>')\")\n    }\n\n    @Test\n    fun matchesXmlParseDocument() {\n        assertThat(p).matches(\"xmlparse(document '<foo>bar</bar>')\")\n    }\n\n    @Test\n    fun matchesXmlParseDocumentWellformed() {\n        assertThat(p).matches(\"xmlparse(document '<foo>bar</bar>' wellformed)\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/XmlPiExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass XmlPiExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesSimpleXmlPi() {\n        assertThat(p).matches(\"xmlpi(name \\\"foo\\\")\")\n    }\n\n    @Test\n    fun matchesXmlPiWithEvalname() {\n        assertThat(p).matches(\"xmlpi(evalname foo)\")\n    }\n\n    @Test\n    fun matchesXmlPiWithContent() {\n        assertThat(p).matches(\"xmlpi(name \\\"foo\\\", 'bar')\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/XmlQueryExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass XmlQueryExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesSimpleXmlQuery() {\n        assertThat(p).matches(\"xmlquery('/foo' returning content)\")\n    }\n\n    @Test\n    fun matchesXmlQueryWithNullOnEmpty() {\n        assertThat(p).matches(\"xmlquery('/foo' returning content null on empty)\")\n    }\n\n    @Test\n    fun matchesXmlQueryWithPassingByValueClause() {\n        assertThat(p).matches(\"xmlquery('/foo' passing by value bar returning content)\")\n    }\n\n    @Test\n    fun matchesXmlQueryWithPassingMoreValues() {\n        assertThat(p).matches(\"xmlquery('/foo' passing \\\"bar\\\" as bar, \\\"bar2\\\" as bar2 returning content)\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/XmlRootExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass XmlRootExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesSimpleXmlRoot() {\n        assertThat(p).matches(\"xmlroot(xmltype('<foo/>'), version no value)\")\n    }\n\n    @Test\n    fun matchesXmlRootWithVersion() {\n        assertThat(p).matches(\"xmlroot(xmltype('<foo/>'), version '1.0')\")\n    }\n\n    @Test\n    fun matchesXmlRootWithStandalone() {\n        assertThat(p).matches(\"xmlroot(xmltype('<foo/>'), version '1.0', standalone no value)\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/XmlSerializeExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass XmlSerializeExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesSimpleXmlSerializeDocument() {\n        assertThat(p).matches(\"xmlserialize(document 'foo')\")\n    }\n\n    @Test\n    fun matchesSimpleXmlSerializeContent() {\n        assertThat(p).matches(\"xmlserialize(content 'foo')\")\n    }\n\n    @Test\n    fun matchesXmlSerializeAsDatatype() {\n        assertThat(p).matches(\"xmlserialize(document 'foo' as clob)\")\n    }\n\n    @Test\n    fun matchesXmlSerializeWithEncoding() {\n        assertThat(p).matches(\"xmlserialize(document 'foo' encoding 'utf-8')\")\n    }\n\n    @Test\n    fun matchesXmlSerializeWithVersion() {\n        assertThat(p).matches(\"xmlserialize(document 'foo' version '1.0')\")\n    }\n\n    @Test\n    fun matchesXmlSerializeWithNoIdent() {\n        assertThat(p).matches(\"xmlserialize(document 'foo' no indent)\")\n    }\n\n    @Test\n    fun matchesXmlSerializeWithIndent() {\n        assertThat(p).matches(\"xmlserialize(document 'foo' indent)\")\n    }\n\n    @Test\n    fun matchesXmlSerializeWithIndentAndSize() {\n        assertThat(p).matches(\"xmlserialize(document 'foo' indent size = 1)\")\n    }\n\n    @Test\n    fun matchesXmlSerializeWithHideDefaults() {\n        assertThat(p).matches(\"xmlserialize(document 'foo' hide defaults)\")\n    }\n\n    @Test\n    fun matchesXmlSerializeWithShowDefaults() {\n        assertThat(p).matches(\"xmlserialize(document 'foo' show defaults)\")\n    }\n\n    @Test\n    fun matchesLongXmlSerializeExpression() {\n        assertThat(p).matches(\"xmlserialize(document 'foo' as clob encoding 'utf-8' version '1.0' indent size = 1 show defaults)\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/expressions/XmlTableExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.expressions\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass XmlTableExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesSimpleXmlTable() {\n        assertThat(p).matches(\"xmltable('/foo' passing bar)\")\n        assertThat(p).matches(\"xmltable('/foo' passing bar.baz)\")\n    }\n\n    @Test\n    fun matchesXmlTableWithNamespaces() {\n        assertThat(p).matches(\"xmltable(xmlnamespaces ('foo' as bar, default 'foo2'), '/foo/bar:foo' passing bar)\")\n    }\n\n    @Test\n    fun matchesXmlTableReturningSequenceByRef() {\n        assertThat(p).matches(\"xmltable('/foo' passing bar returning sequence by ref)\")\n    }\n\n    @Test\n    fun matchesXmlTableWithColumns() {\n        assertThat(p).matches(\"xmltable('/foo' passing bar columns \\\"foo\\\" varchar2(1) path 'bar' default 'a', \\\"foo2\\\" varchar2(1) path 'bar2', \\\"foo3\\\" for ordinality)\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/matchers/MethodMatcherTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.matchers\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass MethodMatcherTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun detectSimpleMethodByName() {\n        val matcher = MethodMatcher.create().name(\"func\")\n        matches(matcher, \"func\")\n        notMatches(matcher, \"foo\")\n        notMatches(matcher, \"foo.func\")\n    }\n\n    @Test\n    fun detectAnyMethod() {\n        val matcher = MethodMatcher.create().name(NameCriteria.any())\n        matches(matcher, \"func\")\n        matches(matcher, \"foo\")\n    }\n\n    @Test\n    fun detectAnyMethodInList() {\n        val matcher = MethodMatcher.create().name(NameCriteria.`in`(\"func\", \"foo\"))\n        matches(matcher, \"func\")\n        matches(matcher, \"FOO\")\n        notMatches(matcher, \"bar\")\n    }\n\n    @Test\n    fun detectMethodInPackage() {\n        val matcher = MethodMatcher.create().packageName(\"pack\").name(\"func\")\n        matches(matcher, \"pack.func\")\n        notMatches(matcher, \"pkg.func\")\n        notMatches(matcher, \"func\")\n    }\n\n    @Test\n    fun detectMethodInAnyPackage() {\n        val matcher = MethodMatcher.create().packageName(NameCriteria.any()).name(\"func\")\n        matches(matcher, \"pack.func\")\n        matches(matcher, \"pkg.func\")\n    }\n\n    @Test\n    fun detectMethodInSchema() {\n        val matcher = MethodMatcher.create().schema(\"sch\").name(\"func\")\n        matches(matcher, \"sch.func\")\n        notMatches(matcher, \"bar.func\")\n        notMatches(matcher, \"func\")\n    }\n\n    @Test\n    fun detectMethodInAnySchema() {\n        val matcher = MethodMatcher.create().schema(NameCriteria.any()).name(\"func\")\n        matches(matcher, \"sch.func\")\n        matches(matcher, \"bar.func\")\n    }\n\n    @Test\n    fun detectMethodInPackageAndSchema() {\n        val matcher = MethodMatcher.create().schema(\"sch\").packageName(\"pack\").name(\"func\")\n        matches(matcher, \"sch.pack.func\")\n        notMatches(matcher, \"bar.pack.func\")\n    }\n\n    @Test\n    fun detectMethodInPackageAndOptionalSchema() {\n        val matcher = MethodMatcher.create().schema(\"sch\").schemaIsOptional().packageName(\"pack\").name(\"func\")\n        matches(matcher, \"sch.pack.func\")\n        matches(matcher, \"pack.func\")\n    }\n\n    @Test\n    fun detectMethodWithOneParameter() {\n        val matcher = MethodMatcher.create().name(\"func\").addParameter()\n        matches(matcher, \"func(x)\")\n        notMatches(matcher, \"func(x, y)\")\n        notMatches(matcher, \"bar.func(x)\")\n    }\n\n    @Test\n    fun detectMethodWithMoreParameters() {\n        val matcher = MethodMatcher.create().name(\"func\").addParameter().addParameter().addParameter()\n        matches(matcher, \"func(x, y, z)\")\n        notMatches(matcher, \"func(x)\")\n    }\n\n    @Test\n    fun detectMethodWithMoreParameters2() {\n        val matcher = MethodMatcher.create().name(\"func\").addParameters(3)\n        matches(matcher, \"func(x, y, z)\")\n        notMatches(matcher, \"func(x)\")\n    }\n\n    @Test\n    fun detectMethodInPackageWithParameters() {\n        val matcher = MethodMatcher.create().packageName(\"pack\").name(\"func\").addParameter().addParameter().addParameter()\n        matches(matcher, \"pack.func(x, y, z)\")\n        notMatches(matcher, \"bar.func(x)\")\n    }\n\n    @Test\n    fun detectMethodWithoutParameterConstraint() {\n        val matcher = MethodMatcher.create().name(\"func\").withNoParameterConstraint()\n        matches(matcher, \"func(x)\")\n    }\n\n    @Test\n    fun detectHostMethodCall() {\n        val matcher = MethodMatcher.create().name(\"func\").withNoParameterConstraint()\n        matches(matcher, \":func(x)\")\n    }\n\n    @Test\n    fun shouldFailIfNameIsCalledMoreThanOnce() {\n        val matcher = MethodMatcher.create().name(\"name\")\n        assertThrows<IllegalStateException> {\n            matcher.name(\"name\")\n        }\n    }\n\n    @Test\n    fun shouldFailIfPackageNameIsCalledMoreThanOnce() {\n        val matcher = MethodMatcher.create().packageName(\"name\")\n        assertThrows<IllegalStateException> {\n            matcher.packageName(\"name\")\n        }\n    }\n\n    @Test\n    fun shouldFailIfSchemaIsCalledMoreThanOnce() {\n        val matcher = MethodMatcher.create().schema(\"name\")\n        assertThrows<IllegalStateException> {\n            matcher.schema(\"name\")\n        }\n    }\n\n    @Test\n    fun shouldFailIfAddParameterIsCalledAfterWithNoParameterConstraint() {\n        val matcher = MethodMatcher.create().withNoParameterConstraint()\n        assertThrows<IllegalStateException> {\n            matcher.addParameter()\n        }\n    }\n\n    @Test\n    fun shouldFailIfAddParametersIsCalledAfterWithNoParameterConstraint() {\n        val matcher = MethodMatcher.create().withNoParameterConstraint()\n        assertThrows<IllegalStateException> {\n            matcher.addParameters(2)\n        }\n    }\n\n    @Test\n    fun shouldFailIfWithNoParameterConstraintIsCalledAfterAddParameter() {\n        val matcher = MethodMatcher.create().addParameter()\n        assertThrows<IllegalStateException> {\n            matcher.withNoParameterConstraint()\n        }\n    }\n\n    @Test\n    fun shouldFailIfWithNoParameterConstraintIsCalledAfterAddParameters() {\n        val matcher = MethodMatcher.create().addParameters(2)\n        assertThrows<IllegalStateException> {\n            matcher.withNoParameterConstraint()\n        }\n    }\n\n    fun matches(matcher: MethodMatcher, text: String) {\n        assertThat(matcher.matches(p.parse(text).firstChild)).isTrue\n    }\n\n    fun notMatches(matcher: MethodMatcher, text: String) {\n        assertThat(matcher.matches(p.parse(text).firstChild)).isFalse\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/matchers/MethodMatcherWithTypesTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.matchers\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.asSemantic\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\nimport com.felipebz.zpa.api.squid.SemanticAstNode\nimport com.felipebz.zpa.api.symbols.PlSqlType\nimport com.felipebz.zpa.api.symbols.datatype.CharacterDatatype\nimport com.felipebz.zpa.api.symbols.datatype.DateDatatype\nimport com.felipebz.zpa.api.symbols.datatype.NumericDatatype\nimport com.felipebz.zpa.api.symbols.datatype.PlSqlDatatype\n\nclass MethodMatcherWithTypesTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXPRESSION)\n    }\n\n    @Test\n    fun matchesMethodWhenTheTypeIsNotSpecifiedInTheMatcher() {\n        val matcher = MethodMatcher.create().name(\"func\").addParameter()\n        val node = getAstNodeWithArguments(\"func(x)\", NumericDatatype())\n        assertThat(matcher.matches(node)).isTrue\n    }\n\n    @Test\n    fun matchesMethodWhenTheTypeIsSpecifiedAsUnknownInTheMatcher() {\n        val matcher = MethodMatcher.create().name(\"func\").addParameter(PlSqlType.UNKNOWN)\n        val node = getAstNodeWithArguments(\"func(x)\", NumericDatatype())\n        assertThat(matcher.matches(node)).isTrue\n    }\n\n    @Test\n    fun matchesMethodWhenTheTypeIsSpecifiedInTheMatcher() {\n        val matcher = MethodMatcher.create().name(\"func\").addParameter(PlSqlType.NUMERIC)\n        val node = getAstNodeWithArguments(\"func(x)\", NumericDatatype())\n        assertThat(matcher.matches(node)).isTrue\n    }\n\n    @Test\n    fun notMatchesMethodWhenTheTypeIsDifferentFromExpectation() {\n        val matcher = MethodMatcher.create().name(\"func\").addParameter(PlSqlType.CHARACTER)\n        val node = getAstNodeWithArguments(\"func(x)\", NumericDatatype())\n        assertThat(matcher.matches(node)).isFalse\n    }\n\n    @Test\n    fun matchesMethodWithMultipleParametersWhenTheTypeIsSpecifiedInTheMatcher() {\n        val matcher = MethodMatcher.create().name(\"func\")\n                .addParameters(PlSqlType.NUMERIC, PlSqlType.CHARACTER, PlSqlType.DATE)\n        val node = getAstNodeWithArguments(\"func(x, y, z)\", NumericDatatype(), CharacterDatatype(), DateDatatype())\n        assertThat(matcher.matches(node)).isTrue\n    }\n\n    @Test\n    fun noMatchesMethodWithMultipleParametersWhenTheAnyTypeIsDifferentFromExpectation() {\n        val matcher = MethodMatcher.create().name(\"func\")\n                .addParameters(PlSqlType.NUMERIC, PlSqlType.CHARACTER, PlSqlType.DATE)\n        val node = getAstNodeWithArguments(\"func(x, y, z)\", NumericDatatype(), CharacterDatatype(), CharacterDatatype())\n        assertThat(matcher.matches(node)).isFalse\n    }\n\n    private fun getAstNodeWithArguments(text: String, vararg types: PlSqlDatatype): SemanticAstNode {\n        val node = p.parse(text).firstChild\n\n        val arguments = node.getDescendants(PlSqlGrammar.ARGUMENT)\n\n        for (i in types.indices) {\n            val actualArgument = arguments[i].firstChild\n            MethodMatcher.semantic(actualArgument).plSqlDatatype = types[i]\n        }\n\n        return node.asSemantic()\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/session/SessionControlGrammarTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.session\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.RuleTest\nimport com.felipebz.zpa.api.SessionControlGrammar\n\nclass SessionControlGrammarTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(SessionControlGrammar.SESSION_CONTROL_COMMAND)\n    }\n\n    @Test\n    fun matchesAlterSession() {\n        assertThat(p).matches(\"alter session set nls_date_format = 'dd/mm/yyyy';\")\n    }\n\n    @Test\n    fun matchesSetRole() {\n        assertThat(p).matches(\"set role foo;\")\n        assertThat(p).matches(\"set role foo, bar, baz;\")\n    }\n\n    @Test\n    fun matchesSetRoleNone() {\n        assertThat(p).matches(\"set role none;\")\n    }\n\n    @Test\n    fun matchesSetRoleAll() {\n        assertThat(p).matches(\"set role all;\")\n    }\n\n    @Test\n    fun matchesSetRoleAllExcept() {\n        assertThat(p).matches(\"set role all except foo;\")\n        assertThat(p).matches(\"set role all except foo, bar, baz;\")\n    }\n\n    @Test\n    fun matchesSetRoleWithPassword() {\n        assertThat(p).matches(\"set role foo identified by pass;\")\n        assertThat(p).matches(\"set role foo identified by pass, bar, baz;\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/sql/AnalyticClauseTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.sql\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.DmlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass AnalyticClauseTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(DmlGrammar.ANALYTIC_CLAUSE)\n    }\n\n    @Test\n    fun matchesSimpleOver() {\n        assertThat(p).matches(\"over ()\")\n    }\n\n    @Test\n    fun matchesOverPartitionBy() {\n        assertThat(p).matches(\"over (partition by foo)\")\n    }\n\n    @Test\n    fun matchesOverPartitionByWithMultipleExpressions() {\n        assertThat(p).matches(\"over (partition by foo, bar, baz)\")\n    }\n\n    @Test\n    fun matchesOverOrderBy() {\n        assertThat(p).matches(\"over (order by foo)\")\n    }\n\n    @Test\n    fun matchesOverWithWindowingUnboundedPreceding() {\n        assertThat(p).matches(\"over (order by foo rows unbounded preceding)\")\n        assertThat(p).matches(\"over (order by foo range unbounded preceding)\")\n    }\n\n    @Test\n    fun matchesOverWithWindowingCurrentRow() {\n        assertThat(p).matches(\"over (order by foo rows current row)\")\n    }\n\n    @Test\n    fun matchesOverWithWindowingExpressionPreceding() {\n        assertThat(p).matches(\"over (order by foo rows 1 preceding)\")\n    }\n\n    @Test\n    fun matchesOverWithWindowingWithBetween() {\n        assertThat(p).matches(\"over (order by foo rows between unbounded preceding and current row)\")\n    }\n\n    @Test\n    fun matchesLongAnalyticClause() {\n        assertThat(p).matches(\"over (partition by foo order by foo rows between unbounded preceding and unbounded following)\")\n    }\n\n    @Test\n    fun matchesOverPartitionByExpression() {\n        assertThat(p).matches(\"over (partition by foo + bar)\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/sql/ConnectByClauseTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.sql\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.DmlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass ConnectByClauseTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(DmlGrammar.CONNECT_BY_CLAUSE)\n    }\n\n    @Test\n    fun matchesSimpleConnectBy() {\n        assertThat(p).matches(\"connect by foo = bar\")\n    }\n\n    @Test\n    fun matchesConnectByWithPrior() {\n        assertThat(p).matches(\"connect by prior foo = bar\")\n    }\n\n    @Test\n    fun matchesConnectByWithPriorAlternative() {\n        assertThat(p).matches(\"connect by foo = prior bar\")\n    }\n\n    @Test\n    fun matchesConnectByNoCycle() {\n        assertThat(p).matches(\"connect by nocycle foo = bar\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/sql/DmlTableExpressionClauseTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.sql\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.DmlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass DmlTableExpressionClauseTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(DmlGrammar.DML_TABLE_EXPRESSION_CLAUSE)\n    }\n\n    @Test\n    fun matchesTable() {\n        assertThat(p).matches(\"tab\")\n    }\n\n    @Test\n    fun matchesTableInSchema() {\n        assertThat(p).matches(\"sch.tab\")\n    }\n\n    @Test\n    fun matchesTableWithDbLink() {\n        assertThat(p).matches(\"tab@link\")\n        assertThat(p).matches(\"tab@link.domain.com\")\n    }\n\n    @Test\n    fun matchesTableWithAlias() {\n        assertThat(p).matches(\"tab alias\")\n        assertThat(p).matches(\"tab as alias\")\n    }\n\n    @Test\n    fun matchesSubquery() {\n        assertThat(p).matches(\"(select 1 from dual)\")\n    }\n\n    @Test\n    fun matchesFunctionCall() {\n        assertThat(p).matches(\"func(var)\")\n        assertThat(p).matches(\"table(xmlsequence(x))\")\n    }\n\n    @Test\n    fun matchesNestedClause() {\n        assertThat(p).matches(\"tab nested doc columns (foo path foo) alias\")\n    }\n\n    @Test\n    fun matchesNestedClauseWithExplicitPath() {\n        assertThat(p).matches(\"tab nested path doc columns (foo path foo)\")\n    }\n\n    @Test\n    fun matchesNestedClauseWithRelativeObjectAccess() {\n        assertThat(p).matches(\"tab nested doc.c1[*].c2 columns (foo path foo)\")\n    }\n\n    @Test\n    fun matchesNestedClauseWithSimplePathAccess() {\n        assertThat(p).matches(\"tab nested doc, '$.c1[*].c2' columns (foo path foo)\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/sql/ForUpdateClauseTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.sql\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.DmlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass ForUpdateClauseTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(DmlGrammar.FOR_UPDATE_CLAUSE)\n    }\n\n    @Test\n    fun matchesSimpleForUpdate() {\n        assertThat(p).matches(\"for update\")\n    }\n\n    @Test\n    fun matchesForUpdateOfColumn() {\n        assertThat(p).matches(\"for update of col\")\n    }\n\n    @Test\n    fun matchesForUpdateOfColumnWithTable() {\n        assertThat(p).matches(\"for update of tab.col\")\n    }\n\n    @Test\n    fun matchesForUpdateOfColumnWithSchemaAndTable() {\n        assertThat(p).matches(\"for update of sch.tab.col\")\n    }\n\n    @Test\n    fun matchesForUpdateOfMultipleColumns() {\n        assertThat(p).matches(\"for update of col, col2, col3\")\n    }\n\n    @Test\n    fun matchesForUpdateNoWait() {\n        assertThat(p).matches(\"for update nowait\")\n    }\n\n    @Test\n    fun matchesForUpdateWait() {\n        assertThat(p).matches(\"for update wait 1\")\n    }\n\n    @Test\n    fun matchesForUpdateSkipLocked() {\n        assertThat(p).matches(\"for update skip locked\")\n    }\n\n    @Test\n    fun matchesLongForUpdate() {\n        assertThat(p).matches(\"for update of col skip locked\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/sql/GroupByClauseTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.sql\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.DmlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass GroupByClauseTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(DmlGrammar.GROUP_BY_CLAUSE)\n    }\n\n    @Test\n    fun matchesSimpleGroupBy() {\n        assertThat(p).matches(\"group by 1\")\n    }\n\n    @Test\n    fun matchesSimpleGroupByColumn() {\n        assertThat(p).matches(\"group by col\")\n    }\n\n    @Test\n    fun matchesSimpleGroupByExpression() {\n        assertThat(p).matches(\"group by (col) + col2\")\n    }\n\n    @Test\n    fun matchesSimpleGroupByMultipleColumn() {\n        assertThat(p).matches(\"group by col, col2\")\n    }\n\n    @Test\n    fun matchesSimpleGroupByTableColumn() {\n        assertThat(p).matches(\"group by tab.col\")\n    }\n\n    @Test\n    fun matchesSimpleGroupByTableColumnWithSchema() {\n        assertThat(p).matches(\"group by sch.tab.col\")\n    }\n\n    @Test\n    fun matchesSimpleGroupByFunctionCall() {\n        assertThat(p).matches(\"group by func(var)\")\n    }\n\n    @Test\n    fun matchesSimpleGroupByRollup() {\n        assertThat(p).matches(\"group by rollup (col)\")\n    }\n\n    @Test\n    fun matchesSimpleGroupByCube() {\n        assertThat(p).matches(\"group by cube (col)\")\n    }\n\n    @Test\n    fun matchesSimpleGroupByRollupAndCube() {\n        assertThat(p).matches(\"group by rollup (col), cube (col)\")\n    }\n\n    @Test\n    fun matchesSimpleGroupWithEmptyGroupingSets() {\n        assertThat(p).matches(\"group by grouping sets (())\")\n    }\n\n    @Test\n    fun matchesSimpleGroupWithGroupingSets() {\n        assertThat(p).matches(\"group by grouping sets (col)\")\n    }\n\n    @Test\n    fun matchesSimpleGroupWithGroupingSetsWithMultipleColumns() {\n        assertThat(p).matches(\"group by grouping sets (col, col2)\")\n    }\n\n    @Test\n    fun matchesSimpleGroupWithGroupingSetsWithMultipleOptions() {\n        assertThat(p).matches(\"group by grouping sets (col, col2, rollup (col), cube (col))\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/sql/HavingClauseTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.sql\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.DmlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass HavingClauseTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(DmlGrammar.HAVING_CLAUSE)\n    }\n\n    @Test\n    fun matchesSimpleHaving() {\n        assertThat(p).matches(\"having col > 1\")\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/sql/HierarchicalQueryClauseTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.sql\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.DmlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass HierarchicalQueryClauseTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(DmlGrammar.HIERARCHICAL_QUERY_CLAUSE)\n    }\n\n    @Test\n    fun matchesSimpleHierarchical() {\n        assertThat(p).matches(\"connect by foo = bar\")\n    }\n\n    @Test\n    fun matchesHierarchicalQueryConnectByFirst() {\n        assertThat(p).matches(\"connect by foo = bar start with foo = bar\")\n    }\n\n    @Test\n    fun matchesHierarchicalQueryStartWithFirst() {\n        assertThat(p).matches(\"start with foo = bar connect by foo = bar\")\n    }\n\n    @Test\n    fun notMatchesStartWithFirstWithoutConnectBy() {\n        assertThat(p).notMatches(\"start with foo = bar\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/sql/IntoClauseTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.sql\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.DmlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass IntoClauseTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(DmlGrammar.INTO_CLAUSE)\n    }\n\n    @Test\n    fun matchesSimpleIntoClause() {\n        assertThat(p).matches(\"into var\")\n    }\n\n    @Test\n    fun matchesIntoClauseInMultipleVariables() {\n        assertThat(p).matches(\"into var, var2\")\n    }\n\n    @Test\n    fun matchesBulkCollect() {\n        assertThat(p).matches(\"bulk collect into var\")\n    }\n\n    @Test\n    fun matchesSimpleCollectionElement() {\n        assertThat(p).matches(\"into col(1)\")\n    }\n\n    @Test\n    fun matchesSimpleIntoRecordItem() {\n        assertThat(p).matches(\"into col.it\")\n    }\n\n    @Test\n    fun matchesSimpleIntoItemInRecordCollection() {\n        assertThat(p).matches(\"into col(1).it\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/sql/JoinClauseTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.sql\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.DmlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass JoinClauseTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(DmlGrammar.JOIN_CLAUSE)\n    }\n\n    @Test\n    fun matchesSimpleJoin() {\n        assertThat(p).matches(\"foo join bar on foo.a = bar.a\")\n    }\n\n    @Test\n    fun matchesSimpleJoinInParenthesis() {\n        assertThat(p).matches(\"(foo join bar on foo.a = bar.a)\")\n    }\n\n    @Test\n    fun matchesSimpleJoinWithTableAlias() {\n        assertThat(p).matches(\"foo f join bar b on f.a = b.a\")\n    }\n\n    @Test\n    fun matchesInnerJoin() {\n        assertThat(p).matches(\"foo inner join bar on foo.a = bar.a\")\n    }\n\n    @Test\n    fun matchesInnerJoinWithTableAlias() {\n        assertThat(p).matches(\"foo f inner join bar b on f.a = b.a\")\n    }\n\n    @Test\n    fun matchesJoinWithUsing() {\n        assertThat(p).matches(\"foo join bar using (a)\")\n    }\n\n    @Test\n    fun matchesJoinWithUsingWithTableAlias() {\n        assertThat(p).matches(\"foo f join bar b using (a)\")\n    }\n\n\n    @Test\n    fun matchesInnerJoinWithUsing() {\n        assertThat(p).matches(\"foo inner join bar using (a)\")\n    }\n\n    @Test\n    fun matchesInnerJoinWithUsingWithTableAlias() {\n        assertThat(p).matches(\"foo f inner join bar n using (a)\")\n    }\n\n    @Test\n    fun matchesJoinWithUsingAndMultipleColumns() {\n        assertThat(p).matches(\"foo join bar using (a, b, c)\")\n    }\n\n    @Test\n    fun matchesCrossJoin() {\n        assertThat(p).matches(\"foo cross join bar\")\n    }\n\n    @Test\n    fun matchesCrossJoinWithTableAlias() {\n        assertThat(p).matches(\"foo f cross join ba br\")\n    }\n\n    @Test\n    fun matchesNaturalJoin() {\n        assertThat(p).matches(\"foo natural join bar\")\n    }\n\n    @Test\n    fun matchesNaturalJoinWithTableAlias() {\n        assertThat(p).matches(\"foo f natural join bar b\")\n    }\n\n    @Test\n    fun matchesNaturalInnerJoin() {\n        assertThat(p).matches(\"foo natural inner join bar\")\n    }\n\n    @Test\n    fun matchesFullJoin() {\n        assertThat(p).matches(\"foo full join bar on foo.a = bar.a\")\n    }\n\n    @Test\n    fun matchesFullJoinWithTableAlias() {\n        assertThat(p).matches(\"foo f full join bar b on f.a = b.a\")\n    }\n\n    @Test\n    fun matchesFullJoinWithUsing() {\n        assertThat(p).matches(\"foo full join bar using (a)\")\n    }\n\n    @Test\n    fun matchesFullJoinWithUsingWithTableAlias() {\n        assertThat(p).matches(\"foo f full join bar b using (a)\")\n    }\n\n    @Test\n    fun matchesFullJoinWithUsingMultipleColumns() {\n        assertThat(p).matches(\"foo full join bar using (a, b, c)\")\n    }\n\n    @Test\n    fun matchesFullOuterJoin() {\n        assertThat(p).matches(\"foo full outer join bar on foo.a = bar.a\")\n    }\n\n    @Test\n    fun matchesRightJoin() {\n        assertThat(p).matches(\"foo right join bar on foo.a = bar.a\")\n    }\n\n    @Test\n    fun matchesRightJoinWithTableAlias() {\n        assertThat(p).matches(\"foo f right join bar b on f.a = b.a\")\n    }\n\n    @Test\n    fun matchesRightOuterJoin() {\n        assertThat(p).matches(\"foo right outer join bar on foo.a = bar.a\")\n    }\n\n    @Test\n    fun matchesLeftJoin() {\n        assertThat(p).matches(\"foo left join bar on foo.a = bar.a\")\n    }\n\n    @Test\n    fun matchesLeftJoinWithTableAlias() {\n        assertThat(p).matches(\"foo f left join bar b on f.a = b.a\")\n    }\n\n    @Test\n    fun matchesLeftOuterJoin() {\n        assertThat(p).matches(\"foo left outer join bar on foo.a = bar.a\")\n    }\n\n    @Test\n    fun matchesNaturalFullJoin() {\n        assertThat(p).matches(\"foo natural full join bar\")\n    }\n\n    @Test\n    fun matchesNaturalFullOuterJoin() {\n        assertThat(p).matches(\"foo natural full outer join bar\")\n    }\n\n    @Test\n    fun matchesNaturalRightJoin() {\n        assertThat(p).matches(\"foo natural right join bar\")\n    }\n\n    @Test\n    fun matchesNaturalRightOuterJoin() {\n        assertThat(p).matches(\"foo natural right outer join bar\")\n    }\n\n    @Test\n    fun matchesNaturalLeftJoin() {\n        assertThat(p).matches(\"foo natural left join bar\")\n    }\n\n    @Test\n    fun matchesNaturalLeftOuterJoin() {\n        assertThat(p).matches(\"foo natural left outer join bar\")\n    }\n\n    @Test\n    fun matchesOuterJoinWithQueryPartition() {\n        assertThat(p).matches(\"foo partition by a, b left join bar on foo.a = bar.a\")\n        assertThat(p).matches(\"foo partition by (a, b) left join bar on foo.a = bar.a\")\n\n        assertThat(p).matches(\"foo left join bar partition by a, b on foo.a = bar.a\")\n        assertThat(p).matches(\"foo left join bar partition by (a, b) on foo.a = bar.a\")\n    }\n\n    @Test\n    fun matchesJoinSubqueryWithTable() {\n        assertThat(p).matches(\"(select a from foo) f join bar b on f.a = b.a\")\n    }\n\n    @Test\n    fun matchesJoinTableWithSubquery() {\n        assertThat(p).matches(\"foo join (select a from bar) b on foo.a = b.a\")\n    }\n\n    @Test\n    fun matchesNestedJoin() {\n        assertThat(p).matches(\"(foo join bar on foo.a = bar.a) join bar on foo.a = bar.a\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/sql/KeepClauseTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.sql\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.DmlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass KeepClauseTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(DmlGrammar.KEEP_CLAUSE)\n    }\n\n    @Test\n    fun matchesKeepFirst() {\n        assertThat(p).matches(\"keep (dense_rank first order by foo)\")\n    }\n\n    @Test\n    fun matchesKeepLast() {\n        assertThat(p).matches(\"keep (dense_rank last order by foo)\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/sql/OrderByClauseTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.sql\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.DmlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass OrderByClauseTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(DmlGrammar.ORDER_BY_CLAUSE)\n    }\n\n    @Test\n    fun matchesSimpleOrderBy() {\n        assertThat(p).matches(\"order by 1\")\n    }\n\n    @Test\n    fun matchesSimpleOrderByAsc() {\n        assertThat(p).matches(\"order by 1 asc\")\n    }\n\n    @Test\n    fun matchesSimpleOrderByDesc() {\n        assertThat(p).matches(\"order by 1 desc\")\n    }\n\n    @Test\n    fun matchesSimpleOrderByColumn() {\n        assertThat(p).matches(\"order by col\")\n    }\n\n    @Test\n    fun matchesOrderByWithMultipleValuesAndOrdering() {\n        assertThat(p).matches(\"order by col1 asc, col2 desc, col3 desc\")\n    }\n\n    @Test\n    fun matchesSimpleOrderByTableColumn() {\n        assertThat(p).matches(\"order by tab.col\")\n    }\n\n    @Test\n    fun matchesSimpleOrderByTableColumnWithSchema() {\n        assertThat(p).matches(\"order by sch.tab.col\")\n    }\n\n    @Test\n    fun matchesSimpleOrderByFunctionCall() {\n        assertThat(p).matches(\"order by func(var)\")\n    }\n\n    @Test\n    fun matchesOrderSiblingsBy() {\n        assertThat(p).matches(\"order siblings by col\")\n    }\n\n    @Test\n    fun matchesOrderByNullsFirst() {\n        assertThat(p).matches(\"order by col nulls first\")\n    }\n\n    @Test\n    fun matchesOrderByNullsLast() {\n        assertThat(p).matches(\"order by col nulls last\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/sql/PivotClauseTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.sql\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.DmlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass PivotClauseTest: RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(DmlGrammar.PIVOT_CLAUSE)\n    }\n\n    @Test\n    fun matchesSimplePivot() {\n        assertThat(p).matches(\"pivot (sum(amount) for quarter in ('q1', 'q2'))\")\n    }\n\n    @Test\n    fun matchesSimplePivotXml() {\n        assertThat(p).matches(\"pivot xml (sum(amount) for quarter in ('q1', 'q2'))\")\n    }\n\n    @Test\n    fun matchesSimplePivotWithAliases() {\n        assertThat(p).matches(\"pivot (sum(quantity_sold) as qty for region in ('north' north, 'south' south))\")\n    }\n\n    @Test\n    fun matchesSimplePivotWithAs() {\n        assertThat(p).matches(\"pivot (sum(quantity_sold) as qty for region in ('north' as north, 'south' as south))\")\n    }\n\n    @Test\n    fun matchesSimplePivotWithSeveralAggregateExpressions() {\n        assertThat(p).matches(\n            \"\"\"\n            pivot (\n              sum(amount ) as total,\n              count(*) as count\n              for quarter\n              in ('q1' as q1, 'q2' as q2, 'q3' as q3, 'q4' as q4)\n            )\n            \"\"\"\n        )\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/sql/RowLimitingClauseTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.sql\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.DmlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass RowLimitingClauseTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(DmlGrammar.ROW_LIMITING_CLAUSE)\n    }\n\n    @Test\n    fun matchesOffsetRow() {\n        assertThat(p).matches(\"offset 1 row\")\n    }\n\n    @Test\n    fun matchesOffsetRows() {\n        assertThat(p).matches(\"offset 1 rows\")\n    }\n\n    @Test\n    fun matchesOffsetAndFetchRowClause() {\n        assertThat(p).matches(\"offset 1 row fetch first 1 row only\")\n    }\n\n    @Test\n    fun matchesFetchFirstRowOnly() {\n        assertThat(p).matches(\"fetch first 1 row only\")\n    }\n\n    @Test\n    fun matchesFetchNextRowOnly() {\n        assertThat(p).matches(\"fetch next 1 row only\")\n    }\n\n    @Test\n    fun matchesFetchFirstRowWithTies() {\n        assertThat(p).matches(\"fetch first 1 row with ties\")\n    }\n\n    @Test\n    fun matchesFetchFirstPercentRowOnly() {\n        assertThat(p).matches(\"fetch first 1 percent row only\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/sql/SelectColumnTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.sql\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.DmlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass SelectColumnTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(DmlGrammar.SELECT_COLUMN)\n    }\n\n    @Test\n    fun matchesAllColumns() {\n        assertThat(p).matches(\"*\")\n    }\n\n    @Test\n    fun matchesFunctionCall() {\n        assertThat(p).matches(\"func(var)\")\n    }\n\n    @Test\n    fun matchesCount() {\n        assertThat(p).matches(\"count(*)\")\n    }\n\n    @Test\n    fun matchesColumnName() {\n        assertThat(p).matches(\"name\")\n    }\n\n    @Test\n    fun matchesTableColumn() {\n        assertThat(p).matches(\"tab.name\")\n    }\n\n    @Test\n    fun matchesAllTableColumns() {\n        assertThat(p).matches(\"tab.*\")\n    }\n\n    @Test\n    fun matchesTableColumnInDiffentSchema() {\n        assertThat(p).matches(\"sch.tab.name\")\n    }\n\n    @Test\n    fun matchesAllTableColumnInDiffentSchema() {\n        assertThat(p).matches(\"sch.tab.*\")\n    }\n\n    @Test\n    fun matchesLiterals() {\n        assertThat(p).matches(\"'x'\")\n        assertThat(p).matches(\"1\")\n        assertThat(p).matches(\"null\")\n    }\n\n    @Test\n    fun matchesSequenceCurrentValue() {\n        assertThat(p).matches(\"seq.currval\")\n    }\n\n    @Test\n    fun matchesSequenceNextValue() {\n        assertThat(p).matches(\"seq.nextval\")\n    }\n\n    @Test\n    fun matchesColumnWithAlias() {\n        assertThat(p).matches(\"null alias\")\n    }\n\n    @Test\n    fun matchesColumnWithAliasWithAsKeyword() {\n        assertThat(p).matches(\"null as alias\")\n    }\n\n    @Test\n    fun matchesSubqueryAsColumn() {\n        assertThat(p).matches(\"(select 1 from dual) col\")\n    }\n\n    @Test\n    fun matchesColumnWithConnectByRoot() {\n        assertThat(p).matches(\"connect_by_root foo\")\n        assertThat(p).matches(\"connect_by_root foo alias\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/sql/SelectExpressionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.sql\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.DmlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass SelectExpressionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(DmlGrammar.SELECT_EXPRESSION)\n    }\n\n    @Test\n    fun matchesSimpleSelect() {\n        assertThat(p).matches(\"select 1 from dual\")\n    }\n\n    @Test\n    fun matchesSimpleSelectInto() {\n        assertThat(p).matches(\"select 1 into var from dual\")\n    }\n\n    @Test\n    fun matchesSelectBulkCollectInto() {\n        assertThat(p).matches(\"select 1 bulk collect into var from dual\")\n    }\n\n    @Test\n    fun matchesSelectWithWhere() {\n        assertThat(p).matches(\"select 1 from dual where 1 = 1\")\n    }\n\n    @Test\n    fun matchesSelectWithMultipleColumns() {\n        assertThat(p).matches(\"select 1, 2 from dual\")\n    }\n\n    @Test\n    fun matchesSelectWithMultipleColumnsAndIntoClause() {\n        assertThat(p).matches(\"select 1, 2 into var1, var2 from dual\")\n    }\n\n    @Test\n    fun matchesSelectWithMultipleTables() {\n        assertThat(p).matches(\"select 1 from emp, dept\")\n    }\n\n    @Test\n    fun matchesSelectAll() {\n        assertThat(p).matches(\"select all 1 from dual\")\n    }\n\n    @Test\n    fun matchesSelectDistinct() {\n        assertThat(p).matches(\"select distinct 1 from dual\")\n    }\n\n    @Test\n    fun matchesSelectUnique() {\n        assertThat(p).matches(\"select unique 1 from dual\")\n    }\n\n    @Test\n    fun matchesSelectWithGroupBy() {\n        assertThat(p).matches(\"select 1 from dual group by 1\")\n    }\n\n    @Test\n    fun matchesSelectWithOrderBy() {\n        assertThat(p).matches(\"select 1 from dual order by 1\")\n    }\n\n    @Test\n    fun matchesSelectWithParenthesis() {\n        assertThat(p).matches(\"(select 1 from dual)\")\n    }\n\n    @Test\n    fun matchesSelectWithUnion() {\n        assertThat(p).matches(\"select 1 from dual union select 2 from dual\")\n        assertThat(p).matches(\"(select 1 from dual) union (select 2 from dual)\")\n    }\n\n    @Test\n    fun matchesSelectWithUnionAll() {\n        assertThat(p).matches(\"select 1 from dual union all select 2 from dual\")\n        assertThat(p).matches(\"(select 1 from dual) union all (select 2 from dual)\")\n    }\n\n    @Test\n    fun matchesSelectWithMinus() {\n        assertThat(p).matches(\"select 1 from dual minus select 2 from dual\")\n        assertThat(p).matches(\"(select 1 from dual) minus (select 2 from dual)\")\n    }\n\n    @Test\n    fun matchesSelectWithMinusAll() {\n        assertThat(p).matches(\"select 1 from dual minus all select 2 from dual\")\n        assertThat(p).matches(\"(select 1 from dual) minus all (select 2 from dual)\")\n    }\n\n    @Test\n    fun matchesSelectWithIntersect() {\n        assertThat(p).matches(\"select 1 from dual intersect select 2 from dual\")\n        assertThat(p).matches(\"(select 1 from dual) intersect (select 2 from dual)\")\n    }\n\n    @Test\n    fun matchesSelectWithIntersectAll() {\n        assertThat(p).matches(\"select 1 from dual intersect all select 2 from dual\")\n        assertThat(p).matches(\"(select 1 from dual) intersect all (select 2 from dual)\")\n    }\n\n    @Test\n    fun matchesSelectWithExcept() {\n        assertThat(p).matches(\"select 1 from dual except select 2 from dual\")\n        assertThat(p).matches(\"(select 1 from dual) except (select 2 from dual)\")\n    }\n\n    @Test\n    fun matchesSelectWithExceptAll() {\n        assertThat(p).matches(\"select 1 from dual except all select 2 from dual\")\n        assertThat(p).matches(\"(select 1 from dual) except all (select 2 from dual)\")\n    }\n\n    @Test\n    fun matchesSelectCountDistinct() {\n        assertThat(p).matches(\"select count(distinct foo) from dual\")\n    }\n\n    @Test\n    fun matchesSelectWithAnalyticFunction() {\n        assertThat(p).matches(\"select count(foo) over () from dual\")\n        assertThat(p).matches(\"select (count(foo) over ()) from dual\")\n        assertThat(p).matches(\"select func(count(foo) over ()) from dual\")\n    }\n\n    @Test\n    fun matchesSelectWithAnsiJoin() {\n        assertThat(p).matches(\"select 1 from foo join bar on join.id = bar.id\")\n    }\n\n    @Test\n    fun matchesSelectWithMixedJoinSyntax() {\n        assertThat(p).matches(\"select 1 from foo join bar on join.id = bar.id, baz\")\n        assertThat(p).matches(\"select 1 from baz, foo join bar on join.id = bar.id\")\n    }\n\n    @Test\n    fun matchesSelectWithSubqueryFactoring() {\n        assertThat(p).matches(\"with foo as (select id from tab) select 1 from foo join bar on join.id = bar.id\")\n    }\n\n    @Test\n    fun matchesSelectForUpdateBeforeOrderBy() {\n        assertThat(p).matches(\"select * from foo for update order by bar \")\n    }\n\n    @Test\n    fun matchesSelectForUpdateAfterOrderBy() {\n        assertThat(p).matches(\"select * from foo order by baz for update\")\n    }\n\n    @Test\n    fun matchesSelectWithParenthesisForUpdate() {\n        assertThat(p).matches(\"(select 1 from dual) for update\")\n    }\n\n    @Test\n    fun matchesSelectUsingBulkAsAnAlias() {\n        assertThat(p).matches(\"select 1 bulk into var from dual\")\n    }\n\n    @Test\n    fun matchesSelectBulkCollectUsingBulkAsAnAlias() {\n        assertThat(p).matches(\"select 1 bulk bulk collect into var from dual\")\n    }\n\n    @Test\n    fun matchesSelectWithFetchFirstRowsOnly() {\n        assertThat(p).matches(\"select 1 from dual fetch first 1 row only\")\n    }\n\n    @Test\n    fun matchesSelectWithOrderByAndFetchFirstRows() {\n        assertThat(p).matches(\"select 1 from dual order by 1 fetch first 1 row only\")\n    }\n\n    @Test\n    fun matchesSelectFromValues() {\n        assertThat(p).matches(\"select 1 from (values (1, 'foo'), (2, 'bar')) as t(a, b)\")\n    }\n\n    @Test\n    fun matchesShortSelect() {\n        assertThat(p).matches(\"select 1\")\n        assertThat(p).matches(\"select 1 into var\")\n    }\n\n    @Test\n    fun matchesShortSelectWithWhere() {\n        assertThat(p).matches(\"select 1 where 1 = 1\")\n        assertThat(p).matches(\"select 1 into var where 1 = 1\")\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/sql/StartWithClauseTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.sql\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.DmlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass StartWithClauseTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(DmlGrammar.START_WITH_CLAUSE)\n    }\n\n    @Test\n    fun matchesSimpleConnectBy() {\n        assertThat(p).matches(\"start with foo = bar\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/sql/UnpivotClauseTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.sql\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.DmlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass UnpivotClauseTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(DmlGrammar.UNPIVOT_CLAUSE)\n    }\n\n    @Test\n    fun matchesSimpleUnpivot() {\n        assertThat(p).matches(\"unpivot (amount for quarter in (q1,q2,q3))\")\n    }\n\n    @Test\n    fun matchesSimpleUnpivotWithAliases() {\n        assertThat(p).matches(\"unpivot (amount for quarter in (q1 'q1', q2 as q2, q3 as q3))\")\n    }\n\n    @Test\n    fun matchesSimpleUnpivotIncludeNulls() {\n        assertThat(p).matches(\"unpivot include nulls (amount for quarter in (q1,q2,q3))\")\n    }\n\n    @Test\n    fun matchesSimpleUnpivotExcludeNulls() {\n        assertThat(p).matches(\"unpivot exclude nulls (amount for quarter in (q1,q2,q3))\")\n    }\n\n    @Test\n    fun matchesSimpleUnpivotWithMultipleColumns() {\n        assertThat(p).matches(\n            \"\"\"\n            unpivot (\n              (amount, units)\n              for quarter\n              in (\n                (q1_amount, q1_units) as 'q1',\n                (q2_amount, q2_units) as 'q2'\n              )\n            )\n            \"\"\"\n        )\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/sql/WhereClauseTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.sql\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.DmlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass WhereClauseTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(DmlGrammar.WHERE_CLAUSE)\n    }\n\n    @Test\n    fun matchesSimpleWhere() {\n        assertThat(p).matches(\"where 1 = 1\")\n    }\n\n    @Test\n    fun matchesColumnComparation() {\n        assertThat(p).matches(\"where tab.col = tab2.col2\")\n    }\n\n    @Test\n    fun matchesMultipleColumnComparation() {\n        assertThat(p).matches(\"where tab.col = tab2.col2 and tab.col = tab2.col2\")\n    }\n\n    @Test\n    fun matchesComparationWithSubquery() {\n        assertThat(p).matches(\"where tab.col = (select 1 from dual)\")\n    }\n\n    @Test\n    fun matchesOuterJoin() {\n        assertThat(p).matches(\"where tab.col(+) = tab2.col2\")\n    }\n\n    @Test\n    fun matchesTupleInSelect() {\n        assertThat(p).matches(\"where (foo, bar, baz) in (select 1, 2, 3 from dual)\")\n    }\n\n    @Test\n    fun matchesTupleInValues() {\n        assertThat(p).matches(\"where (foo, bar) in ((1, 2), (2, 3))\")\n    }\n\n    @Test\n    fun matchesExists() {\n        assertThat(p).matches(\"where exists (select 1 from dual)\")\n    }\n\n    @Test\n    fun matchesExistsWithUnionInSubquery() {\n        assertThat(p).matches(\"where exists ((select 1 from dual) union (select 2 from dual))\")\n    }\n\n    @Test\n    fun matchesNotExists() {\n        assertThat(p).matches(\"where not exists (select 1 from dual)\")\n    }\n\n    @Test\n    fun matchesAny() {\n        assertThat(p).matches(\"where data = any (select 1,2,3 from dual)\")\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/sql/WithClauseTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.sql\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.DmlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass WithClauseTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(DmlGrammar.WITH_CLAUSE)\n    }\n\n    @Test\n    fun matchesSimpleWith() {\n        assertThat(p).matches(\"with q as (select 1 from dual)\")\n    }\n\n    @Test\n    fun matchesMultipleSubqueries() {\n        assertThat(p).matches(\"with q as (select 1 from dual), q2 as (select 1 from dual)\")\n    }\n\n    @Test\n    fun matchesRecursiveSimple() {\n        assertThat(p).matches(\"with q(id, parent) as (select 1 from dual)\")\n    }\n\n    @Test\n    fun matchesRecursiveWithSearch() {\n        assertThat(p).matches(\"with q(id, parent) as (select 1 from dual) search depth first by a set order1\")\n    }\n\n    @Test\n    fun matchesRecursiveWithSearchAndCycle() {\n        assertThat(p).matches(\"with q(id, parent) as (select 1 from dual) search depth first by a set order1 cycle id set cycle to 1 default 0\")\n    }\n\n    @Test\n    fun matchesWithValues() {\n        assertThat(p).matches(\"with q(a, b) as (values (1, 'foo'), (2, 'bar')) as t(a, b)\")\n    }\n\n    @Test\n    fun matchesFunctionDeclaration() {\n        assertThat(p).matches(\"with function func return number is begin return 1; end;\")\n    }\n\n    @Test\n    fun matchesProcedureDeclaration() {\n        assertThat(p).matches(\"with procedure proc is begin null; end;\")\n    }\n\n    @Test\n    fun matchesFunctionAndProcedureDeclaration() {\n        assertThat(p).matches(\"with function func return number is begin return 1; end; \" +\n            \"procedure proc is begin null; end;\")\n    }\n\n    @Test\n    fun matchesFunctionDeclarationAndQuery() {\n        assertThat(p).matches(\"with function func return number is begin return 1; end; \" +\n            \"q as (select 1 from dual)\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/statements/AssignmentStatementTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.statements\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass AssignmentStatementTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.ASSIGNMENT_STATEMENT)\n    }\n\n    @Test\n    fun assignmentToVariable() {\n        assertThat(p).matches(\"var := 1;\")\n    }\n\n    @Test\n    fun assignmentToRecordAttribute() {\n        assertThat(p).matches(\"rec.attribute := 1;\")\n    }\n\n    @Test\n    fun assignmentToCollectionElement() {\n        assertThat(p).matches(\"collection(1) := 1;\")\n    }\n\n    @Test\n    fun assignmentToItemInRecordCollection() {\n        assertThat(p).matches(\"collection(1).field := 1;\")\n    }\n\n    @Test\n    fun assignmentToHostVariable() {\n        assertThat(p).matches(\":var := 1;\")\n    }\n\n    @Test\n    fun assignmentToIndicatorVariable() {\n        assertThat(p).matches(\":var:indicator := 1;\")\n    }\n\n    @Test\n    fun matchesLabeledAssignment() {\n        assertThat(p).matches(\"<<foo>> var := 1;\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/statements/BlockStatementTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.statements\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass BlockStatementTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.BLOCK_STATEMENT)\n    }\n\n    @Test\n    fun matchesSimpleBlock() {\n        assertThat(p).matches(\"begin null; end;\")\n        assertThat(p).matches(\"BEGIN NULL; END;\")\n    }\n\n    @Test\n    fun matchesNestedBlock() {\n        assertThat(p).matches(\"begin begin null; end; end;\")\n    }\n\n    @Test\n    fun matchesBlockWithMultipleStatements() {\n        assertThat(p).matches(\"begin null; null; end;\")\n    }\n\n    @Test\n    fun matchesBlockWithOneExceptionHandler() {\n        assertThat(p).matches(\"begin null; exception when others then null; end;\")\n    }\n\n    @Test\n    fun matchesBlockWithMultipleExceptionHandler() {\n        assertThat(p).matches(\"begin null; exception when others then null; when others then null; end;\")\n    }\n\n    @Test\n    fun matchesBlockWithOneExceptionHandlerAndMultipleExceptions() {\n        assertThat(p).matches(\"begin null; exception when no_data_found or too_many_rows then null; end;\")\n    }\n\n    @Test\n    fun matchesBlockWithNameAtEnd() {\n        assertThat(p).matches(\"begin null; end block_name;\")\n    }\n\n    @Test\n    fun matchesBlockWithDeclareSection() {\n        assertThat(p).matches(\"declare var number; begin null; end block_name;\")\n    }\n\n    @Test\n    fun matchesBlockWithDeclareSectionWithoutDeclarations() {\n        assertThat(p).matches(\"declare begin null; end block_name;\")\n    }\n\n    @Test\n    fun notMatchesBlockWithoutStatements() {\n        assertThat(p).notMatches(\"begin end;\")\n    }\n\n    @Test\n    fun notMatchesBlockWithIncompleteExceptionHandler() {\n        assertThat(p).notMatches(\"begin null; exception end;\")\n    }\n\n    @Test\n    fun matchesLabeledBlock() {\n        assertThat(p).matches(\"<<foo>> begin null; end foo;\")\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/statements/CaseStatementTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.statements\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass CaseStatementTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.CASE_STATEMENT)\n    }\n\n    @Test\n    fun matchesSimpleSearchedCase() {\n        assertThat(p).matches(\"case when x = 1 then foo := bar; end case;\")\n    }\n\n    @Test\n    fun matchesSimpleCase() {\n        assertThat(p).matches(\"case x when 1 then foo := bar; end case;\")\n    }\n\n    @Test\n    fun matchesCaseWithMultipleWhen() {\n        assertThat(p).matches(\"case x when 1 then foo := bar; when 2 then foo := bar; end case;\")\n    }\n\n    @Test\n    fun matchesCaseWithElse() {\n        assertThat(p).matches(\"case x when 1 then foo := bar; else foo := bar; end case;\")\n    }\n\n    @Test\n    fun matchesCaseWithMultipleStataments() {\n        assertThat(p).matches(\"case when x = 1 then foo := bar; bar := baz; end case;\")\n    }\n\n    @Test\n    fun matchesCaseWithMemberIdentifier() {\n        assertThat(p).matches(\"case foo.bar when 1 then foo := bar; end case;\")\n    }\n\n    @Test\n    fun matchesLabeledCase() {\n        assertThat(p).matches(\"<<foo>> case when x = 1 then foo := bar; end case foo;\")\n    }\n\n    @Test\n    fun matchesCaseWithSelectorExpression() {\n        assertThat(p).matches(\"case foo + bar when 1 then foo := bar; end case;\")\n    }\n\n    @Test\n    fun matchesBooleanExpressionSearchedCase() {\n        assertThat(p).matches(\"case when foo is not null and bar is null then foo := bar; end case;\")\n    }\n\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/statements/CloseStatementTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.statements\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass CloseStatementTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.CLOSE_STATEMENT)\n    }\n\n    @Test\n    fun matchesSimpleClose() {\n        assertThat(p).matches(\"close foo;\")\n    }\n\n    @Test\n    fun matchesCloseCursorInPackage() {\n        assertThat(p).matches(\"close pack.foo;\")\n    }\n\n    @Test\n    fun matchesSimpleCloseHostCursor() {\n        assertThat(p).matches(\"close :foo;\")\n    }\n\n    @Test\n    fun matchesLabeledClose() {\n        assertThat(p).matches(\"<<foo>> close foo;\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/statements/CommitStatementTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.statements\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass CommitStatementTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.COMMIT_STATEMENT)\n    }\n\n    @Test\n    fun matchesSimpleCommit() {\n        assertThat(p).matches(\"commit;\")\n    }\n\n    @Test\n    fun matchesCommitWork() {\n        assertThat(p).matches(\"commit work;\")\n    }\n\n    @Test\n    fun matchesCommitForce() {\n        assertThat(p).matches(\"commit force 'test';\")\n    }\n\n    @Test\n    fun matchesCommitForceWithScn() {\n        assertThat(p).matches(\"commit force 'test',1;\")\n    }\n\n    @Test\n    fun matchesCommitWithComment() {\n        assertThat(p).matches(\"commit comment 'test';\")\n    }\n\n    @Test\n    fun matchesCommitWrite() {\n        assertThat(p).matches(\"commit write;\")\n    }\n\n    @Test\n    fun matchesCommitWriteImmediate() {\n        assertThat(p).matches(\"commit write immediate;\")\n    }\n\n    @Test\n    fun matchesCommitWriteBatch() {\n        assertThat(p).matches(\"commit write batch;\")\n    }\n\n    @Test\n    fun matchesCommitWriteWait() {\n        assertThat(p).matches(\"commit write wait;\")\n    }\n\n    @Test\n    fun matchesCommitWriteNoWait() {\n        assertThat(p).matches(\"commit write nowait;\")\n    }\n\n    @Test\n    fun matchesLongCommitStatement() {\n        assertThat(p).matches(\"commit work comment 'teste' write immediate wait;\")\n    }\n\n    @Test\n    fun matchesLabeledCommit() {\n        assertThat(p).matches(\"<<foo>> commit;\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/statements/ContinueStatementTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.statements\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass ContinueStatementTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.CONTINUE_STATEMENT)\n    }\n\n    @Test\n    fun matchesContinue() {\n        assertThat(p).matches(\"continue;\")\n    }\n\n    @Test\n    fun matchesContinueFromLabel() {\n        assertThat(p).matches(\"continue foo;\")\n    }\n\n    @Test\n    fun matchesContinueWhen() {\n        assertThat(p).matches(\"continue when true;\")\n    }\n\n    @Test\n    fun matchesLabeledContinue() {\n        assertThat(p).matches(\"<<foo>> continue;\")\n    }\n\n    @Test\n    fun matchesLongContinue() {\n        assertThat(p).matches(\"continue foo when true;\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/statements/DeleteStatementTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.statements\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass DeleteStatementTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.DELETE_STATEMENT)\n    }\n\n    @Test\n    fun matchesSimpleDelete() {\n        assertThat(p).matches(\"delete tab;\")\n    }\n\n    @Test\n    fun matchesDeleteFrom() {\n        assertThat(p).matches(\"delete from tab;\")\n    }\n\n    @Test\n    fun matchesDeleteWithWhere() {\n        assertThat(p).matches(\"delete from tab where x = 1;\")\n    }\n\n    @Test\n    fun matchesDeleteWithAlias() {\n        assertThat(p).matches(\"delete tab t;\")\n    }\n\n    @Test\n    fun matchesDeleteWithSchema() {\n        assertThat(p).matches(\"delete sch.tab;\")\n    }\n\n    @Test\n    fun matchesDeleteCurrentOf() {\n        assertThat(p).matches(\"delete tab where current of cur;\")\n    }\n\n    @Test\n    fun matchesLabeledDelete() {\n        assertThat(p).matches(\"<<foo>> delete tab;\")\n    }\n\n    @Test\n    fun matchesDeleteFromQuery() {\n        assertThat(p).matches(\"delete (select * from dual);\")\n    }\n\n    @Test\n    fun matchesDeleteWithReturningInto() {\n        assertThat(p).matches(\"delete from tab returning x bulk collect into y;\")\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/statements/ExecuteImmediateStatementTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.statements\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass ExecuteImmediateStatementTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXECUTE_IMMEDIATE_STATEMENT)\n    }\n\n    @Test\n    fun matchesSimpleExecuteImmediate() {\n        assertThat(p).matches(\"execute immediate 'command';\")\n    }\n\n    @Test\n    fun matchesExecuteImmediateIntoVariable() {\n        assertThat(p).matches(\"execute immediate 'command' into var;\")\n    }\n\n    @Test\n    fun matchesExecuteImmediateIntoRecord() {\n        assertThat(p).matches(\"execute immediate 'command' into rec.field;\")\n    }\n\n    @Test\n    fun matchesExecuteImmediateIntoField() {\n        assertThat(p).matches(\"execute immediate 'command' into tab(i).field;\")\n    }\n\n    @Test\n    fun matchesExecuteImmediateBulkCollectIntoVariable() {\n        assertThat(p).matches(\"execute immediate 'command' bulk collect into var;\")\n    }\n\n    @Test\n    fun matchesExecuteImmediateIntoMultipleVariables() {\n        assertThat(p).matches(\"execute immediate 'command' into var, var2;\")\n    }\n\n    @Test\n    fun matchesExecuteImmediateBulkCollectIntoMultipleVariables() {\n        assertThat(p).matches(\"execute immediate 'command' bulk collect into var, var2;\")\n    }\n\n    @Test\n    fun matchesExecuteImmediateUsingWithVariable() {\n        assertThat(p).matches(\"execute immediate 'command' using var;\")\n    }\n\n    @Test\n    fun matchesExecuteImmediateUsingWithMultipleVariables() {\n        assertThat(p).matches(\"execute immediate 'command' using var, var2;\")\n    }\n\n    @Test\n    fun matchesExecuteImmediateUsingWithExplicitInVariable() {\n        assertThat(p).matches(\"execute immediate 'command' using in var;\")\n    }\n\n    @Test\n    fun matchesExecuteImmediateUsingWithOutVariable() {\n        assertThat(p).matches(\"execute immediate 'command' using out var;\")\n    }\n\n    @Test\n    fun matchesExecuteImmediateUsingWithInOutVariable() {\n        assertThat(p).matches(\"execute immediate 'command' using in out var;\")\n    }\n\n    @Test\n    fun matchesLabeledExecuteImmediate() {\n        assertThat(p).matches(\"<<label>> execute immediate 'command';\")\n    }\n\n    @Test\n    fun matchesExecuteImmediateWithReturning() {\n        assertThat(p).matches(\"execute immediate 'command' returning into foo;\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/statements/ExitStatementTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.statements\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass ExitStatementTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.EXIT_STATEMENT)\n    }\n\n    @Test\n    fun matchesExit() {\n        assertThat(p).matches(\"exit;\")\n    }\n\n    @Test\n    fun matchesExitFromLabel() {\n        assertThat(p).matches(\"exit foo;\")\n    }\n\n    @Test\n    fun matchesExitWhen() {\n        assertThat(p).matches(\"exit when true;\")\n    }\n\n    @Test\n    fun matchesLabeledExit() {\n        assertThat(p).matches(\"<<foo>> exit;\")\n    }\n\n    @Test\n    fun matchesLongExit() {\n        assertThat(p).matches(\"exit foo when true;\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/statements/FetchStatementTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.statements\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass FetchStatementTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.FETCH_STATEMENT)\n    }\n\n    @Test\n    fun matchesSimpleFetchInto() {\n        assertThat(p).matches(\"fetch foo into bar;\")\n    }\n\n    @Test\n    fun matchesFetchCursorInPackage() {\n        assertThat(p).matches(\"fetch pack.foo into bar;\")\n    }\n\n    @Test\n    fun matchesFetchHostCursorInto() {\n        assertThat(p).matches(\"fetch :foo into bar;\")\n    }\n\n    @Test\n    fun matchesFetchIntoMultipleVariables() {\n        assertThat(p).matches(\"fetch foo into bar, baz;\")\n    }\n\n    @Test\n    fun matchesSimpleFetchBulkCollectInto() {\n        assertThat(p).matches(\"fetch foo bulk collect into bar;\")\n    }\n\n    @Test\n    fun matchesFetchHostCursorBulkCollectInto() {\n        assertThat(p).matches(\"fetch :foo bulk collect into bar;\")\n    }\n\n    @Test\n    fun matchesFetchBulkCollectIntoMultipleVariables() {\n        assertThat(p).matches(\"fetch foo bulk collect into bar, baz;\")\n    }\n\n    @Test\n    fun matchesSimpleFetchBulkCollectIntoHostVariable() {\n        assertThat(p).matches(\"fetch foo bulk collect into :bar;\")\n    }\n\n    @Test\n    fun matchesSimpleFetchBulkCollectIntoWithLimit() {\n        assertThat(p).matches(\"fetch foo bulk collect into bar limit 10;\")\n    }\n\n    @Test\n    fun matchesLabeledFetchInto() {\n        assertThat(p).matches(\"<<foo>> fetch foo into bar;\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/statements/ForStatementTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.statements\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass ForStatementTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.FOR_STATEMENT)\n    }\n\n    @Test\n    fun matchesForLoop() {\n        assertThat(p).matches(\"\"\n                + \"for i in 1..2 loop \"\n                + \"null; \"\n                + \"end loop;\")\n    }\n\n    @Test\n    fun matchesReverseForLoop() {\n        assertThat(p).matches(\"\"\n                + \"for i in reverse 1..2 loop \"\n                + \"null; \"\n                + \"end loop;\")\n    }\n\n    @Test\n    fun matchesForInCursor() {\n        assertThat(p).matches(\"\"\n                + \"for i in cur loop \"\n                + \"null; \"\n                + \"end loop;\")\n    }\n\n    @Test\n    fun matchesForInCursorWithPackage() {\n        assertThat(p).matches(\"\"\n                + \"for i in pack.cur loop \"\n                + \"null; \"\n                + \"end loop;\")\n    }\n\n    @Test\n    fun matchesForInCursorWithPackageAndSchema() {\n        assertThat(p).matches(\"\"\n                + \"for i in sch.pack.cur loop \"\n                + \"null; \"\n                + \"end loop;\")\n    }\n\n    @Test\n    fun matchesForInCursorWithParameters() {\n        assertThat(p).matches(\"\"\n                + \"for i in cur(x) loop \"\n                + \"null; \"\n                + \"end loop;\")\n    }\n\n    @Test\n    fun matchesForInCursorWithMultipleParameters() {\n        assertThat(p).matches(\"\"\n                + \"for i in cur(x, y) loop \"\n                + \"null; \"\n                + \"end loop;\")\n    }\n\n    @Test\n    fun matchesForInCursorWithExplicitParameters() {\n        assertThat(p).matches(\"\"\n                + \"for i in cur(p1 => x) loop \"\n                + \"null; \"\n                + \"end loop;\")\n    }\n\n    @Test\n    fun matchesForInQuery() {\n        assertThat(p).matches(\"\"\n            + \"for i in (select col from tab) loop \"\n            + \"null; \"\n            + \"end loop;\")\n    }\n\n    @Test\n    fun matchesNestedForLoop() {\n        assertThat(p).matches(\"\"\n                + \"for i in 1..2 loop \"\n                + \"for i in 1..2 loop \"\n                + \"null; \"\n                + \"end loop; \"\n                + \"end loop;\")\n    }\n\n    @Test\n    fun matchesForLoopWithExpressionInBothSides() {\n        assertThat(p).matches(\"\"\n                + \"for i in 1 + 1 .. 2 + 2 loop \"\n                + \"null; \"\n                + \"end loop;\")\n    }\n\n    @Test\n    fun matchesLabeledForLoop() {\n        assertThat(p).matches(\"\"\n                + \"<<foo>> for i in 1..2 loop \"\n                + \"null; \"\n                + \"end loop foo;\")\n    }\n\n    @Test\n    fun matchesForLoopWithIncrement() {\n        assertThat(p).matches(\"\"\n            + \"for i in 1..2 by 2 loop \"\n            + \"null; \"\n            + \"end loop;\")\n    }\n\n    @Test\n    fun matchesForLoopWithFloatIncrement() {\n        assertThat(p).matches(\"\"\n            + \"for i in 1..2 by 0.2 loop \"\n            + \"null; \"\n            + \"end loop;\")\n    }\n\n    @Test\n    fun matchesReverseForLoopWithIncrement() {\n        assertThat(p).matches(\"\"\n            + \"for i in reverse 1..2 by 0.2 loop \"\n            + \"null; \"\n            + \"end loop;\")\n    }\n\n    @Test\n    fun matchesForLoopWithExplicitDatatype() {\n        assertThat(p).matches(\"\"\n            + \"for i number in 1..2 loop \"\n            + \"null; \"\n            + \"end loop;\")\n    }\n\n    @Test\n    fun matchesForLoopWithSkipCondition() {\n        assertThat(p).matches(\"\"\n            + \"for i in 1..10 when val <> 5 loop \"\n            + \"null; \"\n            + \"end loop;\")\n    }\n\n    @Test\n    fun matchesForLoopWithMutipleIterationControl() {\n        assertThat(p).matches(\"\"\n            + \"for i in 1, i * 2 loop \"\n            + \"null; \"\n            + \"end loop;\")\n    }\n\n    @Test\n    fun matchesForLoopWithRepeatExpression() {\n        assertThat(p).matches(\"\"\n            + \"for i in 1, repeat i * 2 while i < 100 loop \"\n            + \"null; \"\n            + \"end loop;\")\n    }\n\n    @Test\n    fun matchesForLoopWithMutableVariable() {\n        assertThat(p).matches(\"\"\n            + \"for i mutable in 1..10 loop \"\n            + \"null; \"\n            + \"end loop;\")\n    }\n\n    @Test\n    fun matchesForLoopWithMutableVariableAndExplicitDatatype() {\n        assertThat(p).matches(\"\"\n            + \"for i mutable number(2) in 1..10 loop \"\n            + \"null; \"\n            + \"end loop;\")\n    }\n\n    @Test\n    fun matchesForLoopIndicesOf() {\n        assertThat(p).matches(\"\"\n            + \"for i in indices of arr loop \"\n            + \"null; \"\n            + \"end loop;\")\n    }\n\n    @Test\n    fun matchesForLoopValuesOf() {\n        assertThat(p).matches(\"\"\n            + \"for i in values of arr loop \"\n            + \"null; \"\n            + \"end loop;\")\n    }\n\n    @Test\n    fun matchesForLoopPairsOf() {\n        assertThat(p).matches(\"\"\n            + \"for i, val in pairs of arr loop \"\n            + \"null; \"\n            + \"end loop;\")\n    }\n\n    @Test\n    fun matchesForLoopWithExecuteImmediate() {\n        assertThat(p).matches(\"\"\n            + \"for i in (execute immediate 'select col from tab') loop \"\n            + \"null; \"\n            + \"end loop;\")\n    }\n\n    @Test\n    fun matchesComplexForLoop() {\n        assertThat(p).matches(\"\"\n            + \"for i in reverse 1..3,\" +\n            \"      repeat i*2 while i <= 8,\" +\n            \"      indices of arr loop \"\n            + \"null; \"\n            + \"end loop;\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/statements/ForallStatementTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.statements\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass ForallStatementTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.FORALL_STATEMENT)\n    }\n\n    @Test\n    fun matchesForallWithFixedRangeInsert() {\n        assertThat(p).matches(\"forall foo in 1 .. 2 insert into tab values (var(foo).value);\")\n    }\n\n    @Test\n    fun matchesForallWithFixedRangeUpdate() {\n        assertThat(p).matches(\"forall foo in 1 .. 2 update tab set value = var(foo).value;\")\n    }\n\n    @Test\n    fun matchesForallWithFixedRangeDelete() {\n        assertThat(p).matches(\"forall foo in 1 .. 2 delete tab where value = var(foo).value;\")\n    }\n\n    @Test\n    fun matchesForallWithFixedRangeMerge() {\n        assertThat(p).matches(\"forall foo in 1 .. 2 merge into dest_tab \" +\n            \"using source_tab on (1 = 2) \" +\n            \"when matched then update set col = val \" +\n            \"when not matched then insert values (val);\")\n    }\n\n    @Test\n    fun matchesForallWithFixedRangeExecuteImmediate() {\n        assertThat(p).matches(\"forall foo in 1 .. 2 execute immediate 'insert into tab values (:1)' \" +\n            \"using var(foo).value;\")\n    }\n\n    @Test\n    fun matchesForallWithVariablesRange() {\n        assertThat(p).matches(\"forall x in foo .. bar.count insert into tab values (var(foo).value);\")\n    }\n\n    @Test\n    fun matchesForallIndicesOf() {\n        assertThat(p).matches(\"forall foo in indices of bar insert into tab values (var(foo).value);\")\n    }\n\n    @Test\n    fun matchesForallIndicesOfWithRange() {\n        assertThat(p).matches(\"forall foo in indices of bar between 1 and 2 insert into tab values (var(foo).value);\")\n    }\n\n    @Test\n    fun matchesForallValuesOf() {\n        assertThat(p).matches(\"forall foo in values of bar insert into tab values (var(foo).value);\")\n    }\n\n    @Test\n    fun matchesForallValuesWithSaveExceptions() {\n        assertThat(p).matches(\"forall foo in values of bar save exceptions insert into tab values (var(foo).value);\")\n    }\n\n    @Test\n    fun matchesForallIndicesWithSaveExceptions() {\n        assertThat(p).matches(\"forall foo in indices of bar between 1 and 2 save exceptions insert into tab values (var(foo).value);\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/statements/GotoStatementTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.statements\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass GotoStatementTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.GOTO_STATEMENT)\n    }\n\n    @Test\n    fun matchesGoto() {\n        assertThat(p).matches(\"goto foo;\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/statements/IfStatementTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.statements\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass IfStatementTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.IF_STATEMENT)\n    }\n\n    @Test\n    fun matchesSimpleIf() {\n        assertThat(p).matches(\"\"\n                + \"if true then \"\n                + \"null; \"\n                + \"end if;\")\n    }\n\n    @Test\n    fun matchesIfWithElsif() {\n        assertThat(p).matches(\"\"\n                + \"if true then \"\n                + \"null; \"\n                + \"elsif true then \"\n                + \"null; \"\n                + \"end if;\")\n    }\n\n    @Test\n    fun matchesIfWithMultipleElsif() {\n        assertThat(p).matches(\"\"\n                + \"if true then \"\n                + \"null; \"\n                + \"elsif true then \"\n                + \"null; \"\n                + \"elsif true then \"\n                + \"null; \"\n                + \"end if;\")\n    }\n\n    @Test\n    fun matchesIfWithElse() {\n        assertThat(p).matches(\"\"\n                + \"if true then \"\n                + \"null; \"\n                + \"else \"\n                + \"null; \"\n                + \"end if;\")\n    }\n\n    @Test\n    fun matchesIfWithElsifAndElse() {\n        assertThat(p).matches(\"\"\n                + \"if true then \"\n                + \"null; \"\n                + \"elsif true then \"\n                + \"null; \"\n                + \"else \"\n                + \"null; \"\n                + \"end if;\")\n    }\n\n    @Test\n    fun matchesNestedIf() {\n        assertThat(p).matches(\"\"\n                + \"if true then \"\n                + \"if true then \"\n                + \"null; \"\n                + \"end if;\"\n                + \"end if;\")\n    }\n\n    @Test\n    fun matchesLabeledIf() {\n        assertThat(p).matches(\"\"\n                + \"<<foo>> if true then \"\n                + \"null; \"\n                + \"end if foo;\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/statements/InlinePragmaStatementTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.statements\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass InlinePragmaStatementTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.INLINE_PRAGMA_STATEMENT)\n    }\n\n    @Test\n    fun matchesInlinePragma() {\n        assertThat(p).matches(\"pragma inline (foo, 'YES');\")\n        assertThat(p).matches(\"pragma inline (foo, 'NO');\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/statements/InsertStatementTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.statements\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass InsertStatementTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.INSERT_STATEMENT)\n    }\n\n    @Test\n    fun matchesSimpleInsert() {\n        assertThat(p).matches(\"insert into tab values (1);\")\n    }\n\n    @Test\n    fun matchesInsertWithTableAlias() {\n        assertThat(p).matches(\"insert into tab t values (1);\")\n    }\n\n    @Test\n    fun matchesInsertWithExplicitColumn() {\n        assertThat(p).matches(\"insert into tab (x) values (1);\")\n    }\n\n    @Test\n    fun matchesInsertWithExplicitColumnAlternative() {\n        assertThat(p).matches(\"insert into tab (tab.x) values (1);\")\n    }\n\n    @Test\n    fun matchesInsertMultipleColumns() {\n        assertThat(p).matches(\"insert into tab (x, y) values (1, 2);\")\n    }\n\n    @Test\n    fun matchesInsertWithSubquery() {\n        assertThat(p).matches(\"insert into tab (select 1, 2 from dual);\")\n    }\n\n    @Test\n    fun matchesInsertWithSubqueryInColumns() {\n        assertThat(p).matches(\"insert into tab (x, y) (select 1, 2 from dual);\")\n    }\n\n    @Test\n    fun matchesInsertWithSchema() {\n        assertThat(p).matches(\"insert into sch.tab values (1);\")\n    }\n\n    @Test\n    fun matchesInsertRecord() {\n        assertThat(p).matches(\"insert into tab values foo;\")\n    }\n\n    @Test\n    fun matchesLabeledInsert() {\n        assertThat(p).matches(\"<<foo>> insert into tab values (1);\")\n    }\n\n    @Test\n    fun matchesInsertWithReturningInto() {\n        assertThat(p).matches(\"insert into tab (x) values (1) returning x*2 into y;\")\n    }\n\n    @Test\n    fun matchesSimpleInsertInQuery() {\n        assertThat(p).matches(\"insert into (select x from tab) values (1);\")\n    }\n\n    @Test\n    fun matchesMultiTableInsert() {\n        assertThat(p).matches(\"insert all into tab (x) values (y) into tab (x) values (y) select 1 y from dual;\")\n    }\n\n    @Test\n    fun matchesMultiTableConditionalInsert() {\n        assertThat(p).matches(\"insert all \" +\n            \"when y < 0 then into tab (x) values (y) \" +\n            \"when y > 0 then into tab (x) values (y) \" +\n            \"else into tab (x) values (y) \" +\n            \"select 1 y from dual;\")\n    }\n\n    @Test\n    fun matchesSimpleWithErrorLoggingClause() {\n        assertThat(p).matches(\"insert into tab select 1, 2 from dual log errors into errlog ('oops');\")\n    }\n\n    @Test\n    fun matchesInsertThe() {\n        assertThat(p).matches(\"insert into the(select x from tab) values (1);\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/statements/LoopStatementTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.statements\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass LoopStatementTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.LOOP_STATEMENT)\n    }\n\n    @Test\n    fun matchesSimpleLoop() {\n        assertThat(p).matches(\"\"\n                + \"loop \"\n                + \"null; \"\n                + \"end loop;\")\n    }\n\n    @Test\n    fun matchesNestedLoop() {\n        assertThat(p).matches(\"\"\n                + \"loop \"\n                + \"loop \"\n                + \"null; \"\n                + \"end loop; \"\n                + \"end loop;\")\n    }\n\n    @Test\n    fun matchesLabeledLoop() {\n        assertThat(p).matches(\"\"\n                + \"<<foo>> loop \"\n                + \"null; \"\n                + \"end loop foo;\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/statements/MergeStatementTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.statements\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass MergeStatementTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.MERGE_STATEMENT)\n    }\n\n    @Test\n    fun matchesMergeSimpleMerge() {\n        assertThat(p).matches(\"merge into dest_tab \"\n                + \"using source_tab on (1 = 2) \"\n                + \"when matched then update set col = val \"\n                + \"when not matched then insert values (val);\")\n    }\n\n    @Test\n    fun matchesMergeValuesWithRecord() {\n        assertThat(p).matches(\"merge into dest_tab \"\n                + \"using source_tab on (1 = 2) \"\n                + \"when matched then update set col = val \"\n                + \"when not matched then insert values rec;\")\n    }\n\n    @Test\n    fun matchesMergeWithInsertFirst() {\n        assertThat(p).matches(\"merge into dest_tab \"\n                + \"using source_tab on (1 = 2) \"\n                + \"when not matched then insert values (val)\"\n                + \"when matched then update set col = val ;\")\n    }\n\n    @Test\n    fun matchesMergeSimpleMergeWithSourceTableAlias() {\n        assertThat(p).matches(\"merge into dest_tab foo \"\n                + \"using source_tab on (1 = 2) \"\n                + \"when matched then update set col = val \"\n                + \"when not matched then insert values (val);\")\n    }\n\n    @Test\n    fun matchesMergeUsingSubquery() {\n        assertThat(p).matches(\"merge into dest_tab \"\n                + \"using (select val from source_tab) on (dest_tab.val = source_tab.val) \"\n                + \"when matched then update set col = val \"\n                + \"when not matched then insert values (val);\")\n    }\n\n    @Test\n    fun matchesMergeUpdatingMultipleColumns() {\n        assertThat(p).matches(\"merge into dest_tab \"\n                + \"using source_tab on (1 = 2) \"\n                + \"when matched then update set col1 = val1, col2 = val2, col3 = val3 \"\n                + \"when not matched then insert values (val);\")\n    }\n\n    @Test\n    fun matchesMergeInsertingMultipleValues() {\n        assertThat(p).matches(\"merge into dest_tab \"\n                + \"using source_tab on (1 = 2) \"\n                + \"when matched then update set col = val \"\n                + \"when not matched then insert values (foo, bar, baz);\")\n    }\n\n    @Test\n    fun matchesMergeWithoutMatchedClause() {\n        assertThat(p).matches(\"merge into dest_tab \"\n                + \"using source_tab on (1 = 2) \"\n                + \"when not matched then insert values (val);\")\n    }\n\n    @Test\n    fun matchesMergeWithoutNotMatchedClause() {\n        assertThat(p).matches(\"merge into dest_tab \"\n                + \"using source_tab on (1 = 2) \"\n                + \"when matched then update set col = val;\")\n    }\n\n    @Test\n    fun matchesMergeWithConditionalInsert() {\n        assertThat(p).matches(\"merge into dest_tab \"\n                + \"using source_tab on (1 = 2) \"\n                + \"when matched then update set col = val \"\n                + \"when not matched then insert values (val) where 3 = 4;\")\n    }\n\n    @Test\n    fun matchesMergeWithConditionalUpdate() {\n        assertThat(p).matches(\"merge into dest_tab \"\n                + \"using source_tab on (1 = 2) \"\n                + \"when matched then update set col = val where 3 = 4 \"\n                + \"when not matched then insert values (val);\")\n    }\n\n    @Test\n    fun matchesMergeWithUpdateDeleteOption() {\n        assertThat(p).matches(\"merge into dest_tab \"\n                + \"using source_tab on (1 = 2) \"\n                + \"when matched then update set col = val delete where 3 = 4 \"\n                + \"when not matched then insert values (val);\")\n    }\n\n    @Test\n    fun matchesMergeWithConditionalUpdatePlusDeleteOption() {\n        assertThat(p).matches(\"merge into dest_tab \"\n                + \"using source_tab on (1 = 2) \"\n                + \"when matched then update set col = val where 3 = 4 delete where 5 = 6 \"\n                + \"when not matched then insert values (val);\")\n    }\n\n    @Test\n    fun matchesMergeWithInsertColumnsList() {\n        assertThat(p).matches(\"merge into dest_tab \"\n                + \"using source_tab on (1 = 2) \"\n                + \"when matched then update set col = val \"\n                + \"when not matched then insert (foo, bar) values (val);\")\n    }\n\n    @Test\n    fun matchesMergeWithInsertColumnsListWithAliases() {\n        assertThat(p).matches(\"merge into dest_tab tab \"\n                + \"using source_tab on (1 = 2) \"\n                + \"when matched then update set col = val \"\n                + \"when not matched then insert (tab.foo, tab.bar) values (val);\")\n    }\n\n    @Test\n    fun matchesLabeledMerge() {\n        assertThat(p).matches(\"<<foo>>\"\n                + \"merge into dest_tab \"\n                + \"using source_tab on (1 = 2) \"\n                + \"when matched then update set col = val \"\n                + \"when not matched then insert values (val);\")\n    }\n\n    @Test\n    fun matchesMergeWithErrorLoggingClause() {\n        assertThat(p).matches(\"merge into dest_tab d \"\n                + \"using source_tab s on (d.id = s.id) \"\n                + \"when matched then update set col = val \"\n                + \"when not matched then insert values (val)\"\n                + \"log errors into error_tab reject limit 10;\")\n    }\n\n    @Test\n    fun matchesMergeWithDefaultValues() {\n        assertThat(p).matches(\"merge into dest_tab d \"\n                + \"using source_tab s on (d.id = s.id) \"\n                + \"when matched then update set col1 = val, col2 = s.val, col3 = default \"\n                + \"when not matched then insert values (val, s.val, default);\")\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/statements/OpenForStatementTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.statements\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass OpenForStatementTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.OPEN_FOR_STATEMENT)\n    }\n\n    @Test\n    fun matchesSimpleOpen() {\n        assertThat(p).matches(\"open cur for myquery;\")\n    }\n\n    @Test\n    fun matchesOpenCursorInPackage() {\n        assertThat(p).matches(\"open pack.cur for myquery;\")\n    }\n\n    @Test\n    fun matchesOpenForSelectExpression() {\n        assertThat(p).matches(\"open cur for select 1 from dual;\")\n    }\n\n    @Test\n    fun matchesOpenForHostCursor() {\n        assertThat(p).matches(\"open :cur for myquery;\")\n    }\n\n    @Test\n    fun matchesOpenWithUsingClause() {\n        assertThat(p).matches(\"open cur for myquery using foo;\")\n    }\n\n    @Test\n    fun matchesOpenWithInParameterInUsingClause() {\n        assertThat(p).matches(\"open cur for myquery using in foo;\")\n    }\n\n    @Test\n    fun matchesOpenWithInParameterInOutUsingClause() {\n        assertThat(p).matches(\"open cur for myquery using in out foo;\")\n    }\n\n    @Test\n    fun matchesOpenWithInParameterOutUsingClause() {\n        assertThat(p).matches(\"open cur for myquery using out foo;\")\n    }\n\n    @Test\n    fun matchesOpenWithMultipleParameters() {\n        assertThat(p).matches(\"open cur for myquery using foo, bar, baz;\")\n    }\n\n    @Test\n    fun matcheslabeledOpen() {\n        assertThat(p).matches(\"<<foo>> open cur for myquery;\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/statements/OpenStatementTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.statements\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass OpenStatementTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.OPEN_STATEMENT)\n    }\n\n    @Test\n    fun matchesSimpleOpen() {\n        assertThat(p).matches(\"open cur;\")\n    }\n\n    @Test\n    fun matchesOpenCursorInPackage() {\n        assertThat(p).matches(\"open pack.cur;\")\n    }\n\n    @Test\n    fun matchesOpenWithParameter() {\n        assertThat(p).matches(\"open cur(foo);\")\n    }\n\n    @Test\n    fun matchesOpenWithMultipleParameters() {\n        assertThat(p).matches(\"open cur(foo, bar);\")\n    }\n\n    @Test\n    fun matchesOpenWithNamedParameters() {\n        assertThat(p).matches(\"open cur(x => foo, y => bar);\")\n    }\n\n    @Test\n    fun matchesLabeledOpen() {\n        assertThat(p).matches(\"<<foo>> open cur;\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/statements/PipeRowStatementTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.statements\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass PipeRowStatementTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.PIPE_ROW_STATEMENT)\n    }\n\n    @Test\n    fun matchesSimpleSearchedCase() {\n        assertThat(p).matches(\"pipe row (value);\")\n    }\n\n    @Test\n    fun matchesLabeledSearchedCase() {\n        assertThat(p).matches(\"<<foo>> pipe row (value);\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/statements/RaiseStatementTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.statements\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass RaiseStatementTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.RAISE_STATEMENT)\n    }\n\n    @Test\n    fun matchesSimpleRaise() {\n        assertThat(p).matches(\"raise;\")\n    }\n\n    @Test\n    fun matchesRaiseException() {\n        assertThat(p).matches(\"raise ex;\")\n    }\n\n    @Test\n    fun matchesRaiseMember() {\n        assertThat(p).matches(\"raise pack.ex;\")\n    }\n\n    @Test\n    fun matchesLabeledRaise() {\n        assertThat(p).matches(\"<<foo>> raise;\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/statements/ReturnStatementTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.statements\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass ReturnStatementTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.RETURN_STATEMENT)\n    }\n\n    @Test\n    fun matchesSimpleReturn() {\n        assertThat(p).matches(\"return;\")\n    }\n\n    @Test\n    fun matchesReturnWithValue() {\n        assertThat(p).matches(\"return 1;\")\n    }\n\n    @Test\n    fun matchesLabeledReturn() {\n        assertThat(p).matches(\"<<foo>> return;\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/statements/RollbackStatementTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.statements\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass RollbackStatementTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.ROLLBACK_STATEMENT)\n    }\n\n    @Test\n    fun matchesSimpleRollback() {\n        assertThat(p).matches(\"rollback;\")\n    }\n\n    @Test\n    fun matchesRollbackWork() {\n        assertThat(p).matches(\"rollback work;\")\n    }\n\n    @Test\n    fun matchesRollbackForce() {\n        assertThat(p).matches(\"rollback force 'test';\")\n    }\n\n    @Test\n    fun matchesRollbackToSavepoint() {\n        assertThat(p).matches(\"rollback to save;\")\n    }\n\n    @Test\n    fun matchesRollbackToSavepointAlternative() {\n        assertThat(p).matches(\"rollback to savepoint save;\")\n    }\n\n    @Test\n    fun matchesLongRollbackStatement() {\n        assertThat(p).matches(\"rollback work to savepoint save;\")\n    }\n\n    @Test\n    fun matchesLabeledRollback() {\n        assertThat(p).matches(\"<<foo>> rollback;\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/statements/SavepointStatementTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.statements\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass SavepointStatementTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.SAVEPOINT_STATEMENT)\n    }\n\n    @Test\n    fun matchesSavepoint() {\n        assertThat(p).matches(\"savepoint save;\")\n    }\n\n    @Test\n    fun matchesLabeledSavepoint() {\n        assertThat(p).matches(\"<<foo>> savepoint save;\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/statements/SetTransactionStatementTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.statements\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass SetTransactionStatementTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.SET_TRANSACTION_STATEMENT)\n    }\n\n    @Test\n    fun matchesSetUnnamedReadOnlyTransaction() {\n        assertThat(p).matches(\"set transaction read only;\")\n    }\n\n    @Test\n    fun matchesSetNamedReadOnlyTransaction() {\n        assertThat(p).matches(\"set transaction read only name 'foo';\")\n    }\n\n    @Test\n    fun matchesSetUnnamedRedWriteTransaction() {\n        assertThat(p).matches(\"set transaction read write;\")\n    }\n\n    @Test\n    fun matchesSetNamedRedWriteTransaction() {\n        assertThat(p).matches(\"set transaction read write name 'foo';\")\n    }\n\n    @Test\n    fun matchesSetUnnamedSerializableTransaction() {\n        assertThat(p).matches(\"set transaction isolation level serializable;\")\n    }\n\n    @Test\n    fun matchesSetNamedSerializableTransaction() {\n        assertThat(p).matches(\"set transaction isolation level serializable name 'foo';\")\n    }\n\n    @Test\n    fun matchesSetUnnamedReadCommitedTransaction() {\n        assertThat(p).matches(\"set transaction isolation level read committed;\")\n    }\n\n    @Test\n    fun matchesSetNamedReadCommitedTransaction() {\n        assertThat(p).matches(\"set transaction isolation level read committed name 'foo';\")\n    }\n\n    @Test\n    fun matchesSetUnnamedTransactionWithFixedRollbackSegment() {\n        assertThat(p).matches(\"set transaction use rollback segment foo;\")\n    }\n\n    @Test\n    fun matchesSetNamedTransactionWithFixedRollbackSegment() {\n        assertThat(p).matches(\"set transaction use rollback segment foo name 'bar';\")\n    }\n\n    @Test\n    fun matchesSimpleSetTransactionName() {\n        assertThat(p).matches(\"set transaction name 'foo';\")\n    }\n\n    @Test\n    fun doesNotMatchEmptySetTransaction() {\n        assertThat(p).notMatches(\"set transaction;\")\n    }\n\n    @Test\n    fun matchesLabeledSetTransactionName() {\n        assertThat(p).matches(\"<<foo>> set transaction name 'foo';\")\n    }\n\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/statements/UpdateStatementTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.statements\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass UpdateStatementTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.UPDATE_STATEMENT)\n    }\n\n    @Test\n    fun matchesSimpleUpdate() {\n        assertThat(p).matches(\"update tab set x = 1;\")\n    }\n\n    @Test\n    fun matchesUpdateWithWhere() {\n        assertThat(p).matches(\"update tab set x = 1 where y = 1;\")\n    }\n\n    @Test\n    fun matchesUpdateWithWhereCurrentOf() {\n        assertThat(p).matches(\"update tab set x = 1 where current of cur;\")\n    }\n\n    @Test\n    fun matchesUpdateMultipleColumns() {\n        assertThat(p).matches(\"update tab set x = 1, y = 1;\")\n    }\n\n    @Test\n    fun matchesUpdateWithAlias() {\n        assertThat(p).matches(\"update tab t set t.x = 1;\")\n    }\n\n    @Test\n    fun matchesUpdateWithSchema() {\n        assertThat(p).matches(\"update sch.tab set sch.tab.x = 1;\")\n    }\n\n    @Test\n    fun matchesLabeledUpdate() {\n        assertThat(p).matches(\"<<foo>> update tab set x = 1;\")\n    }\n\n    @Test\n    fun matchesUpdateWithReturningInto() {\n        assertThat(p).matches(\"update tab set x = 1 returning x into y;\")\n    }\n\n    @Test\n    fun matchesUpdateDefaultValue() {\n        assertThat(p).matches(\"update tab set x = default;\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/statements/WhileStatementTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.statements\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass WhileStatementTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.WHILE_STATEMENT)\n    }\n\n    @Test\n    fun matchesWhileLoop() {\n        assertThat(p).matches(\"\"\n                + \"while true loop \"\n                + \"null; \"\n                + \"end loop;\")\n    }\n\n    @Test\n    fun matchesNestedWhileLoop() {\n        assertThat(p).matches(\"\"\n                + \"while true loop \"\n                + \"while true loop \"\n                + \"null; \"\n                + \"end loop; \"\n                + \"end loop;\")\n    }\n\n    @Test\n    fun matchesLabeledLoop() {\n        assertThat(p).matches(\"\"\n                + \"<<foo>> while true loop \"\n                + \"null; \"\n                + \"end loop foo;\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/symbols/SymbolTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.symbols\n\nimport com.felipebz.flr.api.AstNode\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.mockito.Mockito.mock\nimport org.mockito.Mockito.`when`\nimport com.felipebz.zpa.api.symbols.Symbol.Kind\n\nclass SymbolTest {\n\n    @Test\n    fun testSymbol() {\n        val scope = mock(Scope::class.java)\n        val symbol = createSymbol(scope, \"foo\", Kind.VARIABLE)\n\n        assertThat(symbol.name).isEqualTo(\"foo\")\n        assertThat(symbol.kind).isEqualTo(Kind.VARIABLE)\n        assertThat(symbol.scope).isEqualTo(scope)\n        assertThat(symbol.toString()).startsWith(\"Symbol name=foo kind=VARIABLE datatype=Unknown\")\n    }\n\n    @Test\n    fun getModifiers() {\n        val scope = mock(Scope::class.java)\n        val symbol = createSymbol(scope, \"foo\", Kind.VARIABLE)\n\n        val node = mock(AstNode::class.java)\n        val modifiers = ArrayList<AstNode>()\n        modifiers.add(node)\n        symbol.addModifiers(modifiers)\n\n        assertThat(symbol.modifiers).containsExactly(node)\n    }\n\n    @Test\n    fun hasModifier() {\n        val scope = mock(Scope::class.java)\n        val symbol = createSymbol(scope, \"foo\", Kind.VARIABLE)\n\n        val node = mock(AstNode::class.java)\n        `when`(node.tokenValue).thenReturn(\"foo\")\n        val modifiers = ArrayList<AstNode>()\n        modifiers.add(node)\n        symbol.addModifiers(modifiers)\n\n        assertThat(symbol.hasModifier(\"foo\")).isTrue\n        assertThat(symbol.hasModifier(\"FOO\")).isTrue\n        assertThat(symbol.hasModifier(\"bar\")).isFalse\n    }\n\n    private fun createSymbol(scope: Scope, name: String, kind: Kind): Symbol {\n        val node = mock(AstNode::class.java)\n        `when`(node.tokenValue).thenReturn(name)\n        return Symbol(node, kind, scope, null)\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/units/AnonymousBlockTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.units\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass AnonymousBlockTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.ANONYMOUS_BLOCK)\n    }\n\n    @Test\n    fun matchesSimpleBlock() {\n        assertThat(p).matches(\"\"\n                + \"BEGIN\\n\"\n                + \"NULL;\\n\"\n                + \"END;\")\n    }\n\n    @Test\n    fun matchesBlockWithDeclareSection() {\n        assertThat(p).matches(\"\"\n                + \"DECLARE\\n\"\n                + \"VAR NUMBER;\\n\"\n                + \"BEGIN\\n\"\n                + \"NULL;\\n\"\n                + \"END;\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/units/CreateFunctionTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.units\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass CreateFunctionTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.CREATE_FUNCTION)\n    }\n\n    @Test\n    fun matchesSimpleFunction() {\n        assertThat(p).matches(\"\"\n                + \"create function test return number is\\n\"\n                + \"begin\\n\"\n                + \"return 0;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesSimpleFunctionWithNameRefresh() {\n        assertThat(p).matches(\"\"\n                + \"create function refresh return number is\\n\"\n                + \"begin\\n\"\n                + \"return 0;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesSimpleFunctionAlternative() {\n        assertThat(p).matches(\"\"\n                + \"create function test return number as\\n\"\n                + \"begin\\n\"\n                + \"return 0;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesEditionableFunction() {\n        assertThat(p).matches(\"\"\n                + \"create editionable function test return number is\\n\"\n                + \"begin\\n\"\n                + \"return 0;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesNonEditionableFunction() {\n        assertThat(p).matches(\"\"\n                + \"create noneditionable function test return number is\\n\"\n                + \"begin\\n\"\n                + \"return 0;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesFunctionWithSharingMetadata() {\n        assertThat(p).matches(\"\"\n                + \"create function test return number sharing = metadata is\\n\"\n                + \"begin\\n\"\n                + \"return 0;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesFunctionWithSharingNone() {\n        assertThat(p).matches(\"\"\n                + \"create editionable function test return number sharing = none is\\n\"\n                + \"begin\\n\"\n                + \"return 0;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesSimpleCreateOrReplaceFunction() {\n        assertThat(p).matches(\"\"\n                + \"create or replace function test return number is\\n\"\n                + \"begin\\n\"\n                + \"return 0;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesFunctionWithSchema() {\n        assertThat(p).matches(\"\"\n                + \"create function schema.test return number is\\n\"\n                + \"begin\\n\"\n                + \"return 0;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesFunctionWithParameter() {\n        assertThat(p).matches(\"\"\n                + \"create function test(parameter in number) return number is\\n\"\n                + \"begin\\n\"\n                + \"return 0;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesFunctionWithMultipleParameters() {\n        assertThat(p).matches(\"\"\n                + \"create function test(parameter1 in number, parameter2 in number) return number is\\n\"\n                + \"begin\\n\"\n                + \"return 0;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesFunctionWithAuthidCurrentUser() {\n        assertThat(p).matches(\"\"\n                + \"create function test return number authid current_user is\\n\"\n                + \"begin\\n\"\n                + \"return 0;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesFunctionWithAuthidDefiner() {\n        assertThat(p).matches(\"\"\n                + \"create function test return number authid definer is\\n\"\n                + \"begin\\n\"\n                + \"return 0;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesFunctionWithDefaultCollation() {\n        assertThat(p).matches(\"\"\n                + \"create function test return number default collation using_nls_comp is\\n\"\n                + \"begin\\n\"\n                + \"return 0;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesFunctionWithAccessibleBy() {\n        assertThat(p).matches(\"\"\n                + \"create function test return number accessible by (procedure proc) is\\n\"\n                + \"begin\\n\"\n                + \"return 0;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesFunctionWithJavaCallSpec() {\n        assertThat(p).matches(\"create function test return number is language java name 'javatest';\")\n    }\n\n    @Test\n    fun matchesFunctionWithVariableDeclaration() {\n        assertThat(p).matches(\"\"\n                + \"create function test return number is\\n\"\n                + \"var number;\"\n                + \"begin\\n\"\n                + \"return 0;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesFunctionWithMultipleVariableDeclaration() {\n        assertThat(p).matches(\"\"\n                + \"create function test return number is\\n\"\n                + \"var number;\"\n                + \"var2 number;\"\n                + \"begin\\n\"\n                + \"return 0;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesDeterministicFunction() {\n        assertThat(p).matches(\"\"\n                + \"create function test return number deterministic is\\n\"\n                + \"begin\\n\"\n                + \"return 0;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesPipelinedFunction() {\n        assertThat(p).matches(\"\"\n                + \"create function test return number pipelined is\\n\"\n                + \"begin\\n\"\n                + \"return 0;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesParallelEnableFunction() {\n        assertThat(p).matches(\"\"\n                + \"create function test return number parallel_enable is\\n\"\n                + \"begin\\n\"\n                + \"return 0;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesResultCacheFunction() {\n        assertThat(p).matches(\"\"\n                + \"create function test return number result_cache is\\n\"\n                + \"begin\\n\"\n                + \"return 0;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesResultCacheWithReliesOnFunction() {\n        assertThat(p).matches(\"\"\n                + \"create function test return number result_cache relies_on(tbl_test1, tbl_test2) is\\n\"\n                + \"begin\\n\"\n                + \"return 0;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesFunctionWithTimestamp() {\n        assertThat(p).matches(\"\"\n                + \"create function test timestamp '2015-01-01' return number is\\n\"\n                + \"begin\\n\"\n                + \"return 0;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesAggregateFunction() {\n        assertThat(p).matches(\"create function test return varchar2 aggregate using foo.bar;\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/units/CreatePackageBodyTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.units\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass CreatePackageBodyTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.CREATE_PACKAGE_BODY)\n    }\n\n    @Test\n    fun matchesSimplePackageBody() {\n        assertThat(p).matches(\"\"\n                + \"create package body test is\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesSimplePackageBodyAlternative() {\n        assertThat(p).matches(\"\"\n                + \"create package body test as\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesSimplePackageBodyWithNameAtEnd() {\n        assertThat(p).matches(\"\"\n                + \"create package body test is\\n\"\n                + \"end test;\")\n    }\n\n    @Test\n    fun matchesEditionablePackageBody() {\n        assertThat(p).matches(\"\"\n                + \"create editionable package body test is\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesNonEditionablePackageBody() {\n        assertThat(p).matches(\"\"\n                + \"create noneditionable package body test is\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesSimpleCreateOrReplacePackageBody() {\n        assertThat(p).matches(\"\"\n                + \"create or replace package body test is\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesPackageBodyWithSchema() {\n        assertThat(p).matches(\"\"\n                + \"create package body schema.test is\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesPackageBodyWithProcedure() {\n        assertThat(p).matches(\"\"\n                + \"create package body test is\\n\"\n                + \"procedure proc is\\n\"\n                + \"begin\\n\"\n                + \"null;\\n\"\n                + \"end;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesPackageWithFunction() {\n        assertThat(p).matches(\"\"\n                + \"create package body test is\\n\"\n                + \"function func return number is\\n\"\n                + \"begin\\n\"\n                + \"return null;\\n\"\n                + \"end;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesPackageWithFunctionAndResultCache() {\n        assertThat(p).matches(\"\"\n                + \"create package body test is\\n\"\n                + \"function func return number result_cache relies_on (tbl_test1,tbl_test2) is\\n\"\n                + \"begin\\n\"\n                + \"return null;\\n\"\n                + \"end;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesPackageWithFunctionAndCursor() {\n        assertThat(p).matches(\"\"\n                + \"create package body test is\\n\"\n                + \"function func return number as\\n\"\n                + \"cursor c_data is\\n\"\n                + \"\t\t(\\n\"\n                + \"\t\tselect abc from dual\\n\"\n                + \"\t\t) order by abc;\\n\"\n                + \"begin\\n\"\n                + \"return null;\\n\"\n                + \"end;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesPackageWithFunctionNamedExists() {\n        assertThat(p).matches(\"\"\n                + \"create package body test is\\n\"\n                + \"function exists return number is\\n\"\n                + \"begin\\n\"\n                + \"return null;\\n\"\n                + \"end;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesPackageWithInitializationSection() {\n        assertThat(p).matches(\"\"\n                + \"create package body test is\\n\"\n                + \"var number;\\n\"\n                + \"begin\\n\"\n                + \"var := 0;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesPackageBodyWithTimestamp() {\n        assertThat(p).matches(\"\"\n                + \"create package body test timestamp '2015-01-01' is\\n\"\n                + \"end;\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/units/CreatePackageTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.units\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass CreatePackageTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.CREATE_PACKAGE)\n    }\n\n    @Test\n    fun matchesSimplePackage() {\n        assertThat(p).matches(\"\"\n                + \"create package test is\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesSimplePackageAlternative() {\n        assertThat(p).matches(\"\"\n                + \"create package test as\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesSimplePackageWithNameAtEnd() {\n        assertThat(p).matches(\"\"\n                + \"create package test is\\n\"\n                + \"end test;\")\n    }\n\n    @Test\n    fun matchesSimpleCreateOrReplacePackage() {\n        assertThat(p).matches(\"\"\n                + \"create or replace package test is\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesPackageWithSchema() {\n        assertThat(p).matches(\"\"\n                + \"create package schema.test is\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesEditionablePackage() {\n        assertThat(p).matches(\"\"\n                + \"create editionable package test is\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesNonEditionablePackage() {\n        assertThat(p).matches(\"\"\n                + \"create noneditionable package test is\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesPackageWithSharingMetadata() {\n        assertThat(p).matches(\"\"\n                + \"create package test sharing = metadata is\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesPackageWithSharingNone() {\n        assertThat(p).matches(\"\"\n                + \"create package test sharing = none is\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesPackageWithAuthidCurrentUser() {\n        assertThat(p).matches(\"\"\n                + \"create package test authid current_user is\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesPackageWithAuthidDefiner() {\n        assertThat(p).matches(\"\"\n                + \"create package test authid definer is\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesPackageWithDefaultCollation() {\n        assertThat(p).matches(\"\"\n                + \"create package test default collation using_nls_comp is\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesPackageWithAccessibleBy() {\n        assertThat(p).matches(\"\"\n                + \"create package test accessible by (package other_package) is\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesPackageWithProcedure() {\n        assertThat(p).matches(\"\"\n                + \"create package test is\\n\"\n                + \"procedure proc;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesPackageWithFunction() {\n        assertThat(p).matches(\"\"\n                + \"create package test is\\n\"\n                + \"function func return number;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesPackageWithTimestamp() {\n        assertThat(p).matches(\"\"\n                + \"create package test timestamp '2015-01-01' is\\n\"\n                + \"end;\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/units/CreateProcedureTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.units\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass CreateProcedureTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.CREATE_PROCEDURE)\n    }\n\n    @Test\n    fun matchesSimpleProcedure() {\n        assertThat(p).matches(\"\"\n                + \"create procedure test is\\n\"\n                + \"begin\\n\"\n                + \"null;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesSimpleProcedureAlternative() {\n        assertThat(p).matches(\"\"\n                + \"create procedure test as\\n\"\n                + \"begin\\n\"\n                + \"null;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesEditionableProcedure() {\n        assertThat(p).matches(\"\"\n                + \"create editionable procedure test is\\n\"\n                + \"begin\\n\"\n                + \"null;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesNonEditionableProcedure() {\n        assertThat(p).matches(\"\"\n                + \"create noneditionable procedure test is\\n\"\n                + \"begin\\n\"\n                + \"null;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesProcedureWithSharingMetadata() {\n        assertThat(p).matches(\"\"\n                + \"create procedure test sharing = metadata is\\n\"\n                + \"begin\\n\"\n                + \"null;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesProcedureWithSharingNone() {\n        assertThat(p).matches(\"\"\n                + \"create procedure test sharing = none is\\n\"\n                + \"begin\\n\"\n                + \"null;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesProcedureWithDefaultCollation() {\n        assertThat(p).matches(\"\"\n                + \"create procedure test default collation using_nls_comp is\\n\"\n                + \"begin\\n\"\n                + \"null;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesProcedureWithAccesibleBy() {\n        assertThat(p).matches(\"\"\n                + \"create procedure test accessible by (function func) is\\n\"\n                + \"begin\\n\"\n                + \"null;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesSimpleCreateOrReplaceProcedure() {\n        assertThat(p).matches(\"\"\n                + \"create or replace procedure test is\\n\"\n                + \"begin\\n\"\n                + \"null;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesProcedureWithSchema() {\n        assertThat(p).matches(\"\"\n                + \"create procedure schema.test is\\n\"\n                + \"begin\\n\"\n                + \"null;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesProcedureWithParameter() {\n        assertThat(p).matches(\"\"\n                + \"create procedure test(parameter in number) is\\n\"\n                + \"begin\\n\"\n                + \"null;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesProcedureWithMultipleParameters() {\n        assertThat(p).matches(\"\"\n                + \"create procedure test(parameter1 in number, parameter2 in number) is\\n\"\n                + \"begin\\n\"\n                + \"null;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesProcedureWithAuthidCurrentUser() {\n        assertThat(p).matches(\"\"\n                + \"create procedure test authid current_user is\\n\"\n                + \"begin\\n\"\n                + \"null;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesProcedureWithAuthidDefiner() {\n        assertThat(p).matches(\"\"\n                + \"create procedure test authid definer is\\n\"\n                + \"begin\\n\"\n                + \"null;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesProcedureWithJavaCallSpec() {\n        assertThat(p).matches(\"create procedure test is language java name 'javatest';\")\n    }\n\n    @Test\n    fun matchesExternalProcedure() {\n        assertThat(p).matches(\"create procedure test is external name \\\"foo\\\" library bar;\")\n    }\n\n    @Test\n    fun matchesProcedureWithVariableDeclaration() {\n        assertThat(p).matches(\"\"\n                + \"create procedure test is\\n\"\n                + \"var number;\"\n                + \"begin\\n\"\n                + \"null;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesProcedureWithMultipleVariableDeclaration() {\n        assertThat(p).matches(\"\"\n                + \"create procedure test is\\n\"\n                + \"var number;\"\n                + \"var2 number;\"\n                + \"begin\\n\"\n                + \"null;\\n\"\n                + \"end;\")\n    }\n\n    @Test\n    fun matchesProcedureWithTimestamp() {\n        assertThat(p).matches(\"\"\n                + \"create procedure test timestamp '2015-01-01' is\\n\"\n                + \"begin\\n\"\n                + \"null;\\n\"\n                + \"end;\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/units/CreateTriggerTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.units\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass CreateTriggerTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.CREATE_TRIGGER)\n    }\n\n    @Test\n    fun matchesSimpleTrigger() {\n        assertThat(p).matches(\"\"\n                + \"create trigger foo \"\n                + \"before insert on tab \"\n                + \"begin null; end;\")\n    }\n\n    @Test\n    fun matchesSimpleCreateOrReplaceTrigger() {\n        assertThat(p).matches(\"\"\n                + \"create or replace trigger foo \"\n                + \"before insert on tab \"\n                + \"begin null; end;\")\n    }\n\n    @Test\n    fun matchesEditionableTrigger() {\n        assertThat(p).matches(\"\"\n                + \"create editionable trigger foo \"\n                + \"before insert on tab \"\n                + \"begin null; end;\")\n    }\n\n    @Test\n    fun matchesNoneditionableTrigger() {\n        assertThat(p).matches(\"\"\n                + \"create noneditionable trigger foo \"\n                + \"before insert on tab \"\n                + \"begin null; end;\")\n    }\n\n    @Test\n    fun matchesTriggerWithDeclareWithoutDeclarations() {\n        assertThat(p).matches(\"\"\n                + \"create trigger foo \"\n                + \"before insert on tab \"\n                + \"declare \"\n                + \"begin null; end;\")\n    }\n\n    @Test\n    fun matchesSystemDdlTrigger() {\n        assertThat(p).matches(\"\"\n                + \"create trigger foo \"\n                + \"before alter or analyze or associate statistics or audit or comment or create \"\n                + \"on foo.schema \"\n                + \"begin null; end;\")\n    }\n\n    @Test\n    fun matchesSystemDatabaseTrigger() {\n        assertThat(p).matches(\"\"\n                + \"create trigger foo \"\n                + \"after startup or before logoff or after db_role_change \"\n                + \"on pluggable database \"\n                + \"begin null; end;\")\n    }\n\n    @Test\n    fun matchesInsteadOfDmlTrigger() {\n        assertThat(p).matches(\"\"\n                + \"create trigger foo \"\n                + \"instead of insert or update on foo.bar \"\n                + \"for each row enable \"\n                + \"begin null; end;\")\n    }\n\n    @Test\n    fun matchesCompoundDmlTrigger() {\n        assertThat(p).matches(\"\"\n                + \"create trigger foo \"\n                + \"for insert or update of bar on foo.bar \"\n                + \"compound trigger \"\n                + \"before each row is \"\n                + \"begin null; end before each row;\"\n                + \"after each row is \"\n                + \"begin null; end after each row;\"\n                + \"after statement is \"\n                + \"begin null; end after statement;\"\n                + \"end foo;\")\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/units/CreateTypeBodyTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.units\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass CreateTypeBodyTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.CREATE_TYPE_BODY)\n    }\n\n    @Test\n    fun matchesEditionableTypeBody() {\n        assertThat(p).matches(\n                \"create editionable type body foo as \"\n                        + \"member procedure foo is \"\n                        + \"begin null; end; \"\n                        + \"end;\")\n    }\n\n    @Test\n    fun matchesNonEditionableTypeBody() {\n        assertThat(p).matches(\n                \"create noneditionable type body foo as \"\n                        + \"member procedure foo is \"\n                        + \"begin null; end; \"\n                        + \"end;\")\n    }\n\n    @Test\n    fun matchesTypeBodyWithProcedure() {\n        assertThat(p).matches(\n                \"create type body foo as \"\n                        + \"member procedure foo is \"\n                        + \"begin null; end; \"\n                        + \"end;\")\n    }\n\n    @Test\n    fun matchesTypeBodyWithFunction() {\n        assertThat(p).matches(\n                \"create type body foo is \"\n                        + \"member function foo return number is \"\n                        + \"begin null; end; \"\n                        + \"end;\")\n    }\n\n    @Test\n    fun matchesTypeBodyWithStaticFunction() {\n        assertThat(p).matches(\n                \"create type body foo is \"\n                        + \"static function foo return number is \"\n                        + \"begin null; end; \"\n                        + \"end;\")\n    }\n\n    @Test\n    fun matchesTypeBodyWithConstructor() {\n        assertThat(p).matches(\n                \"create type body foo is \"\n                        + \"constructor function bar return self as result as \"\n                        + \"begin null; end; \"\n                        + \"end;\")\n    }\n\n    @Test\n    fun matchesTypeBodyWithOverridenFunction() {\n        assertThat(p).matches(\n                \"create type body foo is \"\n                        + \"overriding member function foo return number is \"\n                        + \"begin null; end; \"\n                        + \"end;\")\n    }\n\n\n    @Test\n    fun matchesTypeBodyWithOverridenFinalFunction() {\n        assertThat(p).matches(\n                \"create type body foo is \"\n                        + \"overriding final member function foo return number is \"\n                        + \"begin null; end; \"\n                        + \"end;\")\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/units/CreateTypeTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.units\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass CreateTypeTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.CREATE_TYPE)\n    }\n\n    @Test\n    fun matchesIncompleteType() {\n        assertThat(p).matches(\"create type foo;\")\n    }\n\n    @Test\n    fun matchesSimpleCreateTypeObject() {\n        assertThat(p).matches(\"create type foo as object (x number(5));\")\n    }\n\n    @Test\n    fun matchesCreateEditionableType() {\n        assertThat(p).matches(\"create editionable type foo as object (x number(5));\")\n    }\n\n    @Test\n    fun matchesCreateNonEditionableType() {\n        assertThat(p).matches(\"create noneditionable type foo as object (x number(5));\")\n    }\n\n    @Test\n    fun matchesCreateTypeWithSharingMetadata() {\n        assertThat(p).matches(\"create type foo sharing = metadata as object (x number(5));\")\n    }\n\n    @Test\n    fun matchesCreateTypeWithSharingNone() {\n        assertThat(p).matches(\"create type foo sharing = none as object (x number(5));\")\n    }\n\n    @Test\n    fun matchesCreateTypeWithDefaultCollation() {\n        assertThat(p).matches(\"create type foo default collation using_nls_comp as object (x number(5));\")\n    }\n\n    @Test\n    fun matchesCreateTypeWithAccesibleBy() {\n        assertThat(p).matches(\"create type foo accessible by (type other_type) as object (x number(5));\")\n    }\n\n    @Test\n    fun matchesCreateTypeForce() {\n        assertThat(p).matches(\"create type foo force as object (x number(5));\")\n    }\n\n    @Test\n    fun matchesSimpleCreateTypeUnder() {\n        assertThat(p).matches(\"create type foo under bar (x number(5));\")\n    }\n\n    @Test\n    fun matchesSimpleCreateOrReplaceTypeObject() {\n        assertThat(p).matches(\"create or replace type foo as object (x number(5));\")\n    }\n\n    @Test\n    fun matchesSimpleCreateTypeVarray() {\n        assertThat(p).matches(\"create type foo is varray(2) of number(5);\")\n    }\n\n    @Test\n    fun matchesSimpleCreateTypeNestedTable() {\n        assertThat(p).matches(\"create type foo is table of bar;\")\n    }\n\n    @Test\n    fun matchesManyAttributes() {\n        assertThat(p).matches(\"create type foo as object (x number(5), y bar, z baz);\")\n    }\n\n    @Test\n    fun matchesCreateTypeFinal() {\n        assertThat(p).matches(\"create type foo as object (x number(5)) final;\")\n    }\n\n    @Test\n    fun matchesCreateTypeNotFinal() {\n        assertThat(p).matches(\"create type foo as object (x number(5)) not final;\")\n    }\n\n    @Test\n    fun matchesCreateTypeInstantiable() {\n        assertThat(p).matches(\"create type foo as object (x number(5)) instantiable;\")\n    }\n\n    @Test\n    fun matchesCreateTypeNotInstantiable() {\n        assertThat(p).matches(\"create type foo as object (x number(5)) not instantiable;\")\n    }\n\n    @Test\n    fun matchesCreateTypeNotFinalNotInstantiable() {\n        assertThat(p).matches(\"create type foo as object (x number(5)) not final not instantiable;\")\n    }\n\n    @Test\n    fun matchesProcedureMember() {\n        assertThat(p).matches(\n                \"create or replace type foo as object (\"\n                        + \"x number(5),\"\n                        + \"member procedure bar);\")\n    }\n\n    @Test\n    fun matchesFunctionMember() {\n        assertThat(p).matches(\n                \"create or replace type foo as object (\"\n                        + \"x number(5),\"\n                        + \"member function bar return number);\")\n    }\n\n    @Test\n    fun matchesStaticProcedure() {\n        assertThat(p).matches(\n                \"create or replace type foo as object (\"\n                        + \"x number(5),\"\n                        + \"static procedure bar);\")\n    }\n\n    @Test\n    fun matchesStaticFunction() {\n        assertThat(p).matches(\n                \"create or replace type foo as object (\"\n                        + \"x number(5),\"\n                        + \"static function bar return number);\")\n    }\n\n    @Test\n    fun matchesSimpleConstructor() {\n        assertThat(p).matches(\n                \"create or replace type foo as object (\"\n                        + \"x number(5),\"\n                        + \"constructor function bar return self as result);\")\n    }\n\n    @Test\n    fun matchesFinalConstructor() {\n        assertThat(p).matches(\n                \"create or replace type foo as object (\"\n                        + \"x number(5),\"\n                        + \"final constructor function bar return self as result);\")\n    }\n\n    @Test\n    fun matchesInstantiableConstructor() {\n        assertThat(p).matches(\n                \"create or replace type foo as object (\"\n                        + \"x number(5),\"\n                        + \"instantiable constructor function bar return self as result);\")\n    }\n\n    @Test\n    fun matchesFinalInstantiableConstructor() {\n        assertThat(p).matches(\n                \"create or replace type foo as object (\"\n                        + \"x number(5),\"\n                        + \"final instantiable constructor function bar return self as result);\")\n    }\n\n    @Test\n    fun matchesSimpleConstructorWithParameters() {\n        assertThat(p).matches(\n                \"create or replace type foo as object (\"\n                        + \"x number(5),\"\n                        + \"constructor function bar(x number, y number) return self as result);\")\n    }\n\n    @Test\n    fun matchesSimpleConstructorWithExplicitSelf() {\n        assertThat(p).matches(\n                \"create or replace type foo as object (\"\n                        + \"x number(5),\"\n                        + \"constructor function bar(self in out foo, x number) return self as result);\")\n    }\n\n    @Test\n    fun matchesConstructor() {\n        assertThat(p).matches(\n                \"create or replace type foo as object (\"\n                        + \"x number(5),\"\n                        + \"final constructor function bar return self as result);\")\n    }\n\n    @Test\n    fun matchesMapMember() {\n        assertThat(p).matches(\n                \"create or replace type foo as object (\"\n                        + \"x number(5),\"\n                        + \"map member function bar return number);\")\n    }\n\n    @Test\n    fun matchesOrderMember() {\n        assertThat(p).matches(\n                \"create or replace type foo as object (\"\n                        + \"x number(5),\"\n                        + \"order member function bar return number);\")\n    }\n\n    @Test\n    fun deprecatedType() {\n        assertThat(p).matches(\n            \"create or replace type foo as object (\"\n                + \"  pragma deprecate (foo),\"\n                + \"x number(5),\"\n                + \"member function bar return number);\")\n    }\n\n    @Test\n    fun deprecatedTypeWithComment() {\n        assertThat(p).matches(\n            \"create or replace type foo as object (\"\n                + \"  pragma deprecate (foo, 'is deprecated'),\"\n                + \"x number(5),\"\n                + \"member function bar return number);\")\n    }\n\n    @Test\n    fun deprecatedTypeVariable() {\n        assertThat(p).matches(\n            \"create or replace type foo as object (\"\n                + \"x number(5),\"\n                + \"  pragma deprecate (x),\"\n                + \"member function bar return number);\")\n    }\n\n    @Test\n    fun deprecatedTypeVariableWithComment() {\n        assertThat(p).matches(\n            \"create or replace type foo as object (\"\n                + \"x number(5),\"\n                + \"  pragma deprecate (x, 'is deprecated'),\"\n                + \"member function bar return number);\")\n    }\n\n    @Test\n    fun deprecatedTypeProcedure() {\n        assertThat(p).matches(\n            \"create or replace type foo as object (\"\n                + \"x number(5),\"\n                + \"member function bar return number,\"\n                + \"  pragma deprecate (bar)\"\n                + \");\")\n    }\n\n    @Test\n    fun deprecatedTypeProcedureWithComment() {\n        assertThat(p).matches(\n            \"create or replace type foo as object (\"\n                + \"x number(5),\"\n                + \"member function bar return number,\"\n                + \"  pragma deprecate (bar, 'is deprecated')\"\n                + \");\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/units/CreateViewTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.units\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass CreateViewTest : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.CREATE_VIEW)\n    }\n\n    @Test\n    fun matchesSimpleView() {\n        assertThat(p).matches(\"create view foo as select 1 from dual;\")\n    }\n\n    @Test\n    fun matchesSimpleViewWithoutSemicolon() {\n        assertThat(p).matches(\"create view foo as select 1 from dual\")\n    }\n\n    @Test\n    fun matchesSimpleCreateOrReplaceView() {\n        assertThat(p).matches(\"create or replace view foo as select 1 from dual;\")\n    }\n\n    @Test\n    fun matchesViewWithSchema() {\n        assertThat(p).matches(\"create view sch.foo as select 1 from dual;\")\n    }\n\n    @Test\n    fun matchesEditionableView() {\n        assertThat(p).matches(\"create editionable view foo as select 1 from dual;\")\n    }\n\n    @Test\n    fun matchesNonEditionableView() {\n        assertThat(p).matches(\"create noneditionable view foo as select 1 from dual;\")\n    }\n\n    @Test\n    fun matchesForceView() {\n        assertThat(p).matches(\"create force view foo as select 1 from dual;\")\n    }\n\n    @Test\n    fun matchesNoForceView() {\n        assertThat(p).matches(\"create no force view foo as select 1 from dual;\")\n    }\n\n    @Test\n    fun matchesViewWithColumnAliases() {\n        assertThat(p).matches(\"create view foo(a, b, c) as select 1, 2, 3 from dual;\")\n    }\n\n    @Test\n    fun matchesViewWithReadOnly() {\n        assertThat(p).matches(\"create view foo as select 1, 2, 3 from dual with read only;\")\n    }\n\n    @Test\n    fun matchesViewWithCheckOption() {\n        assertThat(p).matches(\"create view foo as select 1, 2, 3 from dual with check option;\")\n    }\n\n    @Test\n    fun matchesViewWithCheckOptionAndName() {\n        assertThat(p).matches(\"create view foo as select 1, 2, 3 from dual with check option constraint cons_name;\")\n    }\n\n    @Test\n    fun matchesDecode() {\n        assertThat(p).matches(\"create or replace view foo as select decode(bp.reference,null,sp.name1,bp.name1) p_name1 from bp, sp;\")\n    }\n\n    @Test\n    fun matchesDecodeWithRefColumn() {\n        assertThat(p).matches(\"create or replace view foo as select decode(bp.ref,null,sp.name1,bp.name1) p_name1 from bp, sp;\")\n    }\n\n    @Test\n    fun matchesViewWithOrder() {\n        assertThat(p).matches(\"create or replace view foo as (select abc,1 from dual) order by abc;\")\n    }\n\n    @Test\n    fun matchesMaterializedView() {\n        assertThat(p).matches(\"create materialized view foo as select 1 from dual;\")\n    }\n\n    @Test\n    fun matchesMaterializedViewComplex() {\n        assertThat(p).matches(\"create materialized view foo pctfree 0 tablespace dat3 refresh complete start with sysdate+2/24 next trunc(sysdate)+1 as select 1 from dual;\")\n    }\n\n    @Test\n    fun matchesMaterializedViewWithTablespaceAndRefresh() {\n        assertThat(p).matches(\"create materialized view foo tablespace dat3 refresh complete as select 1 from dual;\")\n    }\n\n    @Test\n    fun notMatchesMaterializedView() {\n        assertThat(p).notMatches(\"create materialized force view foo as select 1 from dual;\")\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/units/RecoveryTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.units\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass RecoveryTest : RuleTest() {\n\n    @Test\n    fun doNotRecover() {\n        setErrorRecoveryEnabled(false)\n        setRootRule(PlSqlGrammar.FILE_INPUT)\n        assertThat(p).notMatches(\"unrecognized command\")\n    }\n\n    @Test\n    fun matchesRecovery() {\n        setErrorRecoveryEnabled(true)\n        setRootRule(PlSqlGrammar.FILE_INPUT)\n        assertThat(p).matches(\"unrecognized command\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/api/units/SimpleDmlTriggerTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.api.units\n\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\n\nclass SimpleDmlTriggerTest : RuleTest() {\n\n    private val body = \" begin null; end;\"\n\n    @BeforeEach\n    fun init() {\n        setRootRule(PlSqlGrammar.SIMPLE_DML_TRIGGER)\n    }\n\n    @Test\n    fun matchesBefore() {\n        assertThat(p).matches(\"before insert on tab$body\")\n    }\n\n    @Test\n    fun matchesAfter() {\n        assertThat(p).matches(\"after insert on tab$body\")\n    }\n\n    @Test\n    fun matchesUpdate() {\n        assertThat(p).matches(\"before update on tab$body\")\n    }\n\n    @Test\n    fun matchesUpdateWithOneColumn() {\n        assertThat(p).matches(\"before update of col1 on tab$body\")\n    }\n\n    @Test\n    fun matchesInsertOfWithOneColumn() {\n        assertThat(p).matches(\"before insert of col1 on tab$body\")\n    }\n\n    @Test\n    fun matchesDeleteOfWithOneColumn() {\n        assertThat(p).matches(\"before delete of col1 on tab$body\")\n    }\n\n    @Test\n    fun matchesUpdateWithMultipleColumns() {\n        assertThat(p).matches(\"before update of col1, col2 on tab$body\")\n    }\n\n    @Test\n    fun matchesDelete() {\n        assertThat(p).matches(\"before delete on tab$body\")\n    }\n\n    @Test\n    fun matchesReferencing() {\n        assertThat(p).matches(\"after insert on tab referencing old as foo$body\")\n    }\n\n    @Test\n    fun matchesMultipleReferencingClause() {\n        assertThat(p).matches(\"after insert on tab referencing old foo new as bar parent as bar$body\")\n    }\n\n    @Test\n    fun matchesEmptyReferencing() {\n        assertThat(p).matches(\"after insert on tab referencing$body\")\n    }\n\n    @Test\n    fun matchesForEachRow() {\n        assertThat(p).matches(\"after insert on tab for each row$body\")\n    }\n\n    @Test\n    fun matchesTriggerEditionForward() {\n        assertThat(p).matches(\"after insert on tab forward crossedition$body\")\n    }\n\n    @Test\n    fun matchesTriggerEditionReverse() {\n        assertThat(p).matches(\"after insert on tab reverse crossedition$body\")\n    }\n\n    @Test\n    fun matchesTriggerOrderingFollows() {\n        assertThat(p).matches(\"after insert on tab follows foo$body\")\n    }\n\n    @Test\n    fun matchesTriggerOrderingPrecedes() {\n        assertThat(p).matches(\"after insert on tab precedes foo$body\")\n    }\n\n    @Test\n    fun matchesTriggerOrderingFollowsMultiple() {\n        assertThat(p).matches(\"after insert on tab follows foo, bar$body\")\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/checks/IssueLocationTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.checks\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.flr.api.GenericTokenType\nimport com.felipebz.flr.api.Token\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\n\nclass IssueLocationTest {\n\n    @Test\n    fun atFileLevel() {\n        val location = IssueLocation.atFileLevel(\"Issue\")\n        assertThat(location.startLine()).isEqualTo(0)\n        assertThat(location.startLineOffset()).isEqualTo(-1)\n        assertThat(location.endLine()).isEqualTo(0)\n        assertThat(location.endLineOffset()).isEqualTo(-1)\n        assertThat(location.message()).isEqualTo(\"Issue\")\n    }\n\n    @Test\n    fun atLineLevel() {\n        val location = IssueLocation.atLineLevel(\"Issue\", 10)\n        assertThat(location.startLine()).isEqualTo(10)\n        assertThat(location.startLineOffset()).isEqualTo(-1)\n        assertThat(location.endLine()).isEqualTo(10)\n        assertThat(location.endLineOffset()).isEqualTo(-1)\n        assertThat(location.message()).isEqualTo(\"Issue\")\n    }\n\n    @Test\n    fun preciseLocationSingleNode() {\n        val node = createNode(1, 1, 1, 5)\n        val location = IssueLocation.preciseLocation(node, \"Issue\")\n        assertThat(location.startLine()).isEqualTo(1)\n        assertThat(location.startLineOffset()).isEqualTo(1)\n        assertThat(location.endLine()).isEqualTo(1)\n        assertThat(location.endLineOffset()).isEqualTo(4)\n        assertThat(location.message()).isEqualTo(\"Issue\")\n    }\n\n    @Test\n    fun preciseLocationStartAndEndNode() {\n        val startNode = createNode(1, 1, 1, 5)\n        val endNode = createNode(2, 1, 2, 10)\n        val location = IssueLocation.preciseLocation(startNode, endNode, \"Issue\")\n        assertThat(location.startLine()).isEqualTo(1)\n        assertThat(location.startLineOffset()).isEqualTo(1)\n        assertThat(location.endLine()).isEqualTo(2)\n        assertThat(location.endLineOffset()).isEqualTo(9)\n        assertThat(location.message()).isEqualTo(\"Issue\")\n    }\n\n    private fun createNode(startLine: Int, startCharacter: Int, endLine: Int, endCharacter: Int): AstNode {\n        val token = Token.builder()\n            .setLine(startLine)\n            .setColumn(startCharacter)\n            .setValueAndOriginalValue(\"\")\n            .setType(GenericTokenType.IDENTIFIER)\n            .build()\n\n        val lastToken = Token.builder()\n            .setLine(endLine)\n            .setColumn(endCharacter - 1)\n            .setValueAndOriginalValue(\"\")\n            .setType(GenericTokenType.IDENTIFIER)\n            .build()\n\n        val node = AstNode(token)\n        node.addChild(AstNode(token))\n        node.addChild(AstNode(lastToken))\n\n        return node\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/lexer/PlSqlLexerTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.lexer\n\nimport com.felipebz.flr.api.TokenType\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.PlSqlTokenType\nimport com.felipebz.zpa.parser.PlSqlParser\nimport com.felipebz.zpa.squid.PlSqlConfiguration\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport java.nio.charset.StandardCharsets\n\nclass PlSqlLexerTest {\n\n    private val lexer = PlSqlLexer.create(PlSqlConfiguration(StandardCharsets.UTF_8))\n\n    @Test\n    fun multilineComment() {\n        assertThat(lexer.lex(\"/* multine \\n comment */\")).hasComment(\"/* multine \\n comment */\")\n        assertThat(lexer.lex(\"/**/\")).hasComment(\"/**/\")\n    }\n\n    @Test\n    fun inlineComment() {\n        assertThat(lexer.lex(\"before -- inline \\n new line\")).hasComment(\"-- inline \")\n        assertThat(lexer.lex(\"--\")).hasComment(\"--\")\n    }\n\n    @Test\n    fun simpleStringLiteral() {\n        assertThatIsToken(\"'Test'\", PlSqlTokenType.STRING_LITERAL)\n    }\n\n    @Test\n    fun simpleStringLiteralWithLineBreak() {\n        assertThatIsToken(\"'First\\nSecond'\", PlSqlTokenType.STRING_LITERAL)\n    }\n\n    @Test\n    fun simpleNationalCharsetStringLiteral() {\n        assertThatIsToken(\"n'Test string'\", PlSqlTokenType.STRING_LITERAL)\n    }\n\n    @Test\n    fun stringLiteralWithDoubleQuotationMarks() {\n        assertThatIsToken(\"'I''m a string'\", PlSqlTokenType.STRING_LITERAL)\n    }\n\n    @Test\n    fun stringLiteralWithUserDefinedDelimiters() {\n        assertThatIsToken(\"q'!I'm a string!'\", PlSqlTokenType.STRING_LITERAL)\n        assertThatIsToken(\"q'[I'm a string]'\", PlSqlTokenType.STRING_LITERAL)\n        assertThatIsToken(\"q'{I'm a string}'\", PlSqlTokenType.STRING_LITERAL)\n        assertThatIsToken(\"q'<I'm a string>'\", PlSqlTokenType.STRING_LITERAL)\n        assertThatIsToken(\"q'(I'm a string)'\", PlSqlTokenType.STRING_LITERAL)\n\n        assertThatIsToken(\"nq'!I'm a string!'\", PlSqlTokenType.STRING_LITERAL)\n        assertThatIsToken(\"nq'[I'm a string]'\", PlSqlTokenType.STRING_LITERAL)\n        assertThatIsToken(\"nq'{I'm a string}'\", PlSqlTokenType.STRING_LITERAL)\n        assertThatIsToken(\"nq'<I'm a string>'\", PlSqlTokenType.STRING_LITERAL)\n        assertThatIsToken(\"nq'(I'm a string)'\", PlSqlTokenType.STRING_LITERAL)\n\n        assertThatIsToken(\"q'!I'm a string q'[with nesting]'!'\", PlSqlTokenType.STRING_LITERAL)\n    }\n\n    @Test\n    fun stringLiteralWithUserDefinedDelimitersAndLineBreak() {\n        assertThatIsToken(\"q'!First\\nSecond!'\", PlSqlTokenType.STRING_LITERAL)\n    }\n\n    @Test\n    fun simpleIntegerLiteral() {\n        assertThatIsToken(\"6\", PlSqlTokenType.INTEGER_LITERAL)\n    }\n\n    @Test\n    fun simpleNumberLiteral() {\n        assertThatIsToken(\"6d\", PlSqlTokenType.NUMBER_LITERAL)\n        assertThatIsToken(\"6f\", PlSqlTokenType.NUMBER_LITERAL)\n        assertThatIsNotToken(\"6e\", PlSqlTokenType.NUMBER_LITERAL)\n    }\n\n    @Test\n    fun simpleRealLiteral() {\n        assertThatIsToken(\"3.14159\", PlSqlTokenType.NUMBER_LITERAL)\n        assertThatIsToken(\"3.14159f\", PlSqlTokenType.NUMBER_LITERAL)\n        assertThatIsToken(\"3.14159d\", PlSqlTokenType.NUMBER_LITERAL)\n    }\n\n    @Test\n    fun realLiteralWithDecimalPointOnly() {\n        assertThatIsToken(\".5\", PlSqlTokenType.NUMBER_LITERAL)\n    }\n\n    @Test\n    fun realLiteralWithWholePartOnly() {\n        assertThatIsToken(\"25.\", PlSqlTokenType.NUMBER_LITERAL)\n    }\n\n    @Test\n    fun simpleScientificNotationLiteral() {\n        assertThatIsToken(\"2E5\", PlSqlTokenType.NUMBER_LITERAL)\n        assertThatIsToken(\"2E5f\", PlSqlTokenType.NUMBER_LITERAL)\n    }\n\n    @Test\n    fun scientificNotationLiteralWithNegativeExponent() {\n        assertThatIsToken(\"1.0E-7\", PlSqlTokenType.NUMBER_LITERAL)\n    }\n\n    @Test\n    fun scientificNotationWithLowercaseSuffix() {\n        assertThatIsToken(\"9.5e-3\", PlSqlTokenType.NUMBER_LITERAL)\n    }\n\n    @Test\n    fun cornerCases() {\n        assertThatIsNotToken(\"1..\", PlSqlTokenType.NUMBER_LITERAL)\n        assertThatIsNotToken(\"..2\", PlSqlTokenType.NUMBER_LITERAL)\n\n        assertThatIsNotToken(\"e1\", PlSqlTokenType.NUMBER_LITERAL)\n    }\n\n    @Test\n    fun dateLiteral() {\n        assertThatIsToken(\"DATE '2015-01-01'\", PlSqlTokenType.DATE_LITERAL)\n        assertThatIsToken(\"date '2015-01-01'\", PlSqlTokenType.DATE_LITERAL)\n        assertThatIsToken(\"date'2015-01-01'\", PlSqlTokenType.DATE_LITERAL)\n        assertThatIsToken(\"date    '2015-01-01'\", PlSqlTokenType.DATE_LITERAL)\n    }\n\n    @Test\n    fun timestampLiteral() {\n        assertThatIsToken(\"TIMESTAMP '2015-01-01 01:01:01'\", PlSqlTokenType.TIMESTAMP_LITERAL)\n        assertThatIsToken(\"timestamp '2015-01-01 01:01:01'\", PlSqlTokenType.TIMESTAMP_LITERAL)\n        assertThatIsToken(\"timestamp'2015-01-01 01:01:01'\", PlSqlTokenType.TIMESTAMP_LITERAL)\n        assertThatIsToken(\"timestamp    '2015-01-01 01:01:01'\", PlSqlTokenType.TIMESTAMP_LITERAL)\n        assertThatIsToken(\"TIMESTAMP '2015-01-01 01:01:01.0'\", PlSqlTokenType.TIMESTAMP_LITERAL)\n        assertThatIsToken(\"TIMESTAMP '2015-01-01 01:01:01.123456789'\", PlSqlTokenType.TIMESTAMP_LITERAL)\n        assertThatIsToken(\"TIMESTAMP '2015-01-01 01:01:01 -3:00'\", PlSqlTokenType.TIMESTAMP_LITERAL)\n        assertThatIsToken(\"TIMESTAMP '2015-01-01 01:01:01 -03:00'\", PlSqlTokenType.TIMESTAMP_LITERAL)\n        assertThatIsToken(\"TIMESTAMP '2015-01-01 01:01:01 America/Sao_Paulo'\", PlSqlTokenType.TIMESTAMP_LITERAL)\n        assertThatIsToken(\"TIMESTAMP '2015-01-01 01:01:01 America/Sao_Paulo -03'\", PlSqlTokenType.TIMESTAMP_LITERAL)\n    }\n\n    private fun assertThatIsToken(sourceCode: String, tokenType: TokenType) {\n        assertThat(lexer.lex(sourceCode)).hasToken(sourceCode, tokenType)\n    }\n\n    private fun assertThatIsNotToken(sourceCode: String, tokenType: TokenType) {\n        assertThat(lexer.lex(sourceCode)).doesNotHaveToken(sourceCode, tokenType)\n    }\n\n    @Test\n    fun checkLimitsOfStringLiteralWithUserDefinedDelimiters() {\n        val p = PlSqlParser.create(PlSqlConfiguration(StandardCharsets.UTF_8, false))\n        p.setRootRule(p.grammar.rule(PlSqlGrammar.BLOCK_STATEMENT))\n\n        val node = p.parse(\"begin\\n\" +\n                \"x := q'!select 1 from dual!';\\n\" +\n                \"y := 'Another unrelated string!';\\n\" +\n                \"end;\")\n\n        assertThat(node.getDescendants(PlSqlGrammar.ASSIGNMENT_STATEMENT)).hasSize(2)\n    }\n\n    @Test\n    fun checkLimitsOfStringLiteralWithUserDefinedDelimiters2() {\n        val p = PlSqlParser.create(PlSqlConfiguration(StandardCharsets.UTF_8, false))\n        p.setRootRule(p.grammar.rule(PlSqlGrammar.BLOCK_STATEMENT))\n\n        val node = p.parse(\"begin\\n\" +\n                \"x := q'[\" +\n                \"replace(foo, ')');\" +\n                \"]';\\n\" +\n                \"end;\")\n\n        assertThat(node.getDescendants(PlSqlGrammar.ASSIGNMENT_STATEMENT)).hasSize(1)\n    }\n\n    @Test\n    fun conditionalCompilation() {\n        val p = PlSqlParser.create(PlSqlConfiguration(StandardCharsets.UTF_8, false))\n        p.setRootRule(p.grammar.rule(PlSqlGrammar.BLOCK_STATEMENT))\n\n        val node = p.parse(\"begin\\n\" +\n                \"\\$if $\\$var \\$then\\n\" +\n                \"  null;\\n\" +\n                \"\\$end\\n\" +\n                \"end;\")\n\n        assertThat(node.getDescendants(PlSqlGrammar.NULL_STATEMENT)).hasSize(1)\n    }\n\n    @Test\n    fun conditionalCompilationWithElse() {\n        val p = PlSqlParser.create(PlSqlConfiguration(StandardCharsets.UTF_8, false))\n        p.setRootRule(p.grammar.rule(PlSqlGrammar.BLOCK_STATEMENT))\n\n        val node = p.parse(\"begin\\n\" +\n                \"\\$if $\\$var \\$then\\n\" +\n                \"  null;\\n\" +\n                \"\\$else\\n\" +\n                \"  null;\\n\" +\n                \"\\$end\\n\" +\n                \"end;\")\n\n        assertThat(node.getDescendants(PlSqlGrammar.NULL_STATEMENT)).hasSize(1)\n    }\n\n\n    @Test\n    fun ignoreErrorPreProcessor() {\n        val p = PlSqlParser.create(PlSqlConfiguration(StandardCharsets.UTF_8, false))\n        p.setRootRule(p.grammar.rule(PlSqlGrammar.BLOCK_STATEMENT))\n\n        val node = p.parse(\"begin\\n\" +\n                \"\\$if DBMS_DB_VERSION.VER_LE_10_1 \\$then\\n\" +\n                \"  \\$error 'unsupported database release' \\$end\\n\" +\n                \"\\$end\\n\" +\n                \"null;\\n\" +\n                \"end;\")\n\n        assertThat(node.getDescendants(PlSqlGrammar.NULL_STATEMENT)).hasSize(1)\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/lexer/QuotedIdentifierChannelTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.lexer\n\nimport com.felipebz.flr.api.GenericTokenType\nimport com.felipebz.flr.impl.LexerOutput\nimport com.felipebz.flr.tests.Assertions.assertThat\nimport org.junit.jupiter.api.Test\n\nclass QuotedIdentifierChannelTest {\n    private val channel = QuotedIdentifierChannel(\"\\\".*?\\\"\", \"[A-Z]+\")\n    private val output = LexerOutput()\n\n    @Test\n    fun doesNotConsumeUnquotedWord() {\n        assertThat(channel).doesNotConsume(\"word\", output)\n    }\n\n    @Test\n    fun consumeQuotedWord() {\n        assertThat(channel).consume(\"\\\"some word\\\"\", output)\n        assertThat(output.tokens).hasToken(\"\\\"some word\\\"\", GenericTokenType.IDENTIFIER)\n    }\n\n    @Test\n    fun consumeQuotedWordWithSimpleIdentifier() {\n        assertThat(channel).consume(\"\\\"WORD\\\"\", output)\n        assertThat(output.tokens).hasToken(\"WORD\", GenericTokenType.IDENTIFIER)\n    }\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/metadata/FormsMetadataTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.metadata\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.assertj.core.api.Assertions.fail\nimport org.junit.jupiter.api.Test\n\nclass FormsMetadataTest {\n\n    @Test\n    fun canReadSimpleMetadaFile() {\n        val metadata = FormsMetadata.loadFromFile(\"src/test/resources/metadata/metadata.json\")\n\n        if (metadata == null) {\n            fail(\"Should load Oracle Forms metadata\")\n        } else {\n            assertThat(metadata.alerts).containsExactly(\"foo\", \"bar\")\n            assertThat(metadata.blocks).hasSize(2)\n            assertThat(metadata.blocks[0].name).isEqualTo(\"foo\")\n            assertThat(metadata.blocks[0].items).containsExactly(\"item1\", \"item2\")\n            assertThat(metadata.blocks[1].name).isEqualTo(\"bar\")\n            assertThat(metadata.blocks[1].items).containsExactly(\"item1\", \"item2\")\n            assertThat(metadata.lovs).containsExactly(\"foo\", \"bar\")\n        }\n    }\n\n\n    @Test\n    fun returnsNullIfFileDoesNotExists() {\n        val metadata = FormsMetadata.loadFromFile(\"src/test/resources/metadata/metadata2.json\")\n\n        assertThat(metadata).isNull()\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/metrics/MetricsVisitorTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.metrics\n\nimport com.felipebz.zpa.TestPlSqlVisitorRunner\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport java.io.File\n\nclass MetricsVisitorTest {\n\n    private val visitor = MetricsVisitor()\n\n    @Test\n    fun statements() {\n        TestPlSqlVisitorRunner.scanFile(File(\"src/test/resources/metrics/statements.sql\"), null, visitor)\n        assertThat(visitor.numberOfStatements).isEqualTo(4)\n    }\n\n    @Test\n    fun lines_of_code() {\n        TestPlSqlVisitorRunner.scanFile(File(\"src/test/resources/metrics/lines_of_code.sql\"), null, visitor)\n        assertThat(visitor.getLinesOfCode()).containsOnly(1, 4, 5, 6)\n    }\n\n    @Test\n    fun comments() {\n        TestPlSqlVisitorRunner.scanFile(File(\"src/test/resources/metrics/comments.sql\"), null, visitor)\n        assertThat(visitor.getLinesOfComments()).containsOnly(2, 3, 4, 5)\n    }\n\n    @Test\n    fun no_sonar() {\n        TestPlSqlVisitorRunner.scanFile(File(\"src/test/resources/metrics/no_sonar.sql\"), null, visitor)\n        assertThat(visitor.linesWithNoSonar).containsOnly(3, 4)\n    }\n\n    @Test\n    fun executable_lines() {\n        TestPlSqlVisitorRunner.scanFile(File(\"src/test/resources/metrics/statements.sql\"), null, visitor)\n        assertThat(visitor.getExecutableLines()).containsOnly(2, 3, 4, 5)\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/squid/ProgressReportTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.squid\n\nimport com.felipebz.zpa.utils.log.Logger\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertTimeout\nimport org.mockito.kotlin.argumentCaptor\nimport org.mockito.kotlin.atLeast\nimport org.mockito.kotlin.mock\nimport org.mockito.kotlin.verify\nimport java.time.Duration\nimport kotlin.concurrent.withLock\n\nclass ProgressReportTest {\n\n    @Test\n    fun test() {\n        assertTimeout(Duration.ofSeconds(5)) {\n            val logger: Logger = mock()\n\n            val report = ProgressReport(ProgressReport::class.java.name, 50, logger)\n\n            report.start(listOf(\"foo.java\", \"foo.java\"))\n\n            // Wait for start message\n            waitForMessage(report)\n\n            // Wait for at least one progress message\n            waitForMessage(report)\n\n            report.stop()\n\n            // Waits for the thread to die\n            // Note: We cannot simply wait for a message here, because it could\n            // either be a progress or a stop one\n            report.join()\n\n            argumentCaptor<String>().apply {\n                verify(logger, atLeast(3)).info(capture())\n\n                assertThat(allValues.size).isGreaterThanOrEqualTo(3)\n                assertThat(allValues[0]).isEqualTo(\"2 source files to be analyzed\")\n                for (i in 1 until allValues.size - 1) {\n                    assertThat(allValues[i]).isEqualTo(\"0/2 files analyzed, current file: foo.java\")\n                }\n                assertThat(allValues[allValues.size - 1]).isEqualTo(\"2/2\" + \" source files have been analyzed\")\n            }\n        }\n    }\n\n    @Test\n    fun testCancel() {\n        assertTimeout(Duration.ofSeconds(5)) {\n            val logger: Logger = mock()\n\n            val report = ProgressReport(ProgressReport::class.java.name, 50, logger)\n            report.start(listOf(\"foo.java\", \"foo.java\"))\n\n            // Wait for start message\n            waitForMessage(report)\n\n            report.cancel()\n            report.join()\n        }\n    }\n\n    private fun waitForMessage(report: ProgressReport) {\n        report.lock.withLock {\n            report.condition.await()\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/sslr/IfStatementTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.sslr\n\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\n\nclass IfStatementTest : TreeTest<IfStatement>(PlSqlGrammar.IF_STATEMENT) {\n\n    @Test\n    fun matchesSimpleIf() {\n        val tree = parse(\n            \"if true then \"\n            + \"null; \"\n            + \"end if;\")\n\n        assertThat(tree.condition.allTokensToString).isEqualTo(\"true\")\n        assertThat(tree.statements).hasSize(1)\n        assertThat(tree.statements[0].tree).isInstanceOf(NullStatement::class.java)\n        assertThat(tree.elsifClauses).hasSize(0)\n        assertThat(tree.elseClause).isNull()\n    }\n\n    @Test\n    fun matchesIfWithElsif() {\n        val tree = parse(\n            \"if true then \"\n            + \"null; \"\n            + \"elsif x = 1 then \"\n            + \"null; \"\n            + \"end if;\")\n\n        assertThat(tree.condition.allTokensToString).isEqualTo(\"true\")\n        assertThat(tree.statements).hasSize(1)\n        assertThat(tree.statements[0].tree).isInstanceOf(NullStatement::class.java)\n\n        assertThat(tree.elsifClauses).hasSize(1)\n        assertThat(tree.elsifClauses[0].condition.allTokensToString).isEqualTo(\"x = 1\")\n        assertThat(tree.elsifClauses[0].statements).hasSize(1)\n        assertThat(tree.elsifClauses[0].statements[0].tree).isInstanceOf(NullStatement::class.java)\n\n        assertThat(tree.elseClause).isNull()\n    }\n\n\n    @Test\n    fun matchesIfWithElsifAndElse() {\n        val tree = parse(\n            \"if true then \"\n            + \"null; \"\n            + \"elsif x = 1 then \"\n            + \"null; \"\n            + \"elsif x = 2 then \"\n            + \"null; \"\n            + \"else \"\n            + \"null; \"\n            + \"end if;\")\n\n        assertThat(tree.condition.allTokensToString).isEqualTo(\"true\")\n        assertThat(tree.statements).hasSize(1)\n        assertThat(tree.statements[0].tree).isInstanceOf(NullStatement::class.java)\n\n        assertThat(tree.elsifClauses).hasSize(2)\n        assertThat(tree.elsifClauses[0].condition.allTokensToString).isEqualTo(\"x = 1\")\n        assertThat(tree.elsifClauses[0].statements).hasSize(1)\n        assertThat(tree.elsifClauses[0].statements[0].tree).isInstanceOf(NullStatement::class.java)\n\n        assertThat(tree.elsifClauses[1].condition.allTokensToString).isEqualTo(\"x = 2\")\n        assertThat(tree.elsifClauses[1].statements).hasSize(1)\n        assertThat(tree.elsifClauses[1].statements[0].tree).isInstanceOf(NullStatement::class.java)\n\n        assertThat(tree.elseClause).isNotNull\n        assertThat(tree.elseClause!!.statements).hasSize(1)\n        assertThat(tree.elseClause!!.statements[0].tree).isInstanceOf(NullStatement::class.java)\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/sslr/TreeTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.sslr\n\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.RuleTest\nimport com.felipebz.zpa.asSemantic\nimport org.junit.jupiter.api.BeforeEach\n\nabstract class TreeTest<T : Tree>(private val root: PlSqlGrammar) : RuleTest() {\n\n    @BeforeEach\n    fun init() {\n        setRootRule(root)\n    }\n\n    fun parse(content: String): T {\n        @Suppress(\"UNCHECKED_CAST\")\n        return p.parse(content).asSemantic().tree as T\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/symbols/DefaultTypeSolverTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.symbols\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.symbols.PlSqlType\nimport com.felipebz.zpa.api.symbols.Symbol\nimport com.felipebz.zpa.api.symbols.datatype.PlSqlDatatype\nimport com.felipebz.zpa.api.symbols.datatype.RowtypeDatatype\nimport com.felipebz.zpa.parser.PlSqlParser\nimport com.felipebz.zpa.squid.PlSqlConfiguration\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\nimport org.mockito.Mockito.mock\nimport org.mockito.kotlin.whenever\nimport java.nio.charset.StandardCharsets\n\nclass DefaultTypeSolverTest {\n\n    private lateinit var scope: ScopeImpl\n    private val p = PlSqlParser.create(PlSqlConfiguration(StandardCharsets.UTF_8))\n    private val typeSolver = DefaultTypeSolver()\n\n    @BeforeEach\n    fun setup() {\n        scope = ScopeImpl()\n    }\n\n    @Test\n    fun identifyNumericType() {\n        val type = solveTypeFromDatatype(\"number\")\n        assertThat(type).isEqualTo(PlSqlType.NUMERIC)\n        assertThat(type.isNumeric).isTrue\n    }\n\n    @Test\n    fun identifyTypeNotNull() {\n        val type = solveTypeFromDatatype(\"number not null\")\n        assertThat(type).isEqualTo(PlSqlType.NUMERIC)\n        assertThat(type.isNumeric).isTrue\n    }\n\n    @Test\n    fun identifyCharacterType() {\n        val type = solveTypeFromDatatype(\"varchar2(100)\")\n        assertThat(type).isEqualTo(PlSqlType.CHARACTER)\n        assertThat(type.isCharacter).isTrue\n    }\n\n    @Test\n    fun identifyDateType() {\n        val type = solveTypeFromDatatype(\"date\")\n        assertThat(type).isEqualTo(PlSqlType.DATE)\n    }\n\n    @Test\n    fun identifyLobType() {\n        val type = solveTypeFromDatatype(\"clob\")\n        assertThat(type).isEqualTo(PlSqlType.LOB)\n    }\n\n    @Test\n    fun identifyBooleanType() {\n        val type = solveTypeFromDatatype(\"boolean\")\n        assertThat(type).isEqualTo(PlSqlType.BOOLEAN)\n    }\n\n    @Test\n    fun identifyRowtype() {\n        val type = solveTypeFromDatatype(\"tab%rowtype\")\n        assertThat(type).isEqualTo(PlSqlType.ROWTYPE)\n    }\n\n    @Test\n    fun identifyRowtypeNotNull() {\n        val type = solveTypeFromDatatype(\"tab%rowtype not null\")\n        assertThat(type).isEqualTo(PlSqlType.ROWTYPE)\n    }\n\n    @Test\n    fun identifyCustomType() {\n        val symbol = createSymbol(\"my_type\", Symbol.Kind.TYPE, RowtypeDatatype())\n        scope.addSymbol(symbol)\n\n        val type = solveTypeFromDatatype(\"my_type\")\n        assertThat(type).isEqualTo(PlSqlType.ROWTYPE)\n    }\n\n    @Test\n    fun unknownType() {\n        val type = solveTypeFromDatatype(\"tab.col%type\")\n        assertThat(type).isEqualTo(PlSqlType.UNKNOWN)\n        assertThat(type.isUnknown).isTrue\n    }\n\n    @Test\n    fun unknownTypeNotNull() {\n        val type = solveTypeFromDatatype(\"tab.col%type not null\")\n        assertThat(type).isEqualTo(PlSqlType.UNKNOWN)\n        assertThat(type.isUnknown).isTrue\n    }\n\n    @Test\n    fun identifyNumericLiteral() {\n        val type = solveTypeFromLiteral(\"1\")\n        assertThat(type).isEqualTo(PlSqlType.NUMERIC)\n        assertThat(type.isNumeric).isTrue\n    }\n\n    @Test\n    fun identifyCharacterLiteral() {\n        val type = solveTypeFromLiteral(\"'foo'\")\n        val type2 = solveTypeFromLiteral(\"q'!foo!'\")\n        val type3 = solveTypeFromLiteral(\"n'!foo!'\")\n        val type4 = solveTypeFromLiteral(\"nq'!foo!'\")\n\n        assertThat(arrayOf(type, type2, type3, type4))\n            .allMatch { it == PlSqlType.CHARACTER && it.isCharacter }\n    }\n\n    @Test\n    fun identifyDateLiteral() {\n        val type = solveTypeFromLiteral(\"date '2000-01-01'\")\n        assertThat(type).isEqualTo(PlSqlType.DATE)\n    }\n\n    @Test\n    fun identifyBooleanLiteral() {\n        val type = solveTypeFromLiteral(\"true\")\n        assertThat(type).isEqualTo(PlSqlType.BOOLEAN)\n    }\n\n    @Test\n    fun emptyStringShouldNotBeTypedAsCharacter() {\n        val type = solveTypeFromLiteral(\"''\")\n        val type2 = solveTypeFromLiteral(\"q'!!'\")\n        val type3 = solveTypeFromLiteral(\"n'!!'\")\n        val type4 = solveTypeFromLiteral(\"nq'!!'\")\n\n        assertThat(arrayOf(type, type2, type3, type4)).allMatch { it == PlSqlType.NULL }\n    }\n\n    private fun solveTypeFromDatatype(code: String): PlSqlType {\n        p.setRootRule(p.grammar.rule(PlSqlGrammar.DATATYPE))\n        return typeSolver.solve(p.parse(code), scope).type\n    }\n\n    private fun solveTypeFromLiteral(code: String): PlSqlType {\n        p.setRootRule(p.grammar.rule(PlSqlGrammar.LITERAL))\n        return typeSolver.solve(p.parse(code), scope).type\n    }\n\n    private fun mockAstNode() = mock(AstNode::class.java)\n\n    private fun createSymbol(name: String, kind: Symbol.Kind, type: PlSqlDatatype): Symbol {\n        val node = mockAstNode()\n        whenever(node.tokenValue).thenReturn(name)\n        return Symbol(node, kind, scope, type)\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/symbols/ScopeImplTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.symbols\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.api.symbols.Scope\nimport com.felipebz.zpa.api.symbols.Symbol\nimport com.felipebz.zpa.api.symbols.Symbol.Kind\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.mockito.Mockito.mock\nimport org.mockito.Mockito.`when`\n\nclass ScopeImplTest {\n\n    @Test\n    fun testScope() {\n        val node = mock(AstNode::class.java)\n        val scope = ScopeImpl(null, node)\n        assertThat(scope.outer).isNull()\n        assertThat(scope.tree).isEqualTo(node)\n        assertThat(scope.isAutonomousTransaction).isFalse\n    }\n\n    @Test\n    fun getSymbolsInScope() {\n        val scope = ScopeImpl()\n\n        val symbol1 = createSymbol(scope, \"foo\", Kind.VARIABLE)\n        scope.addSymbol(symbol1)\n\n        val symbol2 = createSymbol(scope, \"bar\", Kind.VARIABLE)\n        scope.addSymbol(symbol2)\n\n        assertThat(scope.symbols).containsExactly(symbol1, symbol2)\n    }\n\n    @Test\n    fun getSymbolsByKind() {\n        val scope = ScopeImpl()\n\n        val symbol1 = createSymbol(scope, \"foo\", Kind.VARIABLE)\n        scope.addSymbol(symbol1)\n\n        val symbol2 = createSymbol(scope, \"bar\", Kind.CURSOR)\n        scope.addSymbol(symbol2)\n\n        assertThat(scope.getSymbols(Kind.VARIABLE)).containsExactly(symbol1)\n        assertThat(scope.getSymbols(Kind.CURSOR)).containsExactly(symbol2)\n    }\n\n    @Test\n    fun getSymbolsAcessibleInScope() {\n        val scope = ScopeImpl()\n\n        val symbol1 = createSymbol(scope, \"foo\", Kind.VARIABLE)\n        scope.addSymbol(symbol1)\n\n        val symbol2 = createSymbol(scope, \"bar\", Kind.VARIABLE)\n        scope.addSymbol(symbol2)\n\n        assertThat(scope.getSymbolsAcessibleInScope(\"foo\")).containsExactly(symbol1)\n        assertThat(scope.getSymbolsAcessibleInScope(\"foo\", Kind.VARIABLE)).containsExactly(symbol1)\n        assertThat(scope.getSymbolsAcessibleInScope(\"foo\", Kind.CURSOR)).isEmpty()\n    }\n\n    @Test\n    fun getSymbolsAcessibleInScopeConsideringOuterScope() {\n        val outerScope = ScopeImpl()\n        val symbol1 = createSymbol(outerScope, \"foo\", Kind.VARIABLE)\n        outerScope.addSymbol(symbol1)\n\n        val innerScope = ScopeImpl(outerScope)\n        val symbol2 = createSymbol(innerScope, \"bar\", Kind.VARIABLE)\n        innerScope.addSymbol(symbol2)\n\n        assertThat(innerScope.getSymbolsAcessibleInScope(\"foo\")).containsExactly(symbol1)\n        assertThat(innerScope.getSymbolsAcessibleInScope(\"foo\", Kind.VARIABLE)).containsExactly(symbol1)\n        assertThat(innerScope.getSymbolsAcessibleInScope(\"foo\", Kind.CURSOR)).isEmpty()\n    }\n\n    @Test\n    fun getSymbol() {\n        val scope = ScopeImpl()\n\n        val symbol1 = createSymbol(scope, \"foo\", Kind.VARIABLE)\n        scope.addSymbol(symbol1)\n\n        val symbol2 = createSymbol(scope, \"bar\", Kind.VARIABLE)\n        scope.addSymbol(symbol2)\n\n        assertThat(scope.getSymbol(\"foo\")).isEqualTo(symbol1)\n        assertThat(scope.getSymbol(\"foo\", Kind.VARIABLE)).isEqualTo(symbol1)\n        assertThat(scope.getSymbol(\"foo\", Kind.CURSOR)).isNull()\n        assertThat(scope.getSymbol(\"baz\")).isNull()\n    }\n\n    @Test\n    fun getSymbolConsideringOuterScope() {\n        val outerScope = ScopeImpl()\n        val symbol1 = createSymbol(outerScope, \"foo\", Kind.VARIABLE)\n        outerScope.addSymbol(symbol1)\n\n        val innerScope = ScopeImpl(outerScope)\n        val symbol2 = createSymbol(innerScope, \"bar\", Kind.VARIABLE)\n        innerScope.addSymbol(symbol2)\n\n        assertThat(innerScope.getSymbol(\"foo\")).isEqualTo(symbol1)\n        assertThat(innerScope.getSymbol(\"foo\", Kind.VARIABLE)).isEqualTo(symbol1)\n        assertThat(innerScope.getSymbol(\"foo\", Kind.CURSOR)).isNull()\n        assertThat(innerScope.getSymbol(\"baz\")).isNull()\n    }\n\n    private fun mockAstNode() = mock(AstNode::class.java)\n\n    private fun createSymbol(scope: Scope, name: String, kind: Kind): Symbol {\n        val node = mockAstNode()\n        `when`(node.tokenValue).thenReturn(name)\n        return Symbol(node, kind, scope, null)\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/symbols/SymbolTableImplTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.symbols\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.zpa.api.symbols.Scope\nimport com.felipebz.zpa.api.symbols.Symbol.Kind\nimport com.felipebz.zpa.api.symbols.datatype.UnknownDatatype\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.mockito.Mockito.mock\nimport org.mockito.Mockito.`when`\n\nclass SymbolTableImplTest {\n\n    @Test\n    fun verifyScopes() {\n        val scope1 = mock(Scope::class.java)\n        val scope2 = mock(Scope::class.java)\n\n        val symbolTable = SymbolTableImpl()\n        symbolTable.addScope(scope1)\n        symbolTable.addScope(scope2)\n\n        assertThat(symbolTable.scopes).containsExactly(scope1, scope2)\n    }\n\n    @Test\n    fun doNotReturnScopeIfNotIdentified() {\n        val symbolTable = SymbolTableImpl()\n        assertThat(symbolTable.getScopeFor(newAstNodeForTest(\"foo\"))).isNull()\n    }\n\n    @Test\n    fun returnScopeForSymbol() {\n        val node1 = newAstNodeForTest(\"foo\")\n        val scope1 = ScopeImpl(null, node1, isAutonomousTransaction = false, hasExceptionHandler = false)\n\n        val node2 = newAstNodeForTest(\"bar\")\n        val scope2 = ScopeImpl(null, node2, isAutonomousTransaction = false, hasExceptionHandler = false)\n\n        val symbolTable = SymbolTableImpl()\n        symbolTable.addScope(scope1)\n        symbolTable.addScope(scope2)\n\n        assertThat(symbolTable.getScopeFor(node1)).isEqualTo(scope1)\n        assertThat(symbolTable.getScopeFor(node2)).isEqualTo(scope2)\n    }\n\n    @Test\n    fun returnSymbolForNode() {\n        val node = newAstNodeForTest(\"foo\")\n        val node2 = newAstNodeForTest(\"bar\")\n        val scope =\n            ScopeImpl(null, newAstNodeForTest(\"scope\"), isAutonomousTransaction = false, hasExceptionHandler = false)\n\n        val symbolTable = SymbolTableImpl()\n        val symbol = symbolTable.declareSymbol(node, Kind.CURSOR, scope, UnknownDatatype)\n\n        assertThat(symbolTable.symbols.find { it.declaration == node }).isEqualTo(symbol)\n        assertThat(symbolTable.symbols.find { it.declaration == node2 }).isNull()\n    }\n\n    @Test\n    fun returnScopeForSymbolForNode() {\n        val node = newAstNodeForTest(\"foo\")\n        val node2 = newAstNodeForTest(\"bar\")\n        val scope =\n            ScopeImpl(null, newAstNodeForTest(\"scope\"), isAutonomousTransaction = false, hasExceptionHandler = false)\n\n        val symbolTable = SymbolTableImpl()\n        symbolTable.declareSymbol(node, Kind.CURSOR, scope, UnknownDatatype)\n\n        assertThat(symbolTable.symbols.find { it.declaration == node }?.scope).isEqualTo(scope)\n        assertThat(symbolTable.symbols.find { it.declaration == node2 }?.scope).isNull()\n    }\n\n    @Test\n    fun getSymbolsByKind() {\n        val scope =\n            ScopeImpl(null, newAstNodeForTest(\"scope\"), isAutonomousTransaction = false, hasExceptionHandler = false)\n\n        val node = newAstNodeForTest(\"foo\")\n\n        val symbolTable = SymbolTableImpl()\n        val symbol1 = symbolTable.declareSymbol(node, Kind.CURSOR, scope, UnknownDatatype)\n        val symbol2 = symbolTable.declareSymbol(node, Kind.VARIABLE, scope, UnknownDatatype)\n\n        assertThat(symbolTable.symbols.filter { it.kind == Kind.CURSOR }).containsExactly(symbol1)\n        assertThat(symbolTable.symbols.filter { it.kind == Kind.VARIABLE }).containsExactly(symbol2)\n        assertThat(symbolTable.symbols.filter { it.kind == Kind.PARAMETER }).isEmpty()\n    }\n\n    @Test\n    fun getSymbolsByName() {\n        val scope =\n            ScopeImpl(null, newAstNodeForTest(\"scope\"), isAutonomousTransaction = false, hasExceptionHandler = false)\n\n        val node1 = newAstNodeForTest(\"foo\")\n        val node2 = newAstNodeForTest(\"FOO\")\n\n        val symbolTable = SymbolTableImpl()\n        val symbol1 = symbolTable.declareSymbol(node1, Kind.CURSOR, scope, UnknownDatatype)\n        val symbol2 = symbolTable.declareSymbol(node2, Kind.VARIABLE, scope, UnknownDatatype)\n\n        assertThat(symbolTable.symbols.filter { it.name.equals(\"foo\", ignoreCase = true) }).containsExactly(symbol1, symbol2)\n        assertThat(symbolTable.symbols.filter { it.name.equals(\"bar\", ignoreCase = true) }).isEmpty()\n    }\n\n    private fun newAstNodeForTest(value: String): AstNode {\n        val node = mock(AstNode::class.java)\n        `when`(node.tokenValue).thenReturn(value)\n        return node\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/kotlin/com/felipebz/zpa/symbols/SymbolVisitorTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\n@file:Suppress(\"RedundantSemicolon\")\n\npackage com.felipebz.zpa.symbols\n\nimport com.felipebz.zpa.TestPlSqlVisitorRunner\nimport com.felipebz.zpa.api.DmlGrammar\nimport com.felipebz.zpa.api.PlSqlGrammar\nimport com.felipebz.zpa.api.matchers.MethodMatcher.Companion.semantic\nimport com.felipebz.zpa.api.symbols.PlSqlType\nimport com.felipebz.zpa.api.symbols.Symbol\nimport com.felipebz.zpa.api.symbols.datatype.CharacterDatatype\nimport com.felipebz.zpa.api.symbols.datatype.NumericDatatype\nimport com.felipebz.zpa.api.symbols.datatype.RecordDatatype\nimport org.assertj.core.api.Assertions.*\nimport org.assertj.core.groups.Tuple\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.io.TempDir\nimport java.io.File\n\nclass SymbolVisitorTest {\n\n    @field:TempDir\n    lateinit var tempFolder: File\n\n    private val visitor = SymbolVisitor(DefaultTypeSolver(), ScopeImpl())\n\n    @Test\n    fun variableDeclaration() {\n        val symbols = scan(\"\"\"\ndeclare\n  variable number(5, 2);\n  text varchar2(5);\nbegin\n  variable := 1;\nend;\n\"\"\")\n        assertThat(symbols).hasSize(2)\n\n        val variable = symbols.find(\"variable\", 2, 3)\n        assertThat(variable.type).isEqualTo(PlSqlType.NUMERIC)\n        assertThat((variable.datatype as NumericDatatype).length).isEqualTo(5)\n        assertThat(variable.datatype.scale).isEqualTo(2)\n        assertThat(variable.references).containsExactly(\n            tuple(5, 3)\n        )\n        assertThat(variable.innerScope).isNull()\n\n        val text = symbols.find(\"text\", 3, 3)\n        assertThat(text.type).isEqualTo(PlSqlType.CHARACTER)\n        assertThat((text.datatype as CharacterDatatype).length).isEqualTo(5)\n        assertThat(text.references).isEmpty()\n        assertThat(text.innerScope).isNull()\n    }\n\n    @Test\n    fun variableDeclarationWithSubtype() {\n        val symbols = scan(\"\"\"\ndeclare\n  subtype my_number is number;\n  variable my_number;\nbegin\n  variable := 1;\nend;\n\"\"\")\n        assertThat(symbols).hasSize(2)\n\n        val type = symbols.find(\"my_number\", 2, 11)\n        assertThat(type.type).isEqualTo(PlSqlType.NUMERIC)\n        assertThat(type.innerScope).isNull()\n\n        val variable = symbols.find(\"variable\", 3, 3)\n        assertThat(variable.type).isEqualTo(PlSqlType.NUMERIC)\n        assertThat(variable.references).containsExactly(\n            tuple(5, 3))\n        assertThat(variable.innerScope).isNull()\n    }\n\n    @Test\n    fun associativeArray() {\n        val symbols = scan(\"\"\"\ndeclare\n  type my_array is table of number;\n  variable my_array;\n  n number;\nbegin\n  variable := my_array();\n  n := variable(1);\nend;\n\"\"\")\n        assertThat(symbols).hasSize(3)\n\n        val type = symbols.find(\"my_array\", 2, 8)\n        assertThat(type.type).isEqualTo(PlSqlType.ASSOCIATIVE_ARRAY)\n        assertThat(type.innerScope).isNull()\n\n        val variable = symbols.find(\"variable\", 3, 3)\n        assertThat(variable.type).isEqualTo(PlSqlType.ASSOCIATIVE_ARRAY)\n        assertThat(variable.references).containsExactly(\n            tuple(6, 3),\n            tuple(7, 8))\n        assertThat(variable.innerScope).isNull()\n\n        val methodCall = variable.usages[1].getFirstAncestor(PlSqlGrammar.METHOD_CALL)\n        assertThat(semantic(methodCall).plSqlType).isEqualTo(PlSqlType.NUMERIC)\n        assertThat(semantic(methodCall.firstChild).plSqlType).isEqualTo(PlSqlType.ASSOCIATIVE_ARRAY)\n    }\n\n    @Test\n    fun varray() {\n        val symbols = scan(\"\"\"\ndeclare\n  type my_array is varray(5) of number;\n  variable my_array;\n  n number;\nbegin\n  variable := my_array();\n  n := variable(1);\nend;\n\"\"\")\n        assertThat(symbols).hasSize(3)\n\n        val type = symbols.find(\"my_array\", 2, 8)\n        assertThat(type.type).isEqualTo(PlSqlType.ASSOCIATIVE_ARRAY)\n        assertThat(type.innerScope).isNull()\n\n        val variable = symbols.find(\"variable\", 3, 3)\n        assertThat(variable.type).isEqualTo(PlSqlType.ASSOCIATIVE_ARRAY)\n        assertThat(variable.references).containsExactly(\n            tuple(6, 3),\n            tuple(7, 8))\n        assertThat(variable.innerScope).isNull()\n\n        val methodCall = variable.usages[1].getFirstAncestor(PlSqlGrammar.METHOD_CALL)\n        assertThat(semantic(methodCall).plSqlType).isEqualTo(PlSqlType.NUMERIC)\n        assertThat(semantic(methodCall.firstChild).plSqlType).isEqualTo(PlSqlType.ASSOCIATIVE_ARRAY)\n    }\n\n    @Test\n    fun record() {\n        val symbols = scan(\"\"\"\ndeclare\n  type my_record is record (x number);\n  variable my_record;\nbegin\n  null;\nend;\n\"\"\")\n        assertThat(symbols).hasSize(2)\n\n        val type = symbols.find(\"my_record\", 2, 8)\n        assertThat(type.type).isEqualTo(PlSqlType.RECORD)\n        assertThat(type.innerScope).isNull()\n\n        val datatype = type.datatype as RecordDatatype\n        assertThat(datatype.name).isEqualTo(\"MY_RECORD\");\n\n        val variable = symbols.find(\"variable\", 3, 3)\n        assertThat(variable.type).isEqualTo(PlSqlType.RECORD)\n        assertThat(variable.references).isEmpty()\n    }\n\n    @Test\n    fun recordInProcedure() {\n        val symbols = scan(\"\"\"\ncreate or replace procedure my_proc is\n  type my_record is record (x number);\nbegin\n  null;\nend;\n\"\"\")\n        assertThat(symbols).hasSize(2) // TODO\n\n        val type = symbols.find(\"my_record\", 2, 8)\n        assertThat(type.type).isEqualTo(PlSqlType.RECORD)\n        assertThat(type.innerScope).isNull()\n\n        val datatype = type.datatype as RecordDatatype\n        assertThat(datatype.name).isEqualTo(\"MY_RECORD\");\n    }\n\n    @Test\n    fun recordInPackage() {\n        val symbols = scan(\"\"\"\ncreate or replace package my_pack is\n  type my_record is record (x number);\nend;\n\"\"\")\n        assertThat(symbols).hasSize(2) // TODO\n\n        val type = symbols.find(\"my_record\", 2, 8)\n        assertThat(type.type).isEqualTo(PlSqlType.RECORD)\n        assertThat(type.innerScope).isNull()\n\n        val datatype = type.datatype as RecordDatatype\n        assertThat(datatype.name).isEqualTo(\"MY_PACK.MY_RECORD\");\n    }\n\n    @Test\n    fun forLoop() {\n        val symbols = scan(\"\"\"\nbegin\n  for i in 1..2 loop\n    null;\n  end loop;\nend;\n\"\"\")\n        assertThat(symbols).hasSize(1)\n\n        val i = symbols.find(\"i\", 2, 7)\n        assertThat(i.type).isEqualTo(PlSqlType.NUMERIC)\n        assertThat(i.references).isEmpty()\n        assertThat(i.innerScope).isNull()\n    }\n\n    @Test\n    fun forLoopRedeclaringVariable() {\n        val symbols = scan(\"\"\"\ndeclare\n  i number;\nbegin\n  for i in 1..2 loop\n    foo(i);\n  end loop;\n  foo(i);\nend;\n\"\"\")\n        assertThat(symbols).hasSize(2)\n\n        val i = symbols.find(\"i\", 2, 3)\n        assertThat(i.type).isEqualTo(PlSqlType.NUMERIC)\n        assertThat(i.references).containsExactly(\n            tuple(7, 7))\n        assertThat(i.innerScope).isNull()\n\n        val i2 = symbols.find(\"i\", 4, 7)\n        assertThat(i2.type).isEqualTo(PlSqlType.NUMERIC)\n        assertThat(i2.references).containsExactly(\n            tuple(5, 9))\n        assertThat(i2.innerScope).isNull()\n    }\n\n    @Test\n    fun forLoopWithExplicitDatatype() {\n        val symbols = scan(\"\"\"\nbegin\n  for i number(5) in 1..2 loop\n    null;\n  end loop;\nend;\n\"\"\")\n        assertThat(symbols).hasSize(1)\n\n        val i = symbols.find(\"i\", 2, 7)\n        assertThat(i.type).isEqualTo(PlSqlType.NUMERIC)\n        assertThat((i.datatype as NumericDatatype).length).isEqualTo(5)\n        assertThat(i.references).isEmpty()\n        assertThat(i.innerScope).isNull()\n    }\n\n    @Test\n    fun forLoopPairsOf() {\n        val symbols = scan(\"\"\"\nbegin\n  for i, v in pairs of x loop\n    null;\n  end loop;\nend;\n\"\"\")\n        assertThat(symbols).hasSize(2)\n\n        val i = symbols.find(\"i\", 2, 7)\n        assertThat(i.type).isEqualTo(PlSqlType.UNKNOWN)\n        assertThat(i.references).isEmpty()\n        assertThat(i.innerScope).isNull()\n\n        val v = symbols.find(\"v\", 2, 10)\n        assertThat(v.type).isEqualTo(PlSqlType.UNKNOWN)\n        assertThat(v.references).isEmpty()\n        assertThat(v.innerScope).isNull()\n    }\n\n    @Test\n    fun forAllLoop() {\n        val symbols = scan(\"\"\"\nbegin\n  forall foo in 1 .. 2\n  insert into tab values (var(foo).value);\nend;\n\"\"\")\n        assertThat(symbols).hasSize(1)\n\n        val foo = symbols.find(\"foo\", 2, 10)\n        assertThat(foo.type).isEqualTo(PlSqlType.NUMERIC)\n        assertThat(foo.references).containsExactly(\n            tuple(3, 31))\n        assertThat(foo.innerScope).isNull()\n    }\n\n    @Test\n    fun procedureArgument() {\n        val symbols = scan(\"\"\"\ncreate procedure foo(x number) is\nbegin\n  null;\nend;\n\"\"\")\n        assertThat(symbols).hasSize(2)\n\n        val foo = symbols.find(\"foo\", 1, 18)\n        assertThat(foo.type).isEqualTo(PlSqlType.UNKNOWN)\n        assertThat(foo.references).isEmpty()\n        assertThat(foo.innerScope?.symbols).hasSize(1)\n\n        val x = symbols.find(\"x\", 1, 22)\n        assertThat(x.type).isEqualTo(PlSqlType.NUMERIC)\n        assertThat(x.references).isEmpty()\n        assertThat(x.innerScope).isNull()\n    }\n\n    @Test\n    fun functionArgument() {\n        val symbols = scan(\"\"\"\ncreate function foo(x number) return number is\nbegin\n  null;\nend;\n\"\"\")\n        assertThat(symbols).hasSize(2)\n\n        val foo = symbols.find(\"foo\", 1, 17)\n        assertThat(foo.type).isEqualTo(PlSqlType.NUMERIC)\n        assertThat(foo.references).isEmpty()\n        assertThat(foo.innerScope?.symbols).hasSize(1)\n\n        val x = symbols.find(\"x\", 1, 21)\n        assertThat(x.type).isEqualTo(PlSqlType.NUMERIC)\n        assertThat(x.references).isEmpty()\n        assertThat(x.innerScope).isNull()\n    }\n\n    @Test\n    fun packageSpecificationVariable() {\n        val symbols = scan(\"\"\"\ncreate package pkg as\n  variable number;\nend;\n\"\"\")\n        assertThat(symbols).hasSize(2)\n\n        val pkg = symbols.find(\"pkg\", 1, 16)\n        assertThat(pkg.type).isEqualTo(PlSqlType.UNKNOWN)\n        assertThat(pkg.references).isEmpty()\n        assertThat(pkg.innerScope?.symbols).hasSize(1)\n\n        val variable = symbols.find(\"variable\", 2, 3)\n        assertThat(variable.type).isEqualTo(PlSqlType.NUMERIC)\n        assertThat(variable.references).isEmpty()\n        assertThat(variable.innerScope).isNull()\n    }\n\n    @Test\n    fun packageBodyVariable() {\n        val symbols = scan(\"\"\"\ncreate package body pkg as\n  variable number;\nend;\n\"\"\")\n        assertThat(symbols).hasSize(2)\n\n        val pkg = symbols.find(\"pkg\", 1, 21)\n        assertThat(pkg.type).isEqualTo(PlSqlType.UNKNOWN)\n        assertThat(pkg.references).isEmpty()\n        assertThat(pkg.innerScope?.symbols).hasSize(1)\n\n        val variable = symbols.find(\"variable\", 2, 3)\n        assertThat(variable.type).isEqualTo(PlSqlType.NUMERIC)\n        assertThat(variable.references).isEmpty()\n        assertThat(variable.innerScope).isNull()\n    }\n\n    @Test\n    fun packageSpecAndBodyOnSameFile() {\n        val symbols = scan(\"\"\"\ncreate package pkg as\n  variable number;\nend;\ncreate package body pkg as\n  variable2 number;\n  \nbegin\n  variable := 0;\n  variable2 := 0;\nend;\n\"\"\")\n        assertThat(symbols).hasSize(3)\n\n        val pkg = symbols.find(\"pkg\", 1, 16)\n        assertThat(pkg.type).isEqualTo(PlSqlType.UNKNOWN)\n        assertThat(pkg.references).containsExactly(tuple(4, 21))\n        assertThat(pkg.innerScope?.symbols).hasSize(1)\n\n        val variable = symbols.find(\"variable\", 2, 3)\n        assertThat(variable.type).isEqualTo(PlSqlType.NUMERIC)\n        assertThat(variable.references).containsExactly(tuple(8, 3))\n        assertThat(variable.innerScope).isNull()\n\n        val variable2 = symbols.find(\"variable2\", 5, 3)\n        assertThat(variable2.type).isEqualTo(PlSqlType.NUMERIC)\n        assertThat(variable2.references).containsExactly(tuple(9, 3))\n        assertThat(variable2.innerScope).isNull()\n\n        assertThat(variable2.scope.outer).isEqualTo(variable.scope)\n    }\n\n    @Test\n    fun cursor() {\n        val symbols = scan(\"\"\"\ndeclare\n  cursor cur(c number) is\n    select 1 from dual;\n\n  variable cur%rowtype;\nbegin\n  open cur(1);\n  fetch cur into variable;\n  close cur;\nend;\n\"\"\")\n        assertThat(symbols).hasSize(3)\n\n        val cur = symbols.find(\"cur\", 2, 10)\n        assertThat(cur.type).isEqualTo(PlSqlType.UNKNOWN)\n        assertThat(cur.references).containsExactly(\n            tuple(5, 12),\n            tuple(7, 8),\n            tuple(8, 9),\n            tuple(9, 9))\n        assertThat(cur.innerScope?.symbols).hasSize(1)\n\n        val c = symbols.find(\"c\", 2, 14)\n        assertThat(c.type).isEqualTo(PlSqlType.NUMERIC)\n        assertThat(c.references).isEmpty()\n        assertThat(c.innerScope).isNull()\n\n        val variable = symbols.find(\"variable\", 5, 3)\n        assertThat(variable.type).isEqualTo(PlSqlType.ROWTYPE)\n        assertThat(variable.references).containsExactly(\n            tuple(8, 18))\n        assertThat(variable.innerScope).isNull()\n    }\n\n    @Test\n    fun exception() {\n        val symbols = scan(\"\"\"\ndeclare\n  ex exception;\nbegin\n  null;\nexception\n  when ex then\n    null;\nend;\n\"\"\")\n        assertThat(symbols).hasSize(1)\n\n        val ex = symbols.find(\"ex\", 2, 3)\n        assertThat(ex.type).isEqualTo(PlSqlType.EXCEPTION)\n        assertThat(ex.references).containsExactly(\n            tuple(6, 8))\n        assertThat(ex.innerScope).isNull()\n    }\n\n    @Test\n    fun trigger() {\n        val symbols = scan(\"\"\"\ncreate trigger baz before insert or delete on tab for each row\ndeclare\n  variable number;\nbegin\n  variable := :old.id;\nend;\n\"\"\")\n        assertThat(symbols).hasSize(2)\n\n        val baz = symbols.find(\"baz\", 1, 16)\n        assertThat(baz.type).isEqualTo(PlSqlType.UNKNOWN)\n        assertThat(baz.references).isEmpty()\n        assertThat(baz.innerScope?.symbols).hasSize(1)\n\n        val variable = symbols.find(\"variable\", 3, 3)\n        assertThat(variable.type).isEqualTo(PlSqlType.NUMERIC)\n        assertThat(variable.references).containsExactly(\n            tuple(5, 3))\n        assertThat(variable.innerScope).isNull()\n        assertThat(variable.scope.identifier).isEqualTo(\"BAZ\")\n        assertThat(variable.scope.type).isEqualTo(PlSqlGrammar.CREATE_TRIGGER)\n    }\n\n    @Test\n    fun fullVariableReference() {\n        val symbols = scan(\"\"\"\ncreate procedure foo is\n  x number;\nbegin\n  x := 1;\n  foo.x := 1;\n  bar.x := 1;\nend;\n\"\"\")\n        assertThat(symbols).hasSize(2)\n\n        val foo = symbols.find(\"foo\", 1, 18)\n        assertThat(foo.type).isEqualTo(PlSqlType.UNKNOWN)\n        assertThat(foo.references).containsExactly(\n            tuple(5, 3))\n        assertThat(foo.innerScope?.symbols).hasSize(1)\n\n        val x = symbols.find(\"x\", 2, 3)\n        assertThat(x.type).isEqualTo(PlSqlType.NUMERIC)\n        assertThat(x.references).containsExactly(\n            tuple(4, 3),\n            tuple(5, 7))\n        assertThat(x.innerScope).isNull()\n    }\n\n    @Test\n    fun fullVariableReferenceForOuterScope() {\n        val symbols = scan(\"\"\"\ncreate procedure foo is\n  x number;\n  \n  procedure bar is\n  begin\n    foo.x := 1;\n  end;\nbegin\n  null;\nend;\n\"\"\")\n        assertThat(symbols).hasSize(3)\n\n        val foo = symbols.find(\"foo\", 1, 18)\n        assertThat(foo.type).isEqualTo(PlSqlType.UNKNOWN)\n        assertThat(foo.references).containsExactly(\n            tuple(6, 5))\n        assertThat(foo.innerScope?.symbols).hasSize(2)\n\n        val x = symbols.find(\"x\", 2, 3)\n        assertThat(x.type).isEqualTo(PlSqlType.NUMERIC)\n        assertThat(x.references).containsExactly(\n            tuple(6, 9))\n        assertThat(x.innerScope).isNull()\n\n        val bar = symbols.find(\"bar\", 4, 13)\n        assertThat(bar.type).isEqualTo(PlSqlType.UNKNOWN)\n        assertThat(bar.references).isEmpty()\n        assertThat(bar.innerScope?.symbols).isEmpty()\n    }\n\n    @Test\n    fun variableReferenceWithPath() {\n        val symbols = scan(\"\"\"\nprocedure foo is\n  cursor cur(x number) is\n  select cur.x from dual;\nbegin\n  null;\nend;\n/\n\"\"\")\n        assertThat(symbols).hasSize(3)\n\n        val foo = symbols.find(\"foo\", 1, 11)\n        assertThat(foo.type).isEqualTo(PlSqlType.UNKNOWN)\n        assertThat(foo.references).isEmpty()\n        assertThat(foo.innerScope?.symbols).hasSize(1)\n\n        val x = symbols.find(\"x\", 2, 14)\n        assertThat(x.type).isEqualTo(PlSqlType.NUMERIC)\n        assertThat(x.references).containsExactly(\n            tuple(3, 14))\n        assertThat(x.innerScope).isNull()\n    }\n\n    @Test\n    fun symbolsWithQuotedIdentifiers() {\n        val symbols = scan(\n            \"\"\"\ndeclare\n  \"VAR\" number;\n  \"Var\" number;\n  \"var\" number;\nbegin\n  var := 1;\n  \"VAR\" := 1;\n  \"Var\" := 1;\n  \"var\" := 1;\nend;\n\"\"\"\n        )\n        assertThat(symbols).hasSize(3)\n\n        val var1 = symbols.find(\"var\", 2, 3)\n        assertThat(var1.type).isEqualTo(PlSqlType.NUMERIC)\n        assertThat(var1.references).containsExactly(\n            tuple(6, 3),\n            tuple(7, 3),\n        )\n        assertThat(var1.innerScope).isNull()\n\n        val var2 = symbols.find(\"\\\"Var\\\"\", 3, 3)\n        assertThat(var2.type).isEqualTo(PlSqlType.NUMERIC)\n        assertThat(var2.references).containsExactly(\n            tuple(8, 3),\n        )\n        assertThat(var2.innerScope).isNull()\n\n        val var3 = symbols.find(\"\\\"var\\\"\", 4, 3)\n        assertThat(var3.type).isEqualTo(PlSqlType.NUMERIC)\n        assertThat(var3.references).containsExactly(\n            tuple(9, 3),\n        )\n        assertThat(var3.innerScope).isNull()\n    }\n\n    @Test\n    fun variableDeclarationWithConstantVariableForLength() {\n        val symbols = scan(\n            \"\"\"\ndeclare\n  const_length constant number := 20;\n  const_scale constant number := 5;\n  variable number(const_length, const_scale);\n  text varchar2(const_length);\nbegin\n  variable := 1;\nend;\n\"\"\"\n        )\n        assertThat(symbols).hasSize(4)\n\n        val variable = symbols.find(\"variable\", 4, 3)\n        assertThat(variable.type).isEqualTo(PlSqlType.NUMERIC)\n        assertThat((variable.datatype as NumericDatatype).length).isNull()\n        assertThat(variable.datatype.scale).isNull()\n        assertThat(variable.references).containsExactly(\n            tuple(7, 3)\n        )\n        assertThat(variable.innerScope).isNull()\n\n        val text = symbols.find(\"text\", 5, 3)\n        assertThat(text.type).isEqualTo(PlSqlType.CHARACTER)\n        assertThat((text.datatype as CharacterDatatype).length).isNull()\n        assertThat(text.references).isEmpty()\n        assertThat(text.innerScope).isNull()\n    }\n\n    @Test\n    fun selectWithFunctionDeclaration() {\n        val symbols = scan(\n            \"\"\"\nwith \n  function func return number is \n  begin\n    return 1; \n  end;\nselect func\n\"\"\"\n        )\n        assertThat(symbols).hasSize(1)\n\n        val func = symbols.find(\"func\", 2, 12)\n        assertThat(func.type).isEqualTo(PlSqlType.NUMERIC)\n        assertThat(func.references).containsExactly(\n            tuple(6, 8)\n        )\n        assertThat(func.scope.type).isEqualTo(DmlGrammar.SELECT_EXPRESSION)\n        assertThat(func.innerScope).isNotNull()\n    }\n\n    private fun scan(contents: String): List<Symbol> {\n        val file = tempFolder.resolve(\"test.sql\")\n        file.writeText(contents.trim())\n\n        TestPlSqlVisitorRunner.scanFile(file, null, visitor)\n        return visitor.symbols\n    }\n\n    private fun List<Symbol>.find(name: String, line: Int, column: Int): Symbol {\n        val symbol = this.firstOrNull {\n            it.name.equals(name, ignoreCase = true) &&\n                it.declaration.token.line == line &&\n                it.declaration.token.column == offset(column)\n        }\n        return symbol ?: fail(\"No symbol named $name was found at line $line and column ${offset(column)}\")\n    }\n\n    private val Symbol.references: List<Tuple>\n        get() = this.usages.map { tuple(it.token.line, it.token.column + 1) }\n\n    private fun offset(offset: Int): Int {\n        return offset - 1\n    }\n\n}\n"
  },
  {
    "path": "zpa-core/src/test/resources/metadata/metadata.json",
    "content": "{\n    \"alerts\": [\"foo\", \"bar\"],\n    \"blocks\": [\n        { \"name\": \"foo\", \"items\": [\"item1\", \"item2\"] },\n        { \"name\": \"bar\", \"items\": [\"item1\", \"item2\"] }\n    ],\n    \"lovs\": [\"foo\", \"bar\"]\n}\n"
  },
  {
    "path": "zpa-core/src/test/resources/metrics/comments.sql",
    "content": "begin\n  -- single line\n  /*\n   * multiple lines\n   */\n  null;\nend;"
  },
  {
    "path": "zpa-core/src/test/resources/metrics/lines.sql",
    "content": "begin\n  -- comments\n    \n  foo := bar;\nend;"
  },
  {
    "path": "zpa-core/src/test/resources/metrics/lines_of_code.sql",
    "content": "begin\n  -- comments\n  \n  null;  \n  foo := bar;\nend;"
  },
  {
    "path": "zpa-core/src/test/resources/metrics/methods.sql",
    "content": "create package pkg is\n  procedure test is begin null; end;\n  function foo return number is begin null; end;\nend;\n/\ncreate procedure test is begin null; end;\n/\ncreate function foo return number is begin null; end;\n/"
  },
  {
    "path": "zpa-core/src/test/resources/metrics/no_sonar.sql",
    "content": "begin\n  null;\n  null; -- NOSONAR\n  null; -- NOSONAR\n  null;\nend;"
  },
  {
    "path": "zpa-core/src/test/resources/metrics/statements.sql",
    "content": "begin\n  null;\n  for i in 1..2 loop\n    if i = 1 then\n      print(i);\n    end if;\n  end loop;\nend;"
  },
  {
    "path": "zpa-core/src/test/resources/org/sonar/l10n/languageKey/rules/plsql/ruleWithExternalInfo.html",
    "content": "description for ruleWithExternalInfo"
  },
  {
    "path": "zpa-core/src/test/resources/org/sonar/l10n/languageKey/rules/repoKey/ruleWithExternalInfo.html",
    "content": "description for ruleWithExternalInfo"
  },
  {
    "path": "zpa-core/src/test/resources/org/sonar/l10n/languageKey.properties",
    "content": "ruleWithExternalInfo.name=external name for ruleWithExternalInfo\nruleWithExternalInfo.param.param1Key=description for param1\n"
  },
  {
    "path": "zpa-core/src/test/resources/org/sonar/l10n/languageWithoutBundle/empty.txt",
    "content": ""
  },
  {
    "path": "zpa-toolkit/build.gradle.kts",
    "content": "import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar\n\nplugins {\n    id(\"com.felipebz.zpa.build-conventions\")\n    alias(libs.plugins.shadow)\n}\n\ndependencies {\n    implementation(libs.flr.xpath)\n    implementation(libs.flr.toolkit)\n    implementation(libs.flatlaf)\n    implementation(project(\":zpa-core\"))\n}\n\nval shadowJar = tasks.named<ShadowJar>(\"shadowJar\") {\n    minimize {\n        exclude(dependency(\"com.formdev:flatlaf\"))\n        exclude(dependency(\"jaxen:jaxen\"))\n    }\n    archiveClassifier.set(\"\")\n    manifest {\n        attributes(mapOf(\n            \"Main-Class\" to \"com.felipebz.zpa.toolkit.ZpaToolkitKt\",\n            \"Add-Opens\" to \"java.desktop/sun.awt.shell\"\n        ))\n    }\n}\n\ntasks.build {\n    dependsOn(shadowJar)\n}\n\ntasks.jar {\n    enabled = false\n}\n\npublishing {\n    publications.withType<MavenPublication> {\n        artifact(shadowJar)\n    }\n}\n\ndescription = \"ZPA Toolkit\"\n"
  },
  {
    "path": "zpa-toolkit/src/main/kotlin/com/felipebz/flr/internal/toolkit/ConfigurationPropertyPanel.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.flr.internal.toolkit\n\nimport java.awt.Color\nimport java.awt.GridBagConstraints\nimport java.awt.GridBagLayout\nimport java.awt.Insets\nimport java.io.Serializable\nimport javax.swing.*\n\ninternal class ConfigurationPropertyPanel(name: String, description: String) : Serializable {\n    val panel: JPanel = JPanel(GridBagLayout())\n    val valueTextField: JTextField\n    val errorMessageLabel: JLabel\n\n    init {\n        val constraints = GridBagConstraints()\n        constraints.fill = GridBagConstraints.HORIZONTAL\n        constraints.weightx = 1.0\n        constraints.gridx = 0\n        constraints.anchor = GridBagConstraints.NORTH\n        constraints.insets = Insets(3, 10, 3, 10)\n        panel.border = BorderFactory.createTitledBorder(name)\n        val descriptionLabel = JLabel(description)\n        panel.add(descriptionLabel, constraints)\n        valueTextField = JTextField()\n        panel.add(valueTextField, constraints)\n        errorMessageLabel = JLabel()\n        errorMessageLabel.foreground = Color.RED\n        panel.add(errorMessageLabel, constraints)\n        val constraints2 = GridBagConstraints()\n        constraints2.gridx = 0\n        constraints2.weighty = 1.0\n        panel.add(Box.createGlue(), constraints2)\n    }\n\n    companion object {\n        private const val serialVersionUID = 1L\n    }\n}\n"
  },
  {
    "path": "zpa-toolkit/src/main/kotlin/com/felipebz/flr/internal/toolkit/LineOffsets.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.flr.internal.toolkit\n\nimport com.felipebz.flr.api.Token\nimport kotlin.math.min\n\ninternal class LineOffsets(code: String) {\n    private val lineOffsets: MutableMap<Int, Int> = HashMap()\n    private val endOffset: Int\n\n    fun getStartOffset(token: Token): Int {\n        return getOffset(token.line, token.column)\n    }\n\n    fun getEndOffset(token: Token): Int {\n        return getOffset(token.endLine, token.endColumn)\n    }\n\n    fun getOffset(line: Int, column: Int): Int {\n        require(line >= 1)\n        require(column >= 0)\n        val lineOffset = lineOffsets[line]\n        return if (lineOffset != null) {\n            min(lineOffset + column, endOffset)\n        } else {\n            endOffset\n        }\n    }\n\n    companion object {\n        private val NEWLINE_REGEX = Regex(\"\\\\R\")\n    }\n\n    init {\n        var currentOffset = 0\n        val lines = code.split(NEWLINE_REGEX).toTypedArray()\n        for (line in 1..lines.size) {\n            lineOffsets[line] = currentOffset\n            currentOffset += lines[line - 1].length + 1\n        }\n        endOffset = currentOffset - 1\n    }\n}\n"
  },
  {
    "path": "zpa-toolkit/src/main/kotlin/com/felipebz/flr/internal/toolkit/NoWrapJTextPane.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.flr.internal.toolkit\n\nimport java.awt.Dimension\nimport javax.swing.JTextPane\n\nclass NoWrapJTextPane : JTextPane() {\n    override fun getScrollableTracksViewportWidth(): Boolean {\n        return (getUI().getPreferredSize(this).width\n            <= parent.size.width)\n    }\n\n    override fun getPreferredSize(): Dimension {\n        return getUI().getPreferredSize(this)\n    }\n}\n"
  },
  {
    "path": "zpa-toolkit/src/main/kotlin/com/felipebz/flr/internal/toolkit/SourceCodeModel.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.flr.internal.toolkit\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.flr.impl.ast.AstXmlPrinter\nimport com.felipebz.flr.toolkit.ConfigurationModel\nimport com.felipebz.zpa.symbols.DefaultTypeSolver\nimport com.felipebz.zpa.symbols.SymbolVisitor\nimport com.felipebz.zpa.api.PlSqlVisitorContext\nimport com.felipebz.zpa.api.symbols.SymbolTable\nimport java.io.File\nimport java.nio.charset.Charset\nimport kotlin.system.measureNanoTime\n\ninternal class SourceCodeModel(private val configurationModel: ConfigurationModel) {\n    lateinit var sourceCode: String\n        private set\n    lateinit var astNode: AstNode\n        private set\n    lateinit var symbolTable: SymbolTable\n        private set\n    var parseTime: Long = 0\n        private set\n\n    fun setSourceCode(source: File, charset: Charset) {\n        setSourceCode(source.readText(charset))\n    }\n\n    fun setSourceCode(sourceCode: String) {\n        parseTime = measureNanoTime {\n            astNode = configurationModel.parser.parse(sourceCode)\n        }\n        this.sourceCode = sourceCode\n        loadSymbolTable()\n    }\n\n    val xml: String\n        get() = AstXmlPrinter.print(astNode)\n\n    private fun loadSymbolTable() {\n        val symbolVisitor = SymbolVisitor(DefaultTypeSolver())\n        symbolVisitor.context = PlSqlVisitorContext(astNode, null, null)\n        symbolVisitor.init()\n        symbolVisitor.visitFile(astNode)\n        symbolTable = symbolVisitor.symbolTable\n    }\n}\n"
  },
  {
    "path": "zpa-toolkit/src/main/kotlin/com/felipebz/flr/internal/toolkit/SourceCodeStyler.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.flr.internal.toolkit\n\nimport com.felipebz.flr.api.Token\nimport com.felipebz.zpa.api.PlSqlKeyword\nimport com.felipebz.zpa.api.PlSqlPunctuator\nimport com.felipebz.zpa.api.PlSqlTokenType\nimport java.awt.Color\nimport javax.swing.text.*\n\n\ninternal object SourceCodeStyler {\n    val defaultStyle: Style = StyleContext.getDefaultStyleContext().getStyle(StyleContext.DEFAULT_STYLE)\n    private val keywordStyle = SimpleAttributeSet().apply {\n        StyleConstants.setForeground(this, Color.BLUE)\n        StyleConstants.setBold(this, true)\n    }\n    private val literalStyle = SimpleAttributeSet().apply {\n        StyleConstants.setForeground(this, Color(0x800080))\n    }\n    private val commentStyle = SimpleAttributeSet().apply {\n        StyleConstants.setForeground(this, Color(0x078C39))\n    }\n    private val punctuatorStyle = SimpleAttributeSet().apply {\n        StyleConstants.setForeground(this, Color.RED)\n    }\n\n    fun style(styledDocument: StyledDocument, lineOffsets: LineOffsets, tokens: List<Token>) {\n        styledDocument.setCharacterAttributes(0, styledDocument.length, defaultStyle, true)\n\n        for (token in tokens) {\n            for (trivia in token.trivia) {\n                styledDocument.setCharacterAttributes(\n                    lineOffsets.getStartOffset(trivia.token),\n                    trivia.token.originalValue.length,\n                    commentStyle,\n                    false\n                )\n            }\n            val style = when (token.type) {\n                is PlSqlKeyword -> keywordStyle\n                is PlSqlTokenType -> literalStyle\n                is PlSqlPunctuator -> if (token.type != PlSqlPunctuator.SEMICOLON) punctuatorStyle else null\n                else -> null\n            }\n            if (style != null) {\n                styledDocument.setCharacterAttributes(\n                    lineOffsets.getStartOffset(token),\n                    token.originalValue.length,\n                    style,\n                    false\n                )\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "zpa-toolkit/src/main/kotlin/com/felipebz/flr/internal/toolkit/ToolkitPresenter.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.flr.internal.toolkit\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.flr.api.RecognitionException\nimport com.felipebz.flr.api.Trivia\nimport com.felipebz.flr.toolkit.ConfigurationModel\nimport com.felipebz.flr.toolkit.ConfigurationProperty\nimport com.felipebz.flr.xpath.api.AstNodeXPathQuery.Companion.create\nimport java.awt.Point\nimport java.io.IOException\nimport java.io.PrintWriter\nimport java.io.StringWriter\nimport java.io.Writer\nimport java.lang.Thread.UncaughtExceptionHandler\nimport java.nio.file.Files\nimport java.nio.file.Paths\n\ninternal class ToolkitPresenter(private val configurationModel: ConfigurationModel, private val model: SourceCodeModel) {\n    private lateinit var view: ToolkitView\n\n    fun setView(view: ToolkitView) {\n        this.view = view\n    }\n\n    fun checkInitialized() {\n        check(::view.isInitialized) { \"the view must be set before the presenter can be ran\" }\n    }\n\n    fun initUncaughtExceptionsHandler() {\n        Thread.currentThread().uncaughtExceptionHandler = UncaughtExceptionHandler { _, e ->\n            val result: Writer = StringWriter()\n            val printWriter = PrintWriter(result)\n            if (e is RecognitionException) {\n                printWriter.append(e.message)\n            } else {\n                e.printStackTrace(printWriter)\n            }\n            view.appendToConsole(result.toString())\n            view.setFocusOnConsoleView()\n        }\n    }\n\n    fun initConfigurationTab() {\n        for (configurationProperty in configurationModel.properties) {\n            view.addConfigurationProperty(configurationProperty.name, configurationProperty.description)\n            view.setConfigurationPropertyValue(configurationProperty.name, configurationProperty.value)\n        }\n    }\n\n    fun run(title: String?) {\n        checkInitialized()\n        initUncaughtExceptionsHandler()\n        view.setTitle(title)\n        view.displaySourceCode(\"\", emptyList())\n        view.displayAst(null)\n        view.displayXml(\"\")\n        view.displayScope(null)\n        view.displayStatistics(0, 0, 0, 0)\n        view.disableXPathEvaluateButton()\n        initConfigurationTab()\n        view.run()\n    }\n\n    fun onSourceCodeOpenButtonClick() {\n        val fileToParse = view.pickFileToParse()\n        if (fileToParse != null) {\n            view.clearConsole()\n            try {\n                view.displaySourceCode(\n                    String(Files.readAllBytes(Paths.get(fileToParse.path)), configurationModel.charset), emptyList())\n            } catch (e: IOException) {\n                throw RuntimeException(e)\n            }\n            model.setSourceCode(fileToParse, configurationModel.charset)\n            val symbolTable = model.symbolTable\n            view.displaySourceCode(model.sourceCode, model.astNode.tokens)\n            view.displayAst(model.astNode)\n            view.displayXml(model.xml)\n            view.displayScope(symbolTable.scopes.firstOrNull())\n            view.displayStatistics(model.sourceCode.length, model.astNode.lastTokenOrNull?.endLine, model.astNode.tokens.size, model.parseTime)\n            view.scrollSourceCodeTo(Point(0, 0))\n            view.setFocusOnAbstractSyntaxTreeView()\n            view.enableXPathEvaluateButton()\n        }\n    }\n\n    fun onSourceCodeParseButtonClick() {\n        view.clearConsole()\n        val sourceCode = view.sourceCode\n        model.setSourceCode(sourceCode)\n        val symbolTable = model.symbolTable\n        val sourceCodeScrollbarPosition = view.sourceCodeScrollbarPosition\n        view.displaySourceCode(model.sourceCode, model.astNode.tokens)\n        view.displayAst(model.astNode)\n        view.displayXml(model.xml)\n        view.displayScope(symbolTable.scopes.firstOrNull())\n        view.displayStatistics(model.sourceCode.length, model.astNode.lastTokenOrNull?.endLine, model.astNode.tokens.size, model.parseTime)\n        view.scrollSourceCodeTo(sourceCodeScrollbarPosition)\n        view.setFocusOnAbstractSyntaxTreeView()\n        view.enableXPathEvaluateButton()\n    }\n\n    fun onXPathEvaluateButtonClick() {\n        val xpath = view.xPath ?: return\n        val xpathQuery = create<Any>(xpath)\n        view.clearConsole()\n        view.clearAstSelections()\n        view.clearSourceCodeHighlights()\n        var firstAstNode: AstNode? = null\n        for (resultObject in xpathQuery.selectNodes(model.astNode)) {\n            if (resultObject is AstNode) {\n                if (firstAstNode == null) {\n                    firstAstNode = resultObject\n                }\n                view.selectAstNode(resultObject)\n                if (resultObject.hasToken()) {\n                    view.highlightSourceCode(resultObject.token, resultObject.lastToken)\n                }\n            }\n        }\n        view.scrollAstTo(firstAstNode)\n        view.scrollSourceCodeTo(firstAstNode?.tokenOrNull)\n        view.setFocusOnAbstractSyntaxTreeView()\n    }\n\n    fun onSourceCodeKeyTyped() {\n        view.displayAst(null)\n        view.displayXml(\"\")\n        view.displayScope(null)\n        view.displayStatistics(0, 0, 0, 0)\n        view.clearSourceCodeHighlights()\n        view.disableXPathEvaluateButton()\n    }\n\n    fun onSourceCodeTextCursorMoved() {\n        view.clearAstSelections()\n        val astNode = view.astNodeFollowingCurrentSourceCodeTextCursorPosition\n        view.selectAstNode(astNode)\n        view.scrollAstTo(astNode)\n    }\n\n    fun onAstSelectionChanged() {\n        view.clearSourceCodeHighlights()\n        var firstAstNode: AstNode? = null\n        for (astNode in view.selectedAstNodes) {\n            if (firstAstNode == null) {\n                firstAstNode = astNode\n            }\n            if (astNode.hasToken()) {\n                view.highlightSourceCode(astNode.token, astNode.lastToken)\n            }\n        }\n\n        var firstTrivia: Trivia? = null\n        for (trivia in view.selectedTrivias) {\n            if (firstTrivia == null) {\n                firstTrivia = trivia\n            }\n            view.highlightSourceCode(trivia.token, trivia.tokens.last())\n        }\n\n        if (firstAstNode != null) {\n            view.scrollSourceCodeTo(firstAstNode.tokenOrNull)\n        } else {\n            view.scrollSourceCodeTo(firstTrivia?.token)\n        }\n    }\n\n    fun onSymbolSelectionChanged() {\n        view.clearSourceCodeHighlights()\n        var firstAstNode: AstNode? = null\n        for (astNode in view.selectedSymbolOrScopeTrees) {\n            if (firstAstNode == null) {\n                firstAstNode = astNode\n            }\n            view.highlightSourceCode(astNode.token, astNode.lastToken)\n        }\n        view.scrollSourceCodeTo(firstAstNode?.tokenOrNull)\n    }\n\n    fun onConfigurationPropertyFocusLost(name: String) {\n        val configurationProperty = requireNotNull(getConfigurationPropertyByName(name)) {\n            \"No such configuration property: $name\"\n        }\n        val newValueCandidate = checkNotNull(view.getConfigurationPropertyValue(name))\n        val errorMessage = configurationProperty.validate(newValueCandidate)\n        view.setConfigurationPropertyErrorMessage(configurationProperty.name, errorMessage)\n        if (\"\" == errorMessage) {\n            configurationProperty.value = newValueCandidate\n            configurationModel.setUpdatedFlag()\n        } else {\n            view.setFocusOnConfigurationPropertyField(name)\n            view.setFocusOnConfigurationView()\n        }\n    }\n\n    private fun getConfigurationPropertyByName(name: String): ConfigurationProperty? {\n        for (configurationProperty in configurationModel.properties) {\n            if (name == configurationProperty.name) {\n                return configurationProperty\n            }\n        }\n        return null\n    }\n}\n"
  },
  {
    "path": "zpa-toolkit/src/main/kotlin/com/felipebz/flr/internal/toolkit/ToolkitView.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.flr.internal.toolkit\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.flr.api.Token\nimport com.felipebz.flr.api.Trivia\nimport com.felipebz.zpa.api.symbols.Scope\nimport java.awt.Point\nimport java.io.File\n\n/**\n * Contract interface for the view.\n *\n * Note that *none* of the methods here-under should generate *any* event back to the presenter.\n * Only end-user interactions are supposed to generate events.\n */\ninternal interface ToolkitView {\n    /**\n     * Launch the application.\n     */\n    fun run()\n\n    /**\n     * Set the title of the application.\n     *\n     * @param title\n     */\n    fun setTitle(title: String?)\n\n    /**\n     * Prompt the user for a file to parse and return it.\n     *\n     * @return The file to parse, or null if no file was picked\n     */\n    fun pickFileToParse(): File?\n\n    /**\n     * Display the given HTML highlighted source code in the source code editor.\n     * Scrollbars state is undefined after a call to this method.\n     *\n     * @param newSourceCode The HTML highlighted source code\n     */\n    fun displaySourceCode(newSourceCode: String, tokens: List<Token>)\n\n    /**\n     * Display the abstract syntax tree view starting from a given node.\n     *\n     * @param astNode The root AST node or null if no abstract syntax tree must be shown\n     */\n    fun displayAst(astNode: AstNode?)\n\n    /**\n     * Display the given string in the XML view.\n     *\n     * @param xml The string to display\n     */\n    fun displayXml(xml: String)\n\n    /**\n     * Display the given scope.\n     *\n     * @param scope The scope to display\n     */\n    fun displayScope(scope: Scope?)\n\n    fun displayStatistics(numberOfCharacters: Int, numberOfLines: Int?, numberOfTokens: Int, parseTime: Long)\n\n    /**\n     * Get the current source code editor scrollbars' position point.\n     *\n     * @return The point\n     */\n    val sourceCodeScrollbarPosition: Point\n\n    /**\n     * Scroll the source code editor in order to make the given point visible.\n     *\n     * @param point to make visible\n     */\n    fun scrollSourceCodeTo(point: Point)\n\n    /**\n     * Get the source code currently entered in the source code editor.\n     *\n     * @return The source code\n     */\n    val sourceCode: String\n\n    /**\n     * Get the text currently entered in the XPath field.\n     *\n     * @return The XPath field text\n     */\n    val xPath: String?\n\n    /**\n     * Select the given AST node in the abstract syntax tree view.\n     *\n     * @param astNode The AST node to select, null will lead to a no operation\n     */\n    fun selectAstNode(astNode: AstNode?)\n\n    /**\n     * Clear all the selections in the abstract syntax tree view.\n     */\n    fun clearAstSelections()\n\n    /**\n     * Scroll the abstract syntax tree view in order to make the given AST node visible.\n     *\n     * @param astNode The AST node to make visible, null will lead to a no operation\n     */\n    fun scrollAstTo(astNode: AstNode?)\n\n    /**\n     * Highlight the given AST node in the source code editor.\n     *\n     * @param astNode The AST node to highlight\n     */\n    fun highlightSourceCode(startToken: Token, endToken: Token)\n\n    /**\n     * Clear all the highlights in the source code editor.\n     */\n    fun clearSourceCodeHighlights()\n\n    /**\n     * Scroll the source code editor in order to make the given token visible.\n     *\n     * @param astNode The token to make visible, null will lead to a no operation\n     */\n    fun scrollSourceCodeTo(astNode: Token?)\n\n    /**\n     * Disable the XPath evaluate button.\n     */\n    fun disableXPathEvaluateButton()\n\n    /**\n     * Enable the XPath evaluate button.\n     */\n    fun enableXPathEvaluateButton()\n\n    /**\n     * Get the AST node which follows the current source code editor text cursor position.\n     *\n     * @return The following AST node, or null if there is no such node\n     */\n    val astNodeFollowingCurrentSourceCodeTextCursorPosition: AstNode?\n\n    /**\n     * Get the list of nodes currently selected in the abstract syntax tree view.\n     *\n     * @return The list of selected AST nodes\n     */\n    val selectedAstNodes: List<AstNode>\n\n    val selectedTrivias: List<Trivia>\n\n    val selectedSymbolOrScopeTrees: List<AstNode>\n\n    /**\n     * Append the given message to the console view.\n     *\n     * @param message The message to append\n     */\n    fun appendToConsole(message: String?)\n\n    /**\n     * Set the focus on the console view.\n     */\n    fun setFocusOnConsoleView()\n\n    /**\n     * Set the focus on the abstract syntax tree view.\n     */\n    fun setFocusOnAbstractSyntaxTreeView()\n\n    /**\n     * Clear the console.\n     */\n    fun clearConsole()\n\n    /**\n     * Add a new configuration property to the configuration tab.\n     *\n     * @param name\n     * @param description\n     */\n    fun addConfigurationProperty(name: String, description: String)\n\n    /**\n     * Get the value currently entered in the configuration property field identified by the given name.\n     *\n     * @param name The name of the configuration property\n     * @return The current value of the field\n     */\n    fun getConfigurationPropertyValue(name: String): String\n\n    /**\n     * Set the current value of the configuration property field identified by the given name.\n     *\n     * @param name The name of the configuration property\n     * @param value The value to be set\n     */\n    fun setConfigurationPropertyValue(name: String, value: String)\n\n    /**\n     * Set the error message of the configuration property identified by the given name.\n     *\n     * @param name The name of the configuration property\n     * @param errorMessage The error message\n     */\n    fun setConfigurationPropertyErrorMessage(name: String, errorMessage: String)\n\n    /**\n     * Set the focus on the configuration field identified by the given name.\n     *\n     * @param name\n     */\n    fun setFocusOnConfigurationPropertyField(name: String)\n\n    /**\n     * Set the focus on the configuration view.\n     */\n    fun setFocusOnConfigurationView()\n}\n"
  },
  {
    "path": "zpa-toolkit/src/main/kotlin/com/felipebz/flr/internal/toolkit/ToolkitViewImpl.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.flr.internal.toolkit\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.flr.api.Token\nimport com.felipebz.flr.api.Trivia\nimport com.felipebz.zpa.api.symbols.Scope\nimport com.felipebz.zpa.api.symbols.Symbol\nimport java.awt.*\nimport java.awt.event.FocusAdapter\nimport java.awt.event.FocusEvent\nimport java.awt.geom.Rectangle2D\nimport java.io.File\nimport java.text.DecimalFormat\nimport java.util.*\nimport javax.swing.*\nimport javax.swing.event.DocumentEvent\nimport javax.swing.event.DocumentListener\nimport javax.swing.text.BadLocationException\nimport javax.swing.text.DefaultCaret\nimport javax.swing.text.DefaultHighlighter.DefaultHighlightPainter\nimport javax.swing.tree.*\nimport kotlin.time.DurationUnit\nimport kotlin.time.toDuration\n\ninternal class ToolkitViewImpl(@Transient val presenter: ToolkitPresenter) : JFrame(), ToolkitView {\n    private val tabbedPane = JTabbedPane()\n    private val astTree = JTree()\n    private val astTreeScrollPane = JScrollPane(astTree)\n    private val xmlTextArea = JTextArea()\n    private val xmlScrollPane = JScrollPane(xmlTextArea)\n    private val xmlPanel = JPanel(BorderLayout(10, 2))\n    private val consoleTextArea = JTextArea()\n    private val consoleScrollPane = JScrollPane(consoleTextArea)\n    private val configurationInnerPanel = JPanel(GridBagLayout())\n    private val configurationOuterPanel = JPanel(BorderLayout())\n    private val configurationScrollPane = JScrollPane(configurationOuterPanel)\n    private val configurationPropertiesPanels: MutableMap<String?, ConfigurationPropertyPanel> = HashMap()\n    private val symbolTree = JTree()\n    private val symbolTreeScrollPane = JScrollPane(symbolTree)\n    private val sourceCodeLabel = JLabel(\" Source Code\")\n    private val sourceCodeEditorPane = NoWrapJTextPane()\n    private val sourceCodeEditorScrollPane = JScrollPane(sourceCodeEditorPane)\n    private val sourceCodeOpenButton = JButton()\n    private val sourceCodeParseButton = JButton()\n    private val sourceCodeButtonsPanel = JPanel()\n    private val sourceCodePanel = JPanel(BorderLayout(0, 2))\n    private val splitPane = JSplitPane(JSplitPane.HORIZONTAL_SPLIT, sourceCodePanel, tabbedPane)\n    private val southPanel = JPanel(BorderLayout(0, 2))\n    private val xpathLabel = JLabel(\"  XPath query\")\n    private val xpathTextArea = JTextArea()\n    private val xpathTextAreaScrollPane = JScrollPane(xpathTextArea)\n    private val xpathPanel = JPanel(BorderLayout(10, 2))\n    private val fileChooser = JFileChooser()\n    private val xpathButton = JButton()\n    private val xpathButtonPanel = JPanel()\n    private val statisticsPanel = JPanel(FlowLayout(FlowLayout.LEADING))\n    private val statisticsInnerPanel = JPanel(GridLayout(3, 2, 10, 2))\n    private val inputSizeLabel = JLabel()\n    private val numberOfTokensLabel = JLabel()\n    private val parseTimeLabel = JLabel()\n\n    @Transient\n    private lateinit var lineOffsets: LineOffsets\n\n    @Transient\n    private val highlighter = DefaultHighlightPainter(Color(220, 240, 255))\n    private var sourceCodeTextCursorMovedEventDisabled = false\n    private var astSelectionEventDisabled = false\n    private var isSourceCodeFormatted = false\n\n    init {\n        initComponents()\n    }\n\n    private fun initComponents() {\n        setSize(1000, 700)\n        setLocationRelativeTo(null)\n        defaultCloseOperation = EXIT_ON_CLOSE\n        astTree.selectionModel.selectionMode = TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION\n        astTree.addTreeSelectionListener {\n            if (!astSelectionEventDisabled) {\n                presenter.onAstSelectionChanged()\n            }\n        }\n        symbolTree.selectionModel.selectionMode = TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION\n        symbolTree.addTreeSelectionListener {\n            presenter.onSymbolSelectionChanged()\n        }\n        consoleTextArea.isEditable = false\n        consoleTextArea.font = Font.decode(\"Monospaced\")\n        tabbedPane.tabPlacement = JTabbedPane.TOP\n        tabbedPane.add(\"AST\", astTreeScrollPane)\n        tabbedPane.add(\"Symbol table\", symbolTreeScrollPane)\n        tabbedPane.add(\"XML\", xmlPanel)\n        tabbedPane.add(\"Console\", consoleScrollPane)\n        tabbedPane.add(\"Configuration\", configurationScrollPane)\n        tabbedPane.add(\"Statistics\", statisticsPanel)\n        configurationOuterPanel.add(configurationInnerPanel, BorderLayout.NORTH)\n        configurationOuterPanel.add(Box.createGlue(), BorderLayout.CENTER)\n        sourceCodeEditorPane.font = Font.decode(\"Monospaced\")\n        (sourceCodeEditorPane.caret as DefaultCaret).updatePolicy = DefaultCaret.UPDATE_WHEN_ON_EDT\n        sourceCodeEditorPane.document.addDocumentListener(object : DocumentListener {\n            override fun removeUpdate(e: DocumentEvent) {\n                presenter.onSourceCodeKeyTyped()\n                clearSourceCodeHighlight()\n            }\n\n            override fun insertUpdate(e: DocumentEvent) {\n                presenter.onSourceCodeKeyTyped()\n                clearSourceCodeHighlight()\n            }\n\n            override fun changedUpdate(e: DocumentEvent) {\n                presenter.onSourceCodeKeyTyped()\n            }\n        })\n        sourceCodeEditorPane.addCaretListener {\n            if (!sourceCodeTextCursorMovedEventDisabled) {\n                presenter.onSourceCodeTextCursorMoved()\n            }\n        }\n        sourceCodeEditorScrollPane.addMouseWheelListener {\n            if (it.isControlDown) {\n                sourceCodeEditorPane.font = Font(\n                    sourceCodeEditorPane.font.name,\n                    sourceCodeEditorPane.font.style,\n                    if (it.unitsToScroll > 0) sourceCodeEditorPane.font.size - 2 else sourceCodeEditorPane.font.size + 2\n                )\n            }\n        }\n        sourceCodeOpenButton.text = \"Open Source File\"\n        sourceCodeOpenButton.addActionListener { presenter.onSourceCodeOpenButtonClick() }\n        sourceCodeParseButton.text = \"Parse Source Code\"\n        sourceCodeParseButton.addActionListener { presenter.onSourceCodeParseButtonClick() }\n        sourceCodeButtonsPanel.add(sourceCodeOpenButton)\n        sourceCodeButtonsPanel.add(sourceCodeParseButton)\n        sourceCodePanel.add(sourceCodeLabel, BorderLayout.NORTH)\n        sourceCodePanel.add(sourceCodeEditorScrollPane, BorderLayout.CENTER)\n        sourceCodePanel.add(sourceCodeButtonsPanel, BorderLayout.SOUTH)\n        splitPane.dividerLocation = width / 2\n        add(splitPane)\n\n        xmlPanel.add(xmlScrollPane, BorderLayout.CENTER)\n        xpathPanel.add(xpathLabel, BorderLayout.NORTH)\n        xpathPanel.add(Box.createHorizontalGlue(), BorderLayout.WEST)\n        xpathTextArea.text = \"//IDENTIFIER\"\n        xpathTextArea.rows = 8\n        xpathPanel.add(xpathTextAreaScrollPane, BorderLayout.CENTER)\n        xpathPanel.add(Box.createHorizontalGlue(), BorderLayout.EAST)\n        southPanel.add(xpathPanel, BorderLayout.NORTH)\n        xpathButton.text = \"Evaluate XPath\"\n        xpathButton.addActionListener { presenter.onXPathEvaluateButtonClick() }\n        xpathButtonPanel.add(xpathButton)\n        southPanel.add(xpathButtonPanel, BorderLayout.SOUTH)\n        xmlPanel.add(southPanel, BorderLayout.SOUTH)\n\n        statisticsInnerPanel.add(JLabel(\"Input size:\").apply { horizontalAlignment = JLabel.RIGHT })\n        statisticsInnerPanel.add(inputSizeLabel)\n        statisticsInnerPanel.add(JLabel(\"Numer of tokens:\").apply { horizontalAlignment = JLabel.RIGHT })\n        statisticsInnerPanel.add(numberOfTokensLabel)\n        statisticsInnerPanel.add(JLabel(\"Parse time:\").apply { horizontalAlignment = JLabel.RIGHT })\n        statisticsInnerPanel.add(parseTimeLabel)\n        statisticsPanel.add(statisticsInnerPanel)\n    }\n\n    override fun run() {\n        isVisible = true\n    }\n\n    override fun pickFileToParse(): File? {\n        return if (fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {\n            fileChooser.selectedFile\n        } else {\n            null\n        }\n    }\n\n    override fun displaySourceCode(newSourceCode: String, tokens: List<Token>) {\n        try {\n            sourceCodeTextCursorMovedEventDisabled = true\n            sourceCodeEditorPane.text = newSourceCode\n            lineOffsets = LineOffsets(newSourceCode)\n            SourceCodeStyler.style(sourceCodeEditorPane.styledDocument, lineOffsets, tokens)\n            isSourceCodeFormatted = tokens.isNotEmpty()\n        } finally {\n            sourceCodeTextCursorMovedEventDisabled = false\n        }\n    }\n\n    override fun displayAst(astNode: AstNode?) {\n        if (astNode == null) {\n            astTree.model = EMPTY_TREE_MODEL\n        } else {\n            val treeNode: TreeNode = getTreeNode(astNode)\n            astTree.model = DefaultTreeModel(treeNode)\n        }\n    }\n\n    override fun displayXml(xml: String) {\n        xmlTextArea.text = xml\n    }\n\n    override fun displayScope(scope: Scope?) {\n        if (scope == null) {\n            symbolTree.model = EMPTY_TREE_MODEL\n        } else {\n            val treeNode = getScopeTreeNode(scope)\n            symbolTree.model = DefaultTreeModel(treeNode)\n        }\n    }\n\n    override fun displayStatistics(numberOfCharacters: Int, numberOfLines: Int?, numberOfTokens: Int, parseTime: Long) {\n        val format = DecimalFormat(\"#,###\")\n        inputSizeLabel.text = \"${format.format(numberOfCharacters)} characters, ${format.format(numberOfLines)} lines\"\n        numberOfTokensLabel.text = format.format(numberOfTokens)\n        parseTimeLabel.text = parseTime.toDuration(DurationUnit.NANOSECONDS).toString(DurationUnit.MILLISECONDS, 2)\n    }\n\n    override val sourceCodeScrollbarPosition: Point\n        get() {\n            val x = sourceCodeEditorScrollPane.horizontalScrollBar.value\n            val y = sourceCodeEditorScrollPane.verticalScrollBar.value\n            return Point(x, y)\n        }\n\n    override fun scrollSourceCodeTo(point: Point) {\n        // http://stackoverflow.com/questions/8789371/java-jtextpane-jscrollpane-de-activate-automatic-scrolling\n        SwingUtilities.invokeLater {\n            sourceCodeEditorScrollPane.horizontalScrollBar.value = point.x\n            sourceCodeEditorScrollPane.verticalScrollBar.value = point.y\n        }\n    }\n\n    override val sourceCode: String\n        get() = sourceCodeEditorPane.text\n\n    override val xPath: String\n        get() = xpathTextArea.text\n\n    override fun selectAstNode(astNode: AstNode?) {\n        if (astNode != null) {\n            try {\n                astSelectionEventDisabled = true\n                val treeNode = getAstTreeNodeWithGivenUserObject(astTree.model.root as DefaultMutableTreeNode, astNode)\n                if (treeNode != null) {\n                    astTree.selectionModel.addSelectionPath(TreePath(treeNode.path))\n                }\n            } finally {\n                astSelectionEventDisabled = false\n            }\n        }\n    }\n\n    private fun getAstTreeNodeWithGivenUserObject(\n        treeNode: DefaultMutableTreeNode,\n        userObject: Any\n    ): DefaultMutableTreeNode? {\n        return if (treeNode.userObject == userObject) {\n            treeNode\n        } else {\n            for (i in 0 until treeNode.childCount) {\n                val treeNodeWithUserObject =\n                    getAstTreeNodeWithGivenUserObject(treeNode.getChildAt(i) as DefaultMutableTreeNode, userObject)\n                if (treeNodeWithUserObject != null) {\n                    return treeNodeWithUserObject\n                }\n            }\n            null\n        }\n    }\n\n    override fun highlightSourceCode(startToken: Token, endToken: Token) {\n        val startOffset = lineOffsets.getStartOffset(startToken)\n        val endOffset = lineOffsets.getEndOffset(endToken)\n        try {\n            sourceCodeEditorPane.highlighter.addHighlight(startOffset, endOffset, highlighter)\n        } catch (e: BadLocationException) {\n            throw RuntimeException(e)\n        }\n    }\n\n    override fun clearAstSelections() {\n        try {\n            astSelectionEventDisabled = true\n            astTree.selectionModel.clearSelection()\n        } finally {\n            astSelectionEventDisabled = false\n        }\n    }\n\n    override fun scrollAstTo(astNode: AstNode?) {\n        if (astNode != null) {\n            val treeNode = getAstTreeNodeWithGivenUserObject(astTree.model.root as DefaultMutableTreeNode, astNode)\n            if (treeNode != null) {\n                astTree.scrollPathToVisible(TreePath(treeNode.path))\n            }\n        }\n    }\n\n    override fun clearSourceCodeHighlights() {\n        sourceCodeEditorPane.highlighter.removeAllHighlights()\n    }\n\n    fun clearSourceCodeHighlight() {\n        SwingUtilities.invokeLater {\n            if (isSourceCodeFormatted && astTree.model === EMPTY_TREE_MODEL) {\n                val styledDocument = sourceCodeEditorPane.styledDocument\n                styledDocument.setCharacterAttributes(0, styledDocument.length, SourceCodeStyler.defaultStyle, true)\n                isSourceCodeFormatted = false\n            }\n        }\n    }\n\n    override fun scrollSourceCodeTo(astNode: Token?) {\n        if (astNode != null) {\n            val visibleLines =\n                sourceCodeEditorPane.visibleRect.height / sourceCodeEditorPane.getFontMetrics(sourceCodeEditorPane.font).height\n            val line = astNode.line + visibleLines / 2\n            try {\n                sourceCodeEditorPane.scrollRectToVisible(toRectangle(sourceCodeEditorPane.modelToView2D(0)))\n                sourceCodeEditorPane.scrollRectToVisible(\n                    toRectangle(sourceCodeEditorPane.modelToView2D(lineOffsets.getOffset(line,0)))\n                )\n            } catch (e: BadLocationException) {\n                throw RuntimeException(e)\n            }\n        }\n    }\n\n    override fun disableXPathEvaluateButton() {\n        xpathButton.isEnabled = false\n    }\n\n    override fun enableXPathEvaluateButton() {\n        xpathButton.isEnabled = true\n    }\n\n    override val astNodeFollowingCurrentSourceCodeTextCursorPosition: AstNode?\n        get() {\n            val currentOffset = sourceCodeEditorPane.caretPosition\n            return getFollowingAstNode(astTree.model.root as DefaultMutableTreeNode?, currentOffset)\n        }\n\n    private fun getFollowingAstNode(treeNode: DefaultMutableTreeNode?, offset: Int): AstNode? {\n        var followingAstNode: AstNode? = null\n        if (treeNode != null) {\n            val enumeration: Enumeration<*> = treeNode.breadthFirstEnumeration()\n            var nearestOffsetSoFar = Int.MAX_VALUE\n            while (enumeration.hasMoreElements()) {\n                val childTreeNode = enumeration.nextElement() as DefaultMutableTreeNode\n                if (childTreeNode.userObject is AstNode) {\n                    val astNode = childTreeNode.userObject as AstNode\n                    if (astNode.hasToken()) {\n                        val token = astNode.token\n                        val tokenOffset = lineOffsets.getStartOffset(token)\n                        if (tokenOffset in offset until nearestOffsetSoFar) {\n                            nearestOffsetSoFar = tokenOffset\n                            followingAstNode = astNode\n                        }\n                    }\n                }\n            }\n        }\n        return followingAstNode\n    }\n\n    override val selectedAstNodes: List<AstNode>\n        get() {\n            val acc = mutableListOf<AstNode>()\n            val selectedPaths = astTree.selectionPaths\n            if (selectedPaths != null) {\n                for (selectedPath in selectedPaths) {\n                    val treeNode = selectedPath.lastPathComponent as DefaultMutableTreeNode\n                    val userObject = treeNode.userObject\n                    if (userObject is AstNode) {\n                        acc.add(userObject)\n                    }\n                }\n            }\n            return acc\n        }\n\n    override val selectedTrivias: List<Trivia>\n        get() {\n            val acc = mutableListOf<Trivia>()\n            val selectedPaths = astTree.selectionPaths\n            if (selectedPaths != null) {\n                for (selectedPath in selectedPaths) {\n                    val treeNode = selectedPath.lastPathComponent as DefaultMutableTreeNode\n                    val userObject = treeNode.userObject\n                    if (userObject is Trivia) {\n                        acc.add(userObject)\n                    }\n                }\n            }\n            return acc\n        }\n\n    override val selectedSymbolOrScopeTrees: List<AstNode>\n        get() {\n            val acc = mutableListOf<AstNode>()\n            val selectedPaths = symbolTree.selectionPaths\n            if (selectedPaths != null) {\n                for (selectedPath in selectedPaths) {\n                    val treeNode = selectedPath.lastPathComponent as DefaultMutableTreeNode\n                    val node = when (val userObject = treeNode.userObject) {\n                        is Symbol -> userObject.declaration\n                        is Scope -> userObject.tree\n                        is AstNode -> userObject\n                        else -> null\n                    }\n                    if (node != null) {\n                        acc.add(node)\n                    }\n                }\n            }\n            return acc\n        }\n\n    override fun appendToConsole(message: String?) {\n        consoleTextArea.append(message)\n    }\n\n    override fun setFocusOnConsoleView() {\n        tabbedPane.selectedComponent = consoleScrollPane\n    }\n\n    override fun setFocusOnAbstractSyntaxTreeView() {\n        tabbedPane.selectedComponent = astTreeScrollPane\n    }\n\n    override fun clearConsole() {\n        consoleTextArea.text = \"\"\n    }\n\n    override fun addConfigurationProperty(name: String, description: String) {\n        val configurationPropertyPanel = ConfigurationPropertyPanel(name, description)\n        configurationPropertyPanel.valueTextField.addFocusListener(object : FocusAdapter() {\n            override fun focusLost(e: FocusEvent) {\n                presenter.onConfigurationPropertyFocusLost(name)\n            }\n        })\n        configurationPropertiesPanels[name] = configurationPropertyPanel\n        val constraints = GridBagConstraints()\n        constraints.fill = GridBagConstraints.HORIZONTAL\n        constraints.weightx = 1.0\n        constraints.gridx = 0\n        constraints.anchor = GridBagConstraints.NORTH\n        configurationInnerPanel.add(configurationPropertyPanel.panel, constraints)\n    }\n\n    override fun getConfigurationPropertyValue(name: String): String {\n        return configurationPropertiesPanels.getValue(name).valueTextField.text\n    }\n\n    override fun setConfigurationPropertyValue(name: String, value: String) {\n        configurationPropertiesPanels.getValue(name).valueTextField.text = value\n    }\n\n    override fun setConfigurationPropertyErrorMessage(name: String, errorMessage: String) {\n        configurationPropertiesPanels.getValue(name).errorMessageLabel.text = errorMessage\n    }\n\n    override fun setFocusOnConfigurationPropertyField(name: String) {\n        configurationPropertiesPanels.getValue(name).valueTextField.requestFocus()\n    }\n\n    override fun setFocusOnConfigurationView() {\n        tabbedPane.selectedComponent = configurationScrollPane\n    }\n\n    companion object {\n        private const val serialVersionUID = 1L\n        private val EMPTY_TREE_MODEL: TreeModel = DefaultTreeModel(null)\n        private fun getTreeNode(astNode: AstNode): DefaultMutableTreeNode {\n            val treeNode = DefaultMutableTreeNode(astNode)\n            if (astNode.hasChildren()) {\n                for (childAstNode in astNode.children) {\n                    treeNode.add(getTreeNode(childAstNode))\n                }\n            } else if (astNode.hasToken() && astNode.token.hasTrivia()) {\n                for (trivia in astNode.token.trivia) {\n                    treeNode.add(DefaultMutableTreeNode(trivia))\n                }\n            }\n            return treeNode\n        }\n\n        private fun getScopeTreeNode(scope: Scope): DefaultMutableTreeNode {\n            val treeNode = DefaultMutableTreeNode(scope)\n            if (scope.symbols.isEmpty()) {\n                treeNode.add(DefaultMutableTreeNode(\"<no symbols>\"))\n            } else {\n                val symbolsNode = DefaultMutableTreeNode(\"Symbols\")\n                for (symbol in scope.symbols) {\n                    val symbolNode = DefaultMutableTreeNode(symbol)\n                    if (symbol.usages.isEmpty()) {\n                        symbolNode.add(DefaultMutableTreeNode(\"<no usages>\"))\n                    } else {\n                        val usagesNode = DefaultMutableTreeNode(\"Usages\")\n                        for (usage in symbol.usages) {\n                            usagesNode.add(DefaultMutableTreeNode(usage))\n                        }\n                        symbolNode.add(usagesNode)\n                    }\n                    symbolsNode.add(symbolNode)\n                }\n                treeNode.add(symbolsNode)\n            }\n            if (scope.innerScopes.isNotEmpty()) {\n                val innerScopesNode = DefaultMutableTreeNode(\"Scopes\")\n                for (innerScope in scope.innerScopes) {\n                    innerScopesNode.add(getScopeTreeNode(innerScope))\n                }\n                treeNode.add(innerScopesNode)\n            }\n            return treeNode\n        }\n    }\n\n    private fun toRectangle(rectangle2D: Rectangle2D?): Rectangle? {\n        return rectangle2D?.let { Rectangle(it.x.toInt(), it.y.toInt(), it.width.toInt(), it.height.toInt()) }\n    }\n}\n"
  },
  {
    "path": "zpa-toolkit/src/main/kotlin/com/felipebz/flr/toolkit/Toolkit.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.flr.toolkit\n\nimport com.felipebz.flr.internal.toolkit.SourceCodeModel\nimport com.felipebz.flr.internal.toolkit.ToolkitPresenter\nimport com.felipebz.flr.internal.toolkit.ToolkitViewImpl\nimport com.formdev.flatlaf.FlatIntelliJLaf\nimport javax.swing.SwingUtilities\n\n/**\n * Creates a Toolkit with a title, and the given [ConfigurationModel].\n *\n * @param title\n * @param configurationModel\n *\n * @since 1.17\n */\nclass Toolkit(private val title: String, private val configurationModel: ConfigurationModel) {\n    fun run() {\n        SwingUtilities.invokeLater {\n            FlatIntelliJLaf.setup()\n            val model = SourceCodeModel(configurationModel)\n            val presenter = ToolkitPresenter(configurationModel, model)\n            presenter.setView(ToolkitViewImpl(presenter))\n            presenter.run(title)\n        }\n    }\n}\n"
  },
  {
    "path": "zpa-toolkit/src/main/kotlin/com/felipebz/zpa/toolkit/ZpaConfigurationModel.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.toolkit\n\nimport com.felipebz.flr.api.Grammar\nimport com.felipebz.flr.impl.Parser\nimport com.felipebz.flr.toolkit.AbstractConfigurationModel\nimport com.felipebz.flr.toolkit.ConfigurationProperty\nimport com.felipebz.flr.toolkit.Validators\nimport com.felipebz.zpa.parser.PlSqlParser\nimport com.felipebz.zpa.squid.PlSqlConfiguration\nimport com.felipebz.zpa.utils.log.Loggers\nimport java.nio.charset.Charset\n\nclass ZpaConfigurationModel : AbstractConfigurationModel() {\n\n    internal var charsetProperty = ConfigurationProperty(\"Charset\",\n        CHARSET_PROPERTY_KEY,\n        getPropertyOrDefaultValue(CHARSET_PROPERTY_KEY, \"UTF-8\"),\n        Validators.charsetValidator())\n\n    internal var errorRecoveryProperty = ConfigurationProperty(\"Error recovery\",\n        ERROR_RECOVERY_PROPERTY_KEY,\n        getPropertyOrDefaultValue(ERROR_RECOVERY_PROPERTY_KEY, \"true\"),\n        Validators.booleanValidator())\n\n    internal val configuration: PlSqlConfiguration\n        get() = PlSqlConfiguration(Charset.forName(charsetProperty.value), errorRecoveryProperty.value.toBoolean())\n\n    override val charset: Charset\n        get() = Charset.forName(charsetProperty.value)\n\n    override val properties: List<ConfigurationProperty>\n        get() = listOf(charsetProperty, errorRecoveryProperty)\n\n    override fun doGetParser(): Parser<Grammar> = PlSqlParser.create(configuration)\n\n    companion object {\n        private val LOG = Loggers.getLogger(ZpaConfigurationModel::class.java)\n        private const val CHARSET_PROPERTY_KEY = \"sonar.sourceEncoding\"\n        private const val ERROR_RECOVERY_PROPERTY_KEY = \"sonar.zpa.errorRecoveryEnabled\"\n\n        internal fun getPropertyOrDefaultValue(propertyKey: String, defaultValue: String): String {\n            val propertyValue = System.getProperty(propertyKey)\n\n            if (propertyValue == null) {\n                LOG.info(\"The property \\\"{}\\\" is not set, using the default value \\\"{}\\\".\", propertyKey, defaultValue)\n                return defaultValue\n            }\n            LOG.info(\"The property \\\"{}\\\" is set, using its value \\\"{}\\\".\", propertyKey, propertyValue)\n            return propertyValue\n        }\n    }\n\n}\n"
  },
  {
    "path": "zpa-toolkit/src/main/kotlin/com/felipebz/zpa/toolkit/ZpaToolkit.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.toolkit\n\nimport com.felipebz.flr.toolkit.Toolkit\n\nfun main() {\n    val toolkit = Toolkit(\"ZPA Toolkit\", ZpaConfigurationModel())\n    toolkit.run()\n}\n"
  },
  {
    "path": "zpa-toolkit/src/test/kotlin/com/felipebz/flr/internal/toolkit/LineOffsetsTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.flr.internal.toolkit\n\nimport com.felipebz.flr.api.GenericTokenType\nimport com.felipebz.flr.api.Token\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport java.net.URISyntaxException\n\nclass LineOffsetsTest {\n    @Test\n    fun startOffset() {\n        val foo = mockToken(1, 0, \"foo\")\n        val bar = mockToken(2, 2, \"bar\")\n        val lineOffsets = LineOffsets(\"foo\\n??bar\")\n        assertThat(lineOffsets.getStartOffset(foo)).isEqualTo(0)\n        assertThat(lineOffsets.getStartOffset(bar)).isEqualTo(6)\n    }\n\n    @Test\n    fun endOffsetSingleLine() {\n        val foo = mockToken(1, 0, \"foo\")\n        val bar = mockToken(2, 2, \"bar\")\n        val lineOffsets = LineOffsets(\"foo\\n??bar...\")\n        assertThat(lineOffsets.getEndOffset(foo)).isEqualTo(3)\n        assertThat(lineOffsets.getEndOffset(bar)).isEqualTo(9)\n    }\n\n    @Test\n    fun endOffsetMultiLine() {\n        val foo = mockToken(1, 0, \"foo\")\n        val bar = mockToken(2, 2, \"bar\\nbaz\")\n        val lineOffsets = LineOffsets(\"foo\\n??bar\\nbaz...\")\n        assertThat(lineOffsets.getEndOffset(foo)).isEqualTo(3)\n        assertThat(lineOffsets.getEndOffset(bar)).isEqualTo(13)\n    }\n\n    @Test\n    fun endOffsetMultiLineRNSingleOffsetIncrement() {\n        val foo = mockToken(1, 0, \"foo\")\n        val bar = mockToken(2, 2, \"bar\\r\\nbaz\")\n        val lineOffsets = LineOffsets(\"foo\\n??bar\\r\\nbaz...\")\n        assertThat(lineOffsets.getEndOffset(foo)).isEqualTo(3)\n        assertThat(lineOffsets.getEndOffset(bar)).isEqualTo(13)\n    }\n\n    @Test\n    fun endOffsetMultiLineRNewLine() {\n        val foo = mockToken(1, 0, \"foo\")\n        val bar = mockToken(2, 2, \"bar\\rbaz\")\n        val lineOffsets = LineOffsets(\"foo\\n??bar\\rbaz...\")\n        assertThat(lineOffsets.getEndOffset(foo)).isEqualTo(3)\n        assertThat(lineOffsets.getEndOffset(bar)).isEqualTo(13)\n    }\n\n    @Test\n    fun offset() {\n        val lineOffsets = LineOffsets(\"int a = 0;\\nint b = 0;\")\n        assertThat(lineOffsets.getOffset(2, 4)).isEqualTo(15)\n        assertThat(lineOffsets.getOffset(2, 100)).isEqualTo(21)\n        assertThat(lineOffsets.getOffset(100, 100)).isEqualTo(21)\n    }\n\n    @Test\n    fun offsetCariageReturnAsNewLine() {\n        val lineOffsets = LineOffsets(\"\\rfoo\")\n        assertThat(lineOffsets.getOffset(1, 0)).isEqualTo(0)\n        assertThat(lineOffsets.getOffset(2, 0)).isEqualTo(1)\n    }\n\n    @Test\n    fun offsetCariageReturnAndLineFeedAsSingleOffset() {\n        val lineOffsets = LineOffsets(\"\\r\\nfoo\")\n        assertThat(lineOffsets.getOffset(1, 0)).isEqualTo(0)\n        assertThat(lineOffsets.getOffset(2, 0)).isEqualTo(1)\n    }\n\n    @Test\n    fun offsetBadLine() {\n        assertThrows<IllegalArgumentException> {\n            val lineOffsets = LineOffsets(\"\")\n            lineOffsets.getOffset(0, 0)\n        }\n    }\n\n    @Test\n    fun offsetBadColumn() {\n        assertThrows<IllegalArgumentException> {\n            val lineOffsets = LineOffsets(\"\")\n            lineOffsets.getOffset(1, -1)\n        }\n    }\n\n    companion object {\n        fun mockToken(line: Int, column: Int, value: String?): Token {\n            return try {\n                Token.builder()\n                    .setLine(line)\n                    .setColumn(column)\n                    .setValueAndOriginalValue(value!!)\n                    .setType(GenericTokenType.IDENTIFIER)\n                    .build()\n            } catch (e: URISyntaxException) {\n                throw RuntimeException(e)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "zpa-toolkit/src/test/kotlin/com/felipebz/flr/internal/toolkit/ToolkitPresenterTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.flr.internal.toolkit\n\nimport com.felipebz.flr.api.AstNode\nimport com.felipebz.flr.api.GenericTokenType\nimport com.felipebz.flr.api.Token\nimport com.felipebz.flr.toolkit.ConfigurationModel\nimport com.felipebz.flr.toolkit.ConfigurationProperty\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport org.mockito.ArgumentMatchers\nimport org.mockito.ArgumentMatchers.anyString\nimport org.mockito.kotlin.*\nimport com.felipebz.zpa.symbols.SymbolTableImpl\nimport java.awt.Point\nimport java.io.File\nimport java.io.PrintWriter\nimport java.nio.charset.StandardCharsets\n\nclass ToolkitPresenterTest {\n    @Test\n    fun checkInitializedBad() {\n        assertThrows<IllegalStateException>(\"the view must be set before the presenter can be ran\") {\n            val presenter = ToolkitPresenter(mock(), mock())\n            presenter.checkInitialized()\n        }\n    }\n\n    @Test\n    fun checkInitializedGood() {\n        val presenter = ToolkitPresenter(mock(), mock())\n        presenter.setView(mock())\n        presenter.checkInitialized()\n    }\n\n    @Test\n    fun initUncaughtExceptionsHandler() {\n        val view = mock<ToolkitView>()\n        val presenter = ToolkitPresenter(mock(), mock())\n\n        presenter.setView(view)\n        presenter.initUncaughtExceptionsHandler()\n        val uncaughtExceptionHandler = Thread.currentThread().uncaughtExceptionHandler\n        assertThat(uncaughtExceptionHandler is ThreadGroup).isFalse()\n        val e = mock<Throwable>()\n        uncaughtExceptionHandler.uncaughtException(null, e)\n        verify(e).printStackTrace(ArgumentMatchers.any(PrintWriter::class.java))\n        verify(view).appendToConsole(anyString())\n        verify(view).setFocusOnConsoleView()\n    }\n\n    @Test\n    fun initConfigurationTab() {\n        val view = mock<ToolkitView>()\n        var presenter = ToolkitPresenter(mock(), mock())\n        presenter.setView(view)\n        presenter.initConfigurationTab()\n        verify(view, never()).addConfigurationProperty(anyString(), anyString())\n        verify(view, never()).setConfigurationPropertyValue(anyString(), anyString())\n        val property1 = mock<ConfigurationProperty>()\n        whenever(property1.name).thenReturn(\"property1\")\n        whenever(property1.description).thenReturn(\"description1\")\n        whenever(property1.value).thenReturn(\"default1\")\n        val property2 = mock<ConfigurationProperty>()\n        whenever(property2.name).thenReturn(\"property2\")\n        whenever(property2.description).thenReturn(\"description2\")\n        whenever(property2.value).thenReturn(\"default2\")\n        val configurationModel = mock<ConfigurationModel>()\n        whenever(configurationModel.properties).thenReturn(listOf(property1, property2))\n        presenter = ToolkitPresenter(configurationModel, mock())\n        presenter.setView(view)\n        presenter.initConfigurationTab()\n        verify(view).addConfigurationProperty(\"property1\", \"description1\")\n        verify(view).setConfigurationPropertyValue(\"property1\", \"default1\")\n        verify(view).addConfigurationProperty(\"property2\", \"description2\")\n        verify(view).setConfigurationPropertyValue(\"property2\", \"default2\")\n    }\n\n    @Test\n    fun run() {\n        val view = mock<ToolkitView>()\n        val presenter = ToolkitPresenter(mock(), mock())\n        presenter.setView(view)\n        presenter.run(\"my_mocked_title\")\n        assertThat(Thread.currentThread().uncaughtExceptionHandler is ThreadGroup).isFalse()\n        verify(view).setTitle(\"my_mocked_title\")\n        verify(view).displaySourceCode(\"\", emptyList())\n        verify(view).displayAst(null)\n        verify(view).displayXml(\"\")\n        verify(view).disableXPathEvaluateButton()\n        verify(view).run()\n    }\n\n    @Test\n    fun run_should_call_initConfigurationTab() {\n        val view = mock<ToolkitView>()\n        var presenter = ToolkitPresenter(mock(), mock())\n        presenter.setView(view)\n        presenter.run(\"my_mocked_title\")\n        verify(view, never()).addConfigurationProperty(anyString(), anyString())\n        val configurationModel = mock<ConfigurationModel>()\n        whenever(configurationModel.properties).thenReturn(\n            listOf(ConfigurationProperty(\"\", \"\", \"\"))\n        )\n        presenter = ToolkitPresenter(configurationModel, mock())\n        presenter.setView(view)\n        presenter.run(\"my_mocked_title\")\n        verify(view).addConfigurationProperty(anyString(), anyString())\n    }\n\n    @Test\n    fun runFailsWithoutView() {\n        assertThrows<IllegalStateException> {\n            ToolkitPresenter(mock(), mock()).run(\"foo\")\n        }\n    }\n\n    @Test\n    fun onSourceCodeOpenButtonClick() {\n        val view = mock<ToolkitView>()\n        val file = File(\"src/test/resources/parse_error.txt\")\n        whenever(view.pickFileToParse()).thenReturn(file)\n        val model = mock<SourceCodeModel>()\n        val astNode = mock<AstNode>()\n        whenever(model.sourceCode).thenReturn(\"my_mocked_highlighted_source_code\")\n        whenever(model.astNode).thenReturn(astNode)\n        whenever(model.xml).thenReturn(\"my_mocked_xml\")\n        whenever(model.symbolTable).thenReturn(SymbolTableImpl())\n        val presenter = ToolkitPresenter(\n            whenever(mock<ConfigurationModel>().charset).thenReturn(StandardCharsets.UTF_8).getMock(),\n            model\n        )\n        presenter.setView(view)\n        presenter.onSourceCodeOpenButtonClick()\n        verify(view).pickFileToParse()\n        verify(view).clearConsole()\n        verify(view).displaySourceCode(\"my_mocked_highlighted_source_code\", emptyList())\n        verify(model).setSourceCode(file, StandardCharsets.UTF_8)\n        verify(view).displayAst(astNode)\n        verify(view).displayXml(\"my_mocked_xml\")\n        verify(view).scrollSourceCodeTo(Point(0, 0))\n        verify(view).setFocusOnAbstractSyntaxTreeView()\n        verify(view).enableXPathEvaluateButton()\n    }\n\n    @Test\n    fun onSourceCodeOpenButtonClick_with_parse_error_should_clear_console_and_display_code() {\n        val view = mock<ToolkitView>()\n        val file = File(\"src/test/resources/parse_error.txt\")\n        whenever(view.pickFileToParse()).thenReturn(file)\n        val model = mock<SourceCodeModel>()\n        doThrow(RuntimeException(\"Parse error\")).`when`(model).setSourceCode(any(), any())\n        val presenter = ToolkitPresenter(\n            whenever(mock<ConfigurationModel>().charset).thenReturn(StandardCharsets.UTF_8).getMock(),\n            model\n        )\n        presenter.setView(view)\n        try {\n            presenter.onSourceCodeOpenButtonClick()\n            throw AssertionError(\"Expected an exception\")\n        } catch (e: RuntimeException) {\n            verify(view).clearConsole()\n            verify(view).displaySourceCode(\"parse_error.txt\", emptyList())\n        }\n    }\n\n    @Test\n    fun onSourceCodeOpenButtonClick_should_no_operation_when_no_file() {\n        val view = mock<ToolkitView>()\n        whenever(view.pickFileToParse()).thenReturn(null)\n        val model = mock<SourceCodeModel>()\n        val presenter = ToolkitPresenter(mock(), model)\n        presenter.setView(view)\n        presenter.onSourceCodeOpenButtonClick()\n        verify(view).pickFileToParse()\n        verify(view, never()).clearConsole()\n        verify(model, never()).setSourceCode(any(), any())\n        verify(view, never()).displaySourceCode(anyString(), any())\n        verify(view, never()).displayAst(any())\n        verify(view, never()).displayXml(anyString())\n        verify(view, never()).scrollSourceCodeTo(any<Point>())\n        verify(view, never()).enableXPathEvaluateButton()\n    }\n\n    @Test\n    fun onSourceCodeParseButtonClick() {\n        val view = mock<ToolkitView>()\n        whenever(view.sourceCode).thenReturn(\"my_mocked_source\")\n        val point = mock<Point>()\n        whenever(view.sourceCodeScrollbarPosition).thenReturn(point)\n        val model = mock<SourceCodeModel>()\n        whenever(model.sourceCode).thenReturn(\"my_mocked_highlighted_source_code\")\n        val astNode = mock<AstNode>()\n        whenever(model.astNode).thenReturn(astNode)\n        whenever(model.xml).thenReturn(\"my_mocked_xml\")\n        whenever(model.symbolTable).thenReturn(SymbolTableImpl())\n        val presenter = ToolkitPresenter(mock(), model)\n        presenter.setView(view)\n        presenter.onSourceCodeParseButtonClick()\n        verify(view).clearConsole()\n        verify(view).sourceCode\n        verify(model).setSourceCode(\"my_mocked_source\")\n        verify(view).displaySourceCode(\"my_mocked_highlighted_source_code\", emptyList())\n        view.displayAst(astNode)\n        view.displayXml(\"my_mocked_xml\")\n        view.scrollSourceCodeTo(point)\n        verify(view).setFocusOnAbstractSyntaxTreeView()\n        verify(view).enableXPathEvaluateButton()\n    }\n\n    @Test\n    fun onXPathEvaluateButtonClickAstNodeResults() {\n        val view = mock<ToolkitView>()\n        whenever(view.xPath).thenReturn(\"//foo\")\n        val model = mock<SourceCodeModel>()\n        val astNode = AstNode(GenericTokenType.IDENTIFIER, \"foo\", mock())\n        whenever(model.astNode).thenReturn(astNode)\n        whenever(model.symbolTable).thenReturn(SymbolTableImpl())\n        val presenter = ToolkitPresenter(mock(), model)\n        presenter.setView(view)\n        presenter.onXPathEvaluateButtonClick()\n        verify(view).clearAstSelections()\n        verify(view).clearSourceCodeHighlights()\n        verify(view).selectAstNode(astNode)\n        verify(view).highlightSourceCode(astNode.token, astNode.lastToken)\n        verify(view).scrollAstTo(astNode)\n    }\n\n    @Test\n    fun onXPathEvaluateButtonClickScrollToFirstAstNode() {\n        val view = mock<ToolkitView>()\n        whenever(view.xPath).thenReturn(\"//foo\")\n        val model = mock<SourceCodeModel>()\n        val astNode = AstNode(GenericTokenType.IDENTIFIER, \"foo\", null)\n        val childAstNode = AstNode(GenericTokenType.IDENTIFIER, \"foo\", null)\n        astNode.addChild(childAstNode)\n        whenever(model.astNode).thenReturn(astNode)\n        whenever(model.symbolTable).thenReturn(SymbolTableImpl())\n        val presenter = ToolkitPresenter(mock(), model)\n        presenter.setView(view)\n        presenter.onXPathEvaluateButtonClick()\n        verify(view).scrollAstTo(astNode)\n        verify(view, never()).scrollAstTo(childAstNode)\n        verify(view).scrollSourceCodeTo(astNode.tokenOrNull)\n        verify(view).scrollSourceCodeTo(childAstNode.tokenOrNull)\n    }\n\n    @Test\n    fun onXPathEvaluateButtonClickStringResult() {\n        val view = mock<ToolkitView>()\n        whenever(view.xPath).thenReturn(\"//foo/@tokenValue\")\n        val model = mock<SourceCodeModel>()\n        val token = Token.builder()\n            .setType(GenericTokenType.IDENTIFIER)\n            .setValueAndOriginalValue(\"bar\")\n            .setLine(1)\n            .setColumn(1)\n            .build()\n        val astNode = AstNode(GenericTokenType.IDENTIFIER, \"foo\", token)\n        whenever(model.astNode).thenReturn(astNode)\n        val presenter = ToolkitPresenter(mock(), model)\n        presenter.setView(view)\n        presenter.onXPathEvaluateButtonClick()\n        verify(view).clearConsole()\n        verify(view).clearAstSelections()\n        verify(view).clearSourceCodeHighlights()\n        verify(view, never()).selectAstNode(any())\n        verify(view, never()).highlightSourceCode(any(), any())\n        verify(view).scrollAstTo(null)\n        verify(view).scrollSourceCodeTo(null as Token?)\n        verify(view).setFocusOnAbstractSyntaxTreeView()\n    }\n\n    @Test\n    fun onSourceCodeKeyTyped() {\n        val view = mock<ToolkitView>()\n        val presenter = ToolkitPresenter(mock(), mock())\n        presenter.setView(view)\n        presenter.onSourceCodeKeyTyped()\n        verify(view).displayAst(null)\n        verify(view).displayXml(\"\")\n        verify(view).clearSourceCodeHighlights()\n        verify(view).disableXPathEvaluateButton()\n    }\n\n    @Test\n    fun onSourceCodeTextCursorMoved() {\n        val view = mock<ToolkitView>()\n        val astNode = mock<AstNode>()\n        whenever(view.astNodeFollowingCurrentSourceCodeTextCursorPosition).thenReturn(astNode)\n        val presenter = ToolkitPresenter(mock(), mock())\n        presenter.setView(view)\n        presenter.onSourceCodeTextCursorMoved()\n        verify(view).clearAstSelections()\n        verify(view).selectAstNode(astNode)\n        verify(view).scrollAstTo(astNode)\n    }\n\n    @Test\n    fun onAstSelectionChanged() {\n        val view = mock<ToolkitView>()\n        val firstAstNode = mock<AstNode>()\n        val secondAstNode = mock<AstNode>()\n        whenever(view.selectedAstNodes).thenReturn(listOf(firstAstNode, secondAstNode))\n        val presenter = ToolkitPresenter(mock(), mock())\n        presenter.setView(view)\n        presenter.onAstSelectionChanged()\n        verify(view).clearSourceCodeHighlights()\n        verify(view).scrollSourceCodeTo(firstAstNode.tokenOrNull)\n        verify(view).scrollSourceCodeTo(secondAstNode.tokenOrNull)\n    }\n\n    @Test\n    fun onConfigurationPropertyFocusLost_when_validation_successes() {\n        val view = mock<ToolkitView>()\n        val property = mock<ConfigurationProperty>()\n        whenever(property.name).thenReturn(\"name\")\n        whenever(property.description).thenReturn(\"description\")\n        whenever(view.getConfigurationPropertyValue(\"name\")).thenReturn(\"foo\")\n        whenever(property.validate(\"foo\")).thenReturn(\"\")\n        val configurationModel = mock<ConfigurationModel>()\n        whenever(configurationModel.properties).thenReturn(listOf(property))\n        val presenter = ToolkitPresenter(configurationModel, mock())\n        presenter.setView(view)\n        presenter.onConfigurationPropertyFocusLost(\"name\")\n        verify(view).setConfigurationPropertyErrorMessage(\"name\", \"\")\n        verify(view, never()).setFocusOnConfigurationPropertyField(anyString())\n        verify(view, never()).setFocusOnConfigurationView()\n        verify(property).value = \"foo\"\n        verify(configurationModel).setUpdatedFlag()\n    }\n\n    @Test\n    fun onConfigurationPropertyFocusLost_when_validation_fails() {\n        val view = mock<ToolkitView>()\n        val property = mock<ConfigurationProperty>()\n        whenever(property.name).thenReturn(\"name\")\n        whenever(property.description).thenReturn(\"description\")\n        whenever(view.getConfigurationPropertyValue(\"name\")).thenReturn(\"foo\")\n        whenever(property.validate(\"foo\")).thenReturn(\"The value foo is forbidden!\")\n        val configurationModel = mock<ConfigurationModel>()\n        whenever(configurationModel.properties).thenReturn(listOf(property))\n        val presenter = ToolkitPresenter(configurationModel, mock())\n        presenter.setView(view)\n        presenter.onConfigurationPropertyFocusLost(\"name\")\n        verify(view).setConfigurationPropertyErrorMessage(\"name\", \"The value foo is forbidden!\")\n        verify(view).setFocusOnConfigurationPropertyField(\"name\")\n        verify(view).setFocusOnConfigurationView()\n        verify(property, never()).value = \"foo\"\n        verify(configurationModel, never()).setUpdatedFlag()\n    }\n\n    @Test\n    fun onConfigurationPropertyFocusLost_with_invalid_name() {\n        val view = mock<ToolkitView>()\n        val presenter = ToolkitPresenter(mock(), mock())\n        presenter.setView(view)\n        assertThrows<IllegalArgumentException>(\"No such configuration property: name\") {\n            presenter.onConfigurationPropertyFocusLost(\"name\")\n        }\n    }\n}\n"
  },
  {
    "path": "zpa-toolkit/src/test/kotlin/com/felipebz/zpa/toolkit/ZpaConfigurationModelTest.kt",
    "content": "/**\n * Z PL/SQL Analyzer\n * Copyright (C) 2015-2026 Felipe Zorzo\n * mailto:felipe AT felipezorzo DOT com DOT br\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 3 of the License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n */\npackage com.felipebz.zpa.toolkit\n\nimport org.assertj.core.api.Assertions.assertThat\nimport org.junit.jupiter.api.Test\nimport java.nio.charset.StandardCharsets\n\nclass ZpaConfigurationModelTest {\n\n    @Test\n    fun getConfiguration_charset() {\n        val model = ZpaConfigurationModel()\n        model.charsetProperty.value = \"UTF-8\"\n        assertThat(model.charset).isEqualTo(StandardCharsets.UTF_8)\n        assertThat(model.configuration.charset).isEqualTo(StandardCharsets.UTF_8)\n        model.charsetProperty.value = \"ISO-8859-1\"\n        assertThat(model.charset).isEqualTo(StandardCharsets.ISO_8859_1)\n        assertThat(model.configuration.charset).isEqualTo(StandardCharsets.ISO_8859_1)\n    }\n\n    @Test\n    fun getPropertyOrDefaultValue_with_property_set() {\n        val oldValue = System.getProperty(\"foo\")\n\n        try {\n            System.setProperty(\"foo\", \"bar\")\n            assertThat(ZpaConfigurationModel.getPropertyOrDefaultValue(\"foo\", \"baz\")).isEqualTo(\"bar\")\n        } finally {\n            if (oldValue == null) {\n                System.clearProperty(\"foo\")\n            } else {\n                System.setProperty(\"foo\", oldValue)\n            }\n        }\n    }\n\n    @Test\n    fun getPropertyOrDefaultValue_with_property_not_set() {\n        val oldValue = System.getProperty(\"foo\")\n\n        try {\n            System.clearProperty(\"foo\")\n            assertThat(ZpaConfigurationModel.getPropertyOrDefaultValue(\"foo\", \"baz\")).isEqualTo(\"baz\")\n        } finally {\n            if (oldValue == null) {\n                System.clearProperty(\"foo\")\n            } else {\n                System.setProperty(\"foo\", oldValue)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "zpa-toolkit/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker",
    "content": "mock-maker-inline"
  },
  {
    "path": "zpa-toolkit/src/test/resources/parse_error.txt",
    "content": "parse_error.txt"
  }
]