{"id":42542951,"url":"https://github.com/ldaniels528/lollypop","last_synced_at":"2026-01-28T18:27:36.815Z","repository":{"id":201399923,"uuid":"707295776","full_name":"ldaniels528/lollypop","owner":"ldaniels528","description":"Lollypop is a development platform built to suit the needs of developers of small to medium software projects, and features an integrated database, web services, scenario-driven test suite, and more.","archived":false,"fork":false,"pushed_at":"2024-06-22T14:52:47.000Z","size":5712,"stargazers_count":2,"open_issues_count":0,"forks_count":2,"subscribers_count":3,"default_branch":"main","last_synced_at":"2024-07-31T23:55:29.101Z","etag":null,"topics":["csv","dataframe","declarative-programming","etl","functional-programming","java","json","json-parser","jvm","kafka","lollypop","matrix","matrix-calculations","matrix-multiplication","reactive-programming","scala","scripting-language","spark","sql"],"latest_commit_sha":null,"homepage":"","language":"Scala","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ldaniels528.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-10-19T15:51:05.000Z","updated_at":"2024-06-22T14:52:32.000Z","dependencies_parsed_at":"2023-11-28T08:30:36.476Z","dependency_job_id":"46a308ad-a180-4b94-85ce-82b4f061a895","html_url":"https://github.com/ldaniels528/lollypop","commit_stats":{"total_commits":257,"total_committers":1,"mean_commits":257.0,"dds":0.0,"last_synced_commit":"34ba34532f97018c5e08b38874d02dfa676db38c"},"previous_names":["qwery-v4/qwery-v4","qwery-v4/lollypop"],"tags_count":24,"template":false,"template_full_name":null,"purl":"pkg:github/ldaniels528/lollypop","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ldaniels528%2Flollypop","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ldaniels528%2Flollypop/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ldaniels528%2Flollypop/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ldaniels528%2Flollypop/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ldaniels528","download_url":"https://codeload.github.com/ldaniels528/lollypop/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ldaniels528%2Flollypop/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28849105,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-28T15:15:36.453Z","status":"ssl_error","status_checked_at":"2026-01-28T15:15:13.020Z","response_time":57,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["csv","dataframe","declarative-programming","etl","functional-programming","java","json","json-parser","jvm","kafka","lollypop","matrix","matrix-calculations","matrix-multiplication","reactive-programming","scala","scripting-language","spark","sql"],"created_at":"2026-01-28T18:27:35.867Z","updated_at":"2026-01-28T18:27:36.801Z","avatar_url":"https://github.com/ldaniels528.png","language":"Scala","funding_links":[],"categories":[],"sub_categories":[],"readme":"Lollypop v0.1.7.2\n============\n\n## Table of Contents\n* \u003ca href=\"#Introduction\"\u003eIntroduction\u003c/a\u003e\n* \u003ca href=\"#Project_Status\"\u003eProject Status\u003c/a\u003e\n* \u003ca href=\"#Getting_Started\"\u003eGetting Started\u003c/a\u003e\n* \u003ca href=\"#Shell_Scripting\"\u003eAs a Shell-Scripting Language Alternative\u003c/a\u003e\n* \u003ca href=\"#Basic_Examples\"\u003eBasic Features\u003c/a\u003e\n  * \u003ca href=\"#Array_Comprehensions\"\u003eArray Comprehensions\u003c/a\u003e\n  * \u003ca href=\"#Array_Literals\"\u003eArray Literals\u003c/a\u003e\n  * \u003ca href=\"#Dataframe_Literals\"\u003eDataframe Literals\u003c/a\u003e\n  * \u003ca href=\"#Define_and_Instantiate_JVM_classes\"\u003eDefine and Instantiate JVM classes\u003c/a\u003e\n  * \u003ca href=\"#Dictionary_Object_Literals\"\u003eDictionary/Object Literals\u003c/a\u003e\n  * \u003ca href=\"#Implicit_Class_Declarations\"\u003eImplicit Class Declarations\u003c/a\u003e\n  * \u003ca href=\"#Implicit_Class_Importing\"\u003eImplicit Class Importing\u003c/a\u003e\n  * \u003ca href=\"#Matrix_and_Vector_Literals\"\u003eMatrix and Vector Literals\u003c/a\u003e\n  * \u003ca href=\"#Matter_of_taste\"\u003eMatter of taste\u003c/a\u003e\n  * \u003ca href=\"#No_semicolons_required\"\u003eNo semicolons required\u003c/a\u003e\n  * \u003ca href=\"#String_Literals_Double_quoted_\"\u003eString Literals (Double-quoted)\u003c/a\u003e\n  * \u003ca href=\"#String_Literals_Single_quoted_\"\u003eString Literals (Single-quoted)\u003c/a\u003e\n  * \u003ca href=\"#String_Literals_Triple_Double_quoted_\"\u003eString Literals (Triple-Double-quoted)\u003c/a\u003e\n  * \u003ca href=\"#String_Literals_Triple_Single_quoted_\"\u003eString Literals (Triple-Single-quoted)\u003c/a\u003e\n* \u003ca href=\"#Examples\"\u003eFeatured Examples By Category\u003c/a\u003e\n  * \u003ca href=\"#Aggregation_and_Sorting\"\u003eAggregation and Sorting\u003c/a\u003e (27)\n  * \u003ca href=\"#Concurrency\"\u003eConcurrency\u003c/a\u003e (10)\n  * \u003ca href=\"#Control_Flow\"\u003eControl Flow\u003c/a\u003e (21)\n  * \u003ca href=\"#Dataframe_I_O\"\u003eDataframe I/O\u003c/a\u003e (23)\n  * \u003ca href=\"#Dataframe_Management\"\u003eDataframe Management\u003c/a\u003e (14)\n  * \u003ca href=\"#Filtering_and_Matching\"\u003eFiltering and Matching\u003c/a\u003e (25)\n  * \u003ca href=\"#JVM_and_Reflection\"\u003eJVM and Reflection\u003c/a\u003e (14)\n  * \u003ca href=\"#Machine_Learning\"\u003eMachine Learning\u003c/a\u003e (2)\n  * \u003ca href=\"#REPL_Tools\"\u003eREPL Tools\u003c/a\u003e (32)\n  * \u003ca href=\"#Scope_and_Session\"\u003eScope and Session\u003c/a\u003e (15)\n  * \u003ca href=\"#System_Tools\"\u003eSystem Tools\u003c/a\u003e (15)\n  * \u003ca href=\"#Testing__Unit_Integration\"\u003eTesting - Unit/Integration\u003c/a\u003e (5)\n  * \u003ca href=\"#Transformation\"\u003eTransformation\u003c/a\u003e (8)\n\u003ca name=\"Introduction\"\u003e\u003c/a\u003e\n## Introduction\nLollypop is a general-purpose programming/scripting language for the JVM.\nFeatures include:\n* Native support for Scala and Java classes, objects and packages.\n* Native support for JSON (arrays, dictionaries and objects).\n* Native support for Maven package repositories.\n* Data-oriented types - Dataframes, BLOB/CLOB and Matrices and Vectors.\n* Multi-paradigm programming model - declarative/SQL, functional, object-oriented and reactive.\n\n\u003ca name=\"Project_Status\"\u003e\u003c/a\u003e\n## Project Status\n\nPreview \u0026#8212; there are still a number of experimental features to sort out.\n\n\u003ca name=\"Getting_Started\"\u003e\u003c/a\u003e\n## Getting Started\n### To build Lollypop Core (Client and Server)\n```bash\nsbt \"project core\" clean assembly\n```\nThe Jar binary should be `./app/core/target/scala-2.13/core-assembly-0.1.7.2.jar`\n\n### To build the Lollypop JDBC driver\n```bash\nsbt \"project jdbc_driver\" clean assembly\n```\nThe Jar binary should be `./app/jdbc-driver/target/scala-2.13/jdbc-driver-assembly-0.1.7.2.jar`\n\n### Run Lollypop REPL\n```bash\nsbt \"project core\" run\n```\nOR\n```bash\njava -jar ./app/core/target/scala-2.13/core-assembly-0.1.7.2.jar\n```\n\n\u003ca name=\"Shell_Scripting\"\u003e\u003c/a\u003e\n## As a Shell-Scripting Language Alternative\n\nLollypop offers developers the opportunity to use a Scala/SQL-hybrid scripting language for writing\nshell-scripts. And because your scripts will be running within the JVM you can leverage Maven Central\nand the myriads of libraries available to it.\n\n#### A new approach to shell-scripting\n\nLollypop provides native variants of the following UNIX-like commands:\n* \u003ca href=\"#cat\"\u003ecat\u003c/a\u003e - Retrieves the contents of a file.\n* \u003ca href=\"#cd\"\u003ecd\u003c/a\u003e - Changes the current directory.\n* \u003ca href=\"#cp\"\u003ecp\u003c/a\u003e - Copies a source file or directory to a target.\n* \u003ca href=\"#echo\"\u003eecho\u003c/a\u003e - Prints text to the standard output.\n* \u003ca href=\"#find\"\u003efind\u003c/a\u003e - Returns a dataframe containing a recursive list of files matching any specified criterion.\n* \u003ca href=\"#ls\"\u003els\u003c/a\u003e - Returns a dataframe containing a list of files matching any specified criterion.\n* \u003ca href=\"#md5\"\u003emd5\u003c/a\u003e - Returns an MD5 digest of a file or byte-encode-able value.\n* \u003ca href=\"#mkdir\"\u003emkdir\u003c/a\u003e - Creates a new directory.\n* \u003ca href=\"#mv\"\u003emv\u003c/a\u003e - Renames a file or moves the file to a directory.\n* \u003ca href=\"#pwd\"\u003epwd\u003c/a\u003e - Retrieves the contents of a file.\n* \u003ca href=\"#rm\"\u003erm\u003c/a\u003e - Removes a file or a collection of files via pattern-matching.\n* \u003ca href=\"#rmdir\"\u003ermdir\u003c/a\u003e - Removes a specific directory.\n* \u003ca href=\"#rmr\"\u003ermr\u003c/a\u003e - Recursively removes files or collections of files via pattern-matching.\n* \u003ca href=\"#touch\"\u003etouch\u003c/a\u003e - Creates or updates the last modified time of a file. Return true if successful.\n* \u003ca href=\"#wc\"\u003ewc\u003c/a\u003e - Returns the count of lines of a text file.\n* \u003ca href=\"#www\"\u003ewww\u003c/a\u003e - A non-interactive HTTP client\n\n#### Let's try something simple\n\n* What if I ask you to write some Bash code to retrieve the top 5 largest files by size in descending order?\n\nCould you write it without consulting a search engine or manual pages? Off the cuff, here's what I came up with to do it. It's crude, and it only works on the Mac...\n\n```bash\nls -lS ./app/examples/ | grep -v ^total | head -n 5\n```\n##### produced the following:\n```text\n-rw-r--r--@ 1 ldaniels  staff  4990190 Nov 11 23:50 stocks-100k.csv\n-rw-r--r--@ 1 ldaniels  staff   336324 Nov 11 23:50 stocks.csv\n-rw-r--r--@ 1 ldaniels  staff   249566 Nov 11 23:50 stocks-5k.csv\ndrwxr-xr-x@ 6 ldaniels  staff      192 Jul  5 14:57 target\ndrwxr-xr-x@ 5 ldaniels  staff      160 Jul  5 14:52 src\n```\n\nAnd here's the equivalent in Lollypop:\n\n```sql\nls app/examples where not isHidden order by length desc limit 5\n```\n##### produced the following:\n```sql\n|-------------------------------------------------------------------------------------------------------------------------------------------------------|\n| name            | canonicalPath                                                | lastModified             | length  | isDirectory | isFile | isHidden |\n|-------------------------------------------------------------------------------------------------------------------------------------------------------|\n| stocks-100k.csv | /Users/ldaniels/GitHub/lollypop/app/examples/stocks-100k.csv | 2023-11-12T07:50:27.490Z | 4990190 | false       | true   | false    |\n| stocks-5k.csv   | /Users/ldaniels/GitHub/lollypop/app/examples/stocks-5k.csv   | 2023-11-12T07:50:27.491Z |  249566 | false       | true   | false    |\n| .DS_Store       | /Users/ldaniels/GitHub/lollypop/app/examples/.DS_Store       | 2023-11-12T05:53:49.722Z |    6148 | false       | true   | true     |\n| target          | /Users/ldaniels/GitHub/lollypop/app/examples/target          | 2023-07-05T21:57:46.435Z |     192 | true        | false  | false    |\n| companylist     | /Users/ldaniels/GitHub/lollypop/app/examples/companylist     | 2023-11-12T07:50:27.476Z |     128 | true        | false  | false    |\n|-------------------------------------------------------------------------------------------------------------------------------------------------------|\n```\n\n* What if I ask for the same as above except find files recursively?\n\n```sql\nfind './app/examples/' where not isHidden order by length desc limit 5\n```\n##### produced the following:\n```sql\n|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| name            | canonicalPath                                                                                             | lastModified             | length  | isDirectory | isFile | isHidden |\n|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| stocks-100k.csv | /Users/ldaniels/GitHub/lollypop/app/examples/stocks-100k.csv                                              | 2023-11-12T07:50:27.490Z | 4990190 | false       | true   | false    |\n|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n```\n\n#### Let's try something practical\n\n* What if you want a list of the top 5 CPU hungry processes?\n\n```sql\ndef ps() := TableArray((? ps aux ?).map(x =\u003e\n  x.trim()\n   .replaceAll(\"  \", \" \")\n   .split(\"[ ]\")\n   .filter(x =\u003e not x.isEmpty())\n))\nselect PID, `%CPU`, `%MEM`, STARTED, TIME, VSZ, RSS\nfrom (ps())\norder by `%CPU` desc\nlimit 5\n```\n##### produced the following:\n```sql\n|--------------------------------------------------------------------|\n| PID   | %CPU | %MEM | STARTED | TIME       | VSZ        | RSS      |\n|--------------------------------------------------------------------|\n|  1542 | 83.6 |  0.2 | 13Dec23 | 1657:48.74 |   36408744 |   231972 |\n| 25369 | 19.1 | 10.7 | Thu09AM | 728:56.39  |  438577760 | 10803088 |\n| 21272 | 12.4 |  3.2 | 9:39AM  | 0:25.86    |  437902704 |  3271536 |\n| 28637 |  8.2 |  0.6 | Wed04PM | 414:47.08  | 1594687744 |   612032 |\n|   360 |  8.1 |  0.8 | 13Dec23 | 669:52.88  |  416009088 |   790640 |\n|--------------------------------------------------------------------|\n```\n\n#### Let's try something cool\n\nThe system command `iostat 1 5` yielded the following text output:\n```text\n              disk0               disk4               disk5       cpu    load average\n    KB/t  tps  MB/s     KB/t  tps  MB/s     KB/t  tps  MB/s  us sy id   1m   5m   15m\n   37.13  105  3.80   127.34   11  1.31  1017.11    6  5.97  10  4 86  2.79 2.33 2.18\n   22.67    3  0.07     0.00    0  0.00     0.00    0  0.00   5  3 92  2.79 2.33 2.18\n    0.00    0  0.00     0.00    0  0.00     0.00    0  0.00   6  3 91  2.65 2.31 2.17\n    0.00    0  0.00     0.00    0  0.00     0.00    0  0.00   7  3 90  2.65 2.31 2.17\n    0.00    0  0.00     0.00    0  0.00     0.00    0  0.00   7  3 90  2.65 2.31 2.17\n```\n\nWe could use system evaluation tags `(?` and `?)` to easily capture then parse them into a dataframe:\n```sql\ndef iostat(n, m) := TableArray((? iostat $n $m ?).drop(1).map(x =\u003e\n  x.trim()\n   .replaceAll(\"  \", \" \")\n   .split(\"[ ]\")\n   .filter(x =\u003e not x.isEmpty())\n))\niostat(1, 5)\n```\n##### produced the following:\n```sql\n|--------------------------------------------------------------------------------------------------|\n| KB/t  | tps | MB/s | KB/t  | tps | MB/s | KB/t  | tps | MB/s | us | sy | id | 1m   | 5m   | 15m  |\n|--------------------------------------------------------------------------------------------------|\n| 37.19 | 105 | 3.81 | 37.19 | 105 | 3.81 | 37.19 | 105 | 3.81 | 10 |  4 | 86 | 2.62 | 2.44 | 2.43 |\n|  5.62 | 338 | 1.85 |  5.62 | 338 | 1.85 |  5.62 | 338 | 1.85 | 18 |  5 | 78 | 2.62 | 2.44 | 2.43 |\n| 22.67 |   3 | 0.07 | 22.67 |   3 | 0.07 | 22.67 |   3 | 0.07 | 11 |  4 | 85 | 2.62 | 2.44 | 2.43 |\n|   0.0 |   0 |  0.0 |   0.0 |   0 |  0.0 |   0.0 |   0 |  0.0 | 11 |  4 | 85 | 2.62 | 2.44 | 2.43 |\n|   0.0 |   0 |  0.0 |   0.0 |   0 |  0.0 |   0.0 |   0 |  0.0 | 10 |  4 | 85 | 2.62 | 2.44 | 2.43 |\n|--------------------------------------------------------------------------------------------------|\n```\nNow we have a dataframe (table) containing the metrics outputted by `iostat`\n\n\u003ca name=\"Basic_Examples\"\u003e\u003c/a\u003e\n## Basic Features\n\n\u003ca name=\"Array_Comprehensions\"\u003e\u003c/a\u003e\n### Array Comprehensions\n*Description*: Define logical arrays\n\n```sql\n['A' to 'F'].reverse()\n```\n##### Results\n```sql\n['F', 'E', 'D', 'C', 'B', 'A']\n```\n\u003ca name=\"Array_Literals\"\u003e\u003c/a\u003e\n### Array Literals\n*Description*: Define arrays and apply monadic functions\n\n```sql\n[1, 3, 5, 7].foldLeft(0, (a, b) =\u003e a + b)\n```\n##### Results\n```sql\n16\n```\n\u003ca name=\"Dataframe_Literals\"\u003e\u003c/a\u003e\n### Dataframe Literals\n*Description*: Produces graphical charts\n\n```sql\ngraph { shape: \"pie3d\", title: \"Powered By Lollypop\" } from (\n  |------------------|\n  | exchange | total |\n  |------------------|\n  | NASDAQ   |    24 |\n  | AMEX     |     5 |\n  | NYSE     |    28 |\n  | OTCBB    |    32 |\n  | OTHEROTC |     7 |\n  |------------------|\n)\n```\n##### Results\n\u003cdiv style=\"width: 100%\"\u003e\n\u003cimg src=\"./docs/images/Powered_By_Lollypop.png\"\u003e\n\u003c/div\u003e\n\n\u003ca name=\"Define_and_Instantiate_JVM_classes\"\u003e\u003c/a\u003e\n### Define and Instantiate JVM classes\n*Description*: Creates a new ephemeral (in-memory) JVM-compatible class\n\n```sql\nclass StockQuote(symbol: String, exchange: String, lastSale: Double, lastSaleTime: Date)\nstock = new StockQuote(\"ABC\", \"OTCBB\", 0.0231, DateTime())\nstock.toString()\n```\n##### Results\n```sql\nStockQuote(\"ABC\", \"OTCBB\", 0.0231, \"2025-10-30T02:14:55.036Z\")\n```\n\u003ca name=\"Dictionary_Object_Literals\"\u003e\u003c/a\u003e\n### Dictionary/Object Literals\n*Description*: Dynamically create objects (e.g. JSON)\n\n```sql\nresponse = { 'message1' : 'Hello World' }\nresponse.message2 = 'Hallo Monde'\nresponse.message3 = ['Hello', 'Hallo', 'World', 'Monde']\nresponse\n```\n##### Results\n```sql\n{\"message1\": \"Hello World\", \"message2\": \"Hallo Monde\", \"message3\": [\"Hello\", \"Hallo\", \"World\", \"Monde\"]}\n```\n\u003ca name=\"Implicit_Class_Declarations\"\u003e\u003c/a\u003e\n### Implicit Class Declarations\n*Description*: Binds a virtual method to a class\n\n```sql\nimplicit class `java.lang.String` {\n    def reverseString(self) := {\n        import \"java.lang.StringBuilder\"\n        val src = self.toCharArray()\n        val dest = new StringBuilder(self.length())\n        val eol = self.length() - 1\n        var n = 0\n        while (n \u003c= eol) {\n          dest.append(src[eol - n])\n          n += 1\n        }\n        dest.toString()\n    }\n}\n\n\"Hello World\".reverseString()\n```\n##### Results\n```sql\ndlroW olleH\n```\n\u003ca name=\"Implicit_Class_Importing\"\u003e\u003c/a\u003e\n### Implicit Class Importing\n*Description*: Imports the methods of a Scala implicit class\n\n```sql\nimport implicit \"com.lollypop.util.StringRenderHelper$StringRenderer\"\nDateTime().renderAsJson()\n```\n##### Results\n```sql\n\"2025-10-30T02:14:55.089Z\"\n```\n\u003ca name=\"Matrix_and_Vector_Literals\"\u003e\u003c/a\u003e\n### Matrix and Vector Literals\n*Description*: Creates a new matrix\n\n```sql\nvector = [2.0, 1.0, 3.0]\nmatrixA = new Matrix([\n  [1.0, 2.0, 3.0],\n  [4.0, 5.0, 6.0],\n  [7.0, 8.0, 9.0]\n])\nmatrixA * vector\n```\n##### Results\n```sql\n[13.0, 31.0, 49.0]\n```\n\u003ca name=\"Matter_of_taste\"\u003e\u003c/a\u003e\n### Matter of taste\n*Description*: The solution to a problem can be achieved many different ways...\n\n```sql\nimport 'java.lang.Runtime'\nrt = Runtime.getRuntime()\n\nchart = { shape: \"pie3d\", title: \"Memory Usage\" }\ngraph chart from {\n    // (1) the following declarative expression ...\n    [{ name: 'totalMemory', value: rt.totalMemory() },\n     { name: 'freeMemory', value: rt.freeMemory() }].toTable()\n\n    // (2) and the following SQL statement ...\n    select name: 'totalMemory', value: rt.totalMemory()\n      union\n    select name: 'freeMemory', value: rt.freeMemory()\n\n    // (3) and the following multi-paradigm statement are all equivalent.\n    transpose(select totalMemory: rt.totalMemory(), freeMemory: rt.freeMemory())\n}\n```\n##### Results\n\u003cdiv style=\"width: 100%\"\u003e\n\u003cimg src=\"./docs/images/Memory_Usage.png\"\u003e\n\u003c/div\u003e\n\n\u003ca name=\"No_semicolons_required\"\u003e\u003c/a\u003e\n### No semicolons required\n*Description*: Separators are unnecessary between most statements\n\n```sql\nx = ['A', 'B', 'C', 1, 5, 7] x ++ (x + 5)\n```\n##### Results\n```sql\n['A', 'B', 'C', 1, 5, 7, 'F', 'G', 'H', 6, 10, 12]\n```\n\u003ca name=\"String_Literals_Double_quoted_\"\u003e\u003c/a\u003e\n### String Literals (Double-quoted)\n*Description*: Declare strings\n\n```sql\nitem = { name : \"Larry\" }\n\"Hello {{ item.name }},\\nhow are you?\\nFine, I hope!\"\n```\n##### Results\n```sql\nHello Larry,\nhow are you?\nFine, I hope!\n```\n\u003ca name=\"String_Literals_Single_quoted_\"\u003e\u003c/a\u003e\n### String Literals (Single-quoted)\n*Description*: Declare strings\n\n```sql\nitem = { name : \"Larry\" }\n'Hello {{ item.name }},\\nhow are you?\\nFine, I hope!'\n```\n##### Results\n```sql\nHello Larry,\nhow are you?\nFine, I hope!\n```\n\u003ca name=\"String_Literals_Triple_Double_quoted_\"\u003e\u003c/a\u003e\n### String Literals (Triple-Double-quoted)\n*Description*: Declare multiline strings\n\n```sql\nitem = { name : \"Larry\" }\n\"\"\"|Hello {{ item.name }},\n   |how are you?\n   |Fine, I hope!\n   |\"\"\".stripMargin('|')\n```\n##### Results\n```sql\nHello Larry,\nhow are you?\nFine, I hope!\n\n```\n\u003ca name=\"String_Literals_Triple_Single_quoted_\"\u003e\u003c/a\u003e\n### String Literals (Triple-Single-quoted)\n*Description*: Declare multiline strings\n\n```sql\nitem = { name : \"Larry\" }\n'''|Hello {{ item.name }},\n   |how are you?\n   |Fine, I hope!\n   |'''.stripMargin('|')\n```\n##### Results\n```sql\nHello Larry,\nhow are you?\nFine, I hope!\n\n```\n\u003ca name=\"Examples\"\u003e\u003c/a\u003e\n\n\u003ca name=\"Aggregation_and_Sorting\"\u003e\u003c/a\u003e\n## Aggregation and Sorting Examples\n\u003chr\u003e\n\n\u003ca name=\"avg\"\u003e\u003c/a\u003e\n### avg¹ (Aggregation and Sorting \u0026#8212; Functional) \n*Description*: Computes the average of a numeric expression.\n\n```sql\nval stocks =\n    |------------------------------|\n    | symbol | exchange | lastSale |\n    |------------------------------|\n    | XYZ    | AMEX     |    31.95 |\n    | ABC    | NYSE     |    56.12 |\n    | DNS    | AMEX     |    97.61 |\n    |------------------------------|\navg(stocks#lastSale)\n```\n##### Results\n```sql\n61.89333333333334\n```\n### avg² (Aggregation and Sorting \u0026#8212; Functional) \n*Description*: Computes the average of a numeric expression.\n\n```sql\nval stocks =\n    |------------------------------|\n    | symbol | exchange | lastSale |\n    |------------------------------|\n    | XYZ    | AMEX     |    31.95 |\n    | ABC    | NYSE     |    56.12 |\n    | DNS    | AMEX     |    97.61 |\n    |------------------------------|\nselect avgLastSale: avg(lastSale) from @stocks\n```\n##### Results\n```sql\n|-------------------|\n| avgLastSale       |\n|-------------------|\n| 61.89333333333334 |\n|-------------------|\n```\n\u003ca name=\"count\"\u003e\u003c/a\u003e\n### count¹ (Aggregation and Sorting \u0026#8212; Functional) \n*Description*: Returns the number of rows matching the query criteria.\n\n```sql\nstocks =\n|---------------------------------------------------------|\n| exchange | symbol | lastSale | lastSaleTime             |\n|---------------------------------------------------------|\n| NYSE     | RPPI   |  51.8413 | 2023-09-28T00:58:42.974Z |\n| AMEX     | MDLA   | 177.1311 | 2023-09-28T00:58:44.363Z |\n| OTCBB    | VMUT   |          | 2023-09-28T00:58:35.392Z |\n| AMEX     | QTZUA  | 120.5353 | 2023-09-28T00:58:08.024Z |\n| OTCBB    | JCJMT  |          | 2023-09-28T00:58:17.985Z |\n| NASDAQ   | EMY    |  24.6447 | 2023-09-28T00:58:22.595Z |\n|---------------------------------------------------------|\ncount(stocks)\n```\n##### Results\n```sql\n6\n```\n### count² (Aggregation and Sorting \u0026#8212; Functional) \n*Description*: Returns the number of rows matching the query criteria.\n\n```sql\nstocks =\n|---------------------------------------------------------|\n| exchange | symbol | lastSale | lastSaleTime             |\n|---------------------------------------------------------|\n| NYSE     | RPPI   |  51.8413 | 2023-09-28T00:58:42.974Z |\n| AMEX     | MDLA   | 177.1311 | 2023-09-28T00:58:44.363Z |\n| OTCBB    | VMUT   |          | 2023-09-28T00:58:35.392Z |\n| AMEX     | QTZUA  | 120.5353 | 2023-09-28T00:58:08.024Z |\n| OTCBB    | JCJMT  |          | 2023-09-28T00:58:17.985Z |\n| NASDAQ   | EMY    |  24.6447 | 2023-09-28T00:58:22.595Z |\n|---------------------------------------------------------|\ncount(stocks#lastSale)\n```\n##### Results\n```sql\n6\n```\n### count³ (Aggregation and Sorting \u0026#8212; Functional) \n*Description*: Returns the number of rows matching the query criteria.\n\n```sql\nstocks =\n|---------------------------------------------------------|\n| exchange | symbol | lastSale | lastSaleTime             |\n|---------------------------------------------------------|\n| NYSE     | RPPI   |  51.8413 | 2023-09-28T00:58:42.974Z |\n| AMEX     | MDLA   | 177.1311 | 2023-09-28T00:58:44.363Z |\n| OTCBB    | VMUT   |          | 2023-09-28T00:58:35.392Z |\n| AMEX     | QTZUA  | 120.5353 | 2023-09-28T00:58:08.024Z |\n| OTCBB    | JCJMT  |          | 2023-09-28T00:58:17.985Z |\n| NASDAQ   | EMY    |  24.6447 | 2023-09-28T00:58:22.595Z |\n|---------------------------------------------------------|\nselect total: count(*) from @stocks\n```\n##### Results\n```sql\n|-------|\n| total |\n|-------|\n|     6 |\n|-------|\n```\n### count⁴ (Aggregation and Sorting \u0026#8212; Functional) \n*Description*: Returns the number of rows matching the query criteria.\n\n```sql\nstocks =\n|---------------------------------------------------------|\n| exchange | symbol | lastSale | lastSaleTime             |\n|---------------------------------------------------------|\n| NYSE     | RPPI   |  51.8413 | 2023-09-28T00:58:42.974Z |\n| AMEX     | MDLA   | 177.1311 | 2023-09-28T00:58:44.363Z |\n| OTCBB    | VMUT   |          | 2023-09-28T00:58:35.392Z |\n| AMEX     | QTZUA  | 120.5353 | 2023-09-28T00:58:08.024Z |\n| OTCBB    | JCJMT  |          | 2023-09-28T00:58:17.985Z |\n| NASDAQ   | EMY    |  24.6447 | 2023-09-28T00:58:22.595Z |\n|---------------------------------------------------------|\nselect total: count(lastSale) from @stocks\n```\n##### Results\n```sql\n|-------|\n| total |\n|-------|\n|     4 |\n|-------|\n```\n\u003ca name=\"countUnique\"\u003e\u003c/a\u003e\n### countUnique¹ (Aggregation and Sorting \u0026#8212; Functional) \n*Description*: Returns the distinct number of rows matching the query criteria.\n\n```sql\nstocks =\n|---------------------------------------------------------|\n| symbol | exchange | lastSale | lastSaleTime             |\n|---------------------------------------------------------|\n| VDON   | OTCBB    |   0.4002 | 2023-07-29T05:06:56.232Z |\n| XETQ   | OTCBB    |   5.1147 | 2023-07-29T05:06:56.233Z |\n| XGDJ   | NASDAQ   |  51.5446 | 2023-07-29T05:06:56.236Z |\n| FQPY   | NASDAQ   |  75.4873 | 2023-07-29T05:06:56.238Z |\n| VNQR   | NASDAQ   |  38.5333 | 2023-07-29T05:06:56.239Z |\n|---------------------------------------------------------|\nselect total: count(unique(exchange)) from @stocks\n```\n##### Results\n```sql\n|-------|\n| total |\n|-------|\n|     2 |\n|-------|\n```\n### countUnique² (Aggregation and Sorting \u0026#8212; Functional) \n*Description*: Returns the distinct number of rows matching the query criteria.\n\n```sql\nstocks =\n|---------------------------------------------------------|\n| symbol | exchange | lastSale | lastSaleTime             |\n|---------------------------------------------------------|\n| VDON   | OTCBB    |   0.4002 | 2023-07-29T05:06:56.232Z |\n| XETQ   | OTCBB    |   5.1147 | 2023-07-29T05:06:56.233Z |\n| XGDJ   | NASDAQ   |  51.5446 | 2023-07-29T05:06:56.236Z |\n| FQPY   | NASDAQ   |  75.4873 | 2023-07-29T05:06:56.238Z |\n| VNQR   | NASDAQ   |  38.5333 | 2023-07-29T05:06:56.239Z |\n|---------------------------------------------------------|\nselect total: countUnique(exchange) from @stocks\n```\n##### Results\n```sql\n|-------|\n| total |\n|-------|\n|     2 |\n|-------|\n```\n\u003ca name=\"group_by\"\u003e\u003c/a\u003e\n### group by¹ (Aggregation and Sorting \u0026#8212; Declarative) \n*Description*: Aggregates a result set by a column\n\n```sql\nselect kind, total: count(*)\nfrom (this)\ngroup by kind\n```\n##### Results\n```sql\n|------------------------|\n| kind           | total |\n|------------------------|\n| PrintStream    |     2 |\n| Random$        |     1 |\n| OS             |     1 |\n| WebSockets$    |     1 |\n| BufferedReader |     1 |\n| Double         |     1 |\n| Nodes          |     1 |\n|------------------------|\n```\n### group by² (Aggregation and Sorting \u0026#8212; Declarative) \n*Description*: Aggregates a result set by a column\n\n```sql\nchart = { shape: \"pie3d\", title: \"Types in Session\" }\ngraph chart from (\n    select kind, total: count(*)\n    from (this)\n    group by kind\n)\n```\n##### Results\n\u003cdiv style=\"width: 100%\"\u003e\n\u003cimg src=\"./docs/images/Types_in_Session.png\"\u003e\n\u003c/div\u003e\n\n\u003ca name=\"max\"\u003e\u003c/a\u003e\n### max¹ (Aggregation and Sorting \u0026#8212; Functional) \n*Description*: Returns the maximum value of a numeric expression.\n\n```sql\nval stocks =\n    |------------------------------|\n    | symbol | exchange | lastSale |\n    |------------------------------|\n    | XYZ    | AMEX     |    31.95 |\n    | ABC    | NYSE     |    56.12 |\n    | DNS    | AMEX     |    97.61 |\n    |------------------------------|\nmax(stocks#lastSale)\n```\n##### Results\n```sql\n97.61\n```\n### max² (Aggregation and Sorting \u0026#8212; Functional) \n*Description*: Returns the maximum value of a numeric expression.\n\n```sql\nval stocks =\n    |------------------------------|\n    | symbol | exchange | lastSale |\n    |------------------------------|\n    | XYZ    | AMEX     |    31.95 |\n    | ABC    | NYSE     |    56.12 |\n    | DNS    | AMEX     |    97.61 |\n    |------------------------------|\nselect maxLastSale: max(lastSale) from @stocks\n```\n##### Results\n```sql\n|-------------|\n| maxLastSale |\n|-------------|\n|       97.61 |\n|-------------|\n```\n\u003ca name=\"min\"\u003e\u003c/a\u003e\n### min¹ (Aggregation and Sorting \u0026#8212; Functional) \n*Description*: Returns the minimum value of a numeric expression.\n\n```sql\nval stocks =\n    |------------------------------|\n    | symbol | exchange | lastSale |\n    |------------------------------|\n    | XYZ    | AMEX     |    31.95 |\n    | ABC    | NYSE     |    56.12 |\n    | DNS    | AMEX     |    97.61 |\n    |------------------------------|\nmin(stocks#lastSale)\n```\n##### Results\n```sql\n31.95\n```\n### min² (Aggregation and Sorting \u0026#8212; Functional) \n*Description*: Returns the minimum value of a numeric expression.\n\n```sql\nval stocks =\n    |------------------------------|\n    | symbol | exchange | lastSale |\n    |------------------------------|\n    | XYZ    | AMEX     |    31.95 |\n    | ABC    | NYSE     |    56.12 |\n    | DNS    | AMEX     |    97.61 |\n    |------------------------------|\nselect minLastSale: min(lastSale) from @stocks\n```\n##### Results\n```sql\n|-------------|\n| minLastSale |\n|-------------|\n|       31.95 |\n|-------------|\n```\n\u003ca name=\"order_by\"\u003e\u003c/a\u003e\n### order by (Aggregation and Sorting \u0026#8212; Declarative) \n*Description*: Sorts a result set by a column\n\n```sql\nfrom (\n |---------------------------------------------------------|\n | symbol | exchange | lastSale | lastSaleTime             |\n |---------------------------------------------------------|\n | HWWM   | NASDAQ   | 191.6725 | 2023-08-06T18:33:08.661Z |\n | VLYW   | AMEX     | 197.9962 | 2023-08-06T18:33:08.670Z |\n | VSOM   | NASDAQ   | 166.8542 | 2023-08-06T18:33:08.672Z |\n | FHWS   | NYSE     |  22.5909 | 2023-08-06T18:33:08.673Z |\n | SRGN   | AMEX     | 180.2358 | 2023-08-06T18:33:08.675Z |\n | PTFY   | NYSE     |  19.9265 | 2023-08-06T18:33:08.676Z |\n |---------------------------------------------------------|\n) order by lastSale desc\n```\n##### Results\n```sql\n|---------------------------------------------------------|\n| symbol | exchange | lastSale | lastSaleTime             |\n|---------------------------------------------------------|\n| VLYW   | AMEX     | 197.9962 | 2023-08-06T18:33:08.670Z |\n| HWWM   | NASDAQ   | 191.6725 | 2023-08-06T18:33:08.661Z |\n| SRGN   | AMEX     | 180.2358 | 2023-08-06T18:33:08.675Z |\n| VSOM   | NASDAQ   | 166.8542 | 2023-08-06T18:33:08.672Z |\n| FHWS   | NYSE     |  22.5909 | 2023-08-06T18:33:08.673Z |\n| PTFY   | NYSE     |  19.9265 | 2023-08-06T18:33:08.676Z |\n|---------------------------------------------------------|\n```\n\u003ca name=\"sum\"\u003e\u003c/a\u003e\n### sum¹ (Aggregation and Sorting \u0026#8212; Functional) \n*Description*: Returns the sum of a numeric expression.\n\n```sql\nstocks = (\n|-------------------|\n| symbol | lastSale |\n|-------------------|\n| VHLH   | 153.2553 |\n| GPI    |  89.7307 |\n| SGE    | 131.6038 |\n| GVABB  |  31.1324 |\n| GTIT   | 110.6881 |\n| JDXEZ  | 243.4389 |\n| RNUBE  | 157.2571 |\n| DBY    | 237.5894 |\n| CO     | 109.6587 |\n| BIU    | 232.9175 |\n|-------------------|\n)\nsum(stocks#lastSale)\n```\n##### Results\n```sql\n1497.2719\n```\n### sum² (Aggregation and Sorting \u0026#8212; Functional) \n*Description*: Returns the sum of a numeric expression.\n\n```sql\nselect total: sum(lastSale) from (\n|-------------------|\n| symbol | lastSale |\n|-------------------|\n| VHLH   | 153.2553 |\n| GPI    |  89.7307 |\n| SGE    | 131.6038 |\n| GVABB  |  31.1324 |\n| GTIT   | 110.6881 |\n| JDXEZ  | 243.4389 |\n| RNUBE  | 157.2571 |\n| DBY    | 237.5894 |\n| CO     | 109.6587 |\n| BIU    | 232.9175 |\n|-------------------|\n)\n```\n##### Results\n```sql\n|-----------|\n| total     |\n|-----------|\n| 1497.2719 |\n|-----------|\n```\n\u003ca name=\"TableArray\"\u003e\u003c/a\u003e\n### TableArray¹ (Aggregation and Sorting \u0026#8212; Declarative) \n*Description*: Transforms an array of an array of primitive values (Boolean, Int, String et al) into a table\n\n```sql\ndef iostat(n, m) := TableArray((? iostat $n $m ?).drop(1).map(x =\u003e\n  x.trim()\n   .replaceAll(\"  \", \" \")\n   .split(\"[ ]\")\n   .filter(x =\u003e not x.isEmpty())\n))\niostat(1, 5)\n```\n##### Results\n```sql\n|---------------------------------------------------------|\n| KB/t   | tps | MB/s  | us | sy | id | 1m  | 5m   | 15m  |\n|---------------------------------------------------------|\n|  17.48 |  35 |  0.59 |  7 |  3 | 90 | 3.9 | 4.07 | 3.69 |\n|   16.0 |   1 |  0.02 |  6 |  3 | 91 | 3.9 | 4.07 | 3.69 |\n|   4.92 |  13 |  0.06 | 11 |  6 | 84 | 3.9 | 4.07 | 3.69 |\n|   4.56 | 212 |  0.95 | 16 |  3 | 82 | 3.9 | 4.07 | 3.69 |\n| 137.11 |  94 | 12.53 | 13 |  2 | 85 | 3.9 | 4.07 | 3.69 |\n|---------------------------------------------------------|\n```\n### TableArray² (Aggregation and Sorting \u0026#8212; Declarative) \n*Description*: Transforms an array of an array of primitive values (Boolean, Int, String et al) into a table\n\n```sql\ndef ps() := TableArray((? ps aux ?).map(x =\u003e\n  x.trim()\n   .replaceAll(\"  \", \" \")\n   .split(\"[ ]\")\n   .filter(x =\u003e not x.isEmpty())\n))\nselect PID, `%CPU`, `%MEM`, STARTED, TIME, VSZ, RSS\nfrom (ps())\norder by `%CPU` desc\nlimit 5\n```\n##### Results\n```sql\n|------------------------------------------------------------------|\n| PID   | %CPU  | %MEM | STARTED | TIME      | VSZ       | RSS     |\n|------------------------------------------------------------------|\n| 21997 | 201.9 |  9.7 | Sun10PM | 149:08.41 | 439574544 | 9767296 |\n|   385 |  10.4 |  0.3 | 20Oct25 | 572:30.44 | 416779888 |  285568 |\n| 40959 |   9.6 |  0.7 | 7:14PM  | 0:06.24   | 441731952 |  675968 |\n| 24315 |   6.3 |  0.9 | Mon12AM | 143:05.96 | 418138896 |  917232 |\n|   587 |   3.1 |  0.1 | 20Oct25 | 5:00.92   | 412368896 |   61872 |\n|------------------------------------------------------------------|\n```\n\u003ca name=\"to\"\u003e\u003c/a\u003e\n### to (Aggregation and Sorting \u0026#8212; Declarative) \n*Description*: Defines an inclusive range of values\n\n```sql\n'A' to 'G'\n```\n##### Results\n```sql\n['A', 'B', 'C', 'D', 'E', 'F', 'G']\n```\n\u003ca name=\"transpose\"\u003e\u003c/a\u003e\n### transpose¹ (Aggregation and Sorting \u0026#8212; Declarative) \n*Description*: Makes columns into rows and rows into columns. The function returns a table with the rows and columns transposed.\n\n```sql\ntranspose(items: [1 to 5])\n```\n##### Results\n```sql\n|-------|\n| items |\n|-------|\n|     1 |\n|     2 |\n|     3 |\n|     4 |\n|     5 |\n|-------|\n```\n### transpose² (Aggregation and Sorting \u0026#8212; Declarative) \n*Description*: Makes columns into rows and rows into columns. The function returns a table with the rows and columns transposed.\n\n```sql\nfaces = transpose(face: [\"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\", \"J\", \"Q\", \"K\", \"A\"])\nsuits = transpose(suit: [\"♠\", \"♦\", \"♥\", \"♣\"])\ndeck = faces * suits\ndeck.shuffle()\n@deck limit 5\n```\n##### Results\n```sql\n|-------------|\n| face | suit |\n|-------------|\n| 2    | ♣    |\n| 8    | ♠    |\n| 7    | ♣    |\n| 3    | ♦    |\n| 7    | ♦    |\n|-------------|\n```\n### transpose³ (Aggregation and Sorting \u0026#8212; Declarative) \n*Description*: Makes columns into rows and rows into columns. The function returns a table with the rows and columns transposed.\n\n```sql\ntranspose(help('select'))\n```\n##### Results\n```sql\n|----------------------------------------------------------------------------------------------------|\n| name        | value                                                                                |\n|----------------------------------------------------------------------------------------------------|\n| name        | select                                                                               |\n| category    | Dataframe I/O                                                                        |\n| paradigm    | Declarative                                                                          |\n| description | Returns row(s) of data based on the expression and options                           |\n| example     | select symbol: 'GMTQ', exchange: 'OTCBB', lastSale: 0.1111, lastSaleTime: DateTime() |\n|----------------------------------------------------------------------------------------------------|\n```\n### transpose⁴ (Aggregation and Sorting \u0026#8212; Declarative) \n*Description*: Makes columns into rows and rows into columns. The function returns a table with the rows and columns transposed.\n\n```sql\ntranspose(new Matrix([\n  [1.0, 2.0, 3.0],\n  [4.0, 5.0, 6.0],\n  [7.0, 8.0, 9.0]\n]))\n```\n##### Results\n```sql\n|-----------------|\n| A   | B   | C   |\n|-----------------|\n| 1.0 | 4.0 | 7.0 |\n| 2.0 | 5.0 | 8.0 |\n| 3.0 | 6.0 | 9.0 |\n|-----------------|\n```\n\u003ca name=\"unique\"\u003e\u003c/a\u003e\n### unique (Aggregation and Sorting \u0026#8212; Functional) \n*Description*: Returns a unique collection of elements based on the query criteria.\n\n```sql\nval stocks =\n  |------------------------------|\n  | symbol | exchange | lastSale |\n  |------------------------------|\n  | XYZ    | AMEX     |    31.95 |\n  | ABC    | NYSE     |    56.12 |\n  | YOKE   | NYSE     |    56.12 |\n  | DNS    | AMEX     |    97.61 |\n  |------------------------------|\nselect exchange: unique(exchange) from @stocks\n```\n##### Results\n```sql\n|------------------|\n| exchange         |\n|------------------|\n| [\"AMEX\", \"NYSE\"] |\n|------------------|\n```\n\u003ca name=\"unnest\"\u003e\u003c/a\u003e\n### unnest (Aggregation and Sorting \u0026#8212; Declarative) \n*Description*: Explodes a column of a collection into multiple rows.\n\n```sql\ndeclare table stocks(symbol: String(4), exchange: String(6), transactions: Table(price: Double, transactionTime: DateTime)[5])\ninsert into @stocks (symbol, exchange, transactions)\nvalues ('AAPL', 'NASDAQ', {price:156.39, transactionTime:\"2021-08-05T19:23:11.000Z\"}),\n       ('AMD',  'NASDAQ', {price:56.87, transactionTime:\"2021-08-05T19:23:11.000Z\"}),\n       ('INTC', 'NYSE',   {price:89.44, transactionTime:\"2021-08-05T19:23:11.000Z\"}),\n       ('AMZN', 'NASDAQ', {price:988.12, transactionTime:\"2021-08-05T19:23:11.000Z\"}),\n       ('SHMN', 'OTCBB', [{price:0.0010, transactionTime:\"2021-08-05T19:23:11.000Z\"},\n                          {price:0.0011, transactionTime:\"2021-08-05T19:23:12.000Z\"}])\n\nselect symbol, exchange, unnest(transactions) from @stocks where symbol is 'SHMN'\n```\n##### Results\n```sql\n|-------------------------------------------------------|\n| symbol | exchange | price  | transactionTime          |\n|-------------------------------------------------------|\n| SHMN   | OTCBB    |  0.001 | 2021-08-05T19:23:11.000Z |\n| SHMN   | OTCBB    | 0.0011 | 2021-08-05T19:23:12.000Z |\n|-------------------------------------------------------|\n```\n\u003ca name=\"until\"\u003e\u003c/a\u003e\n### until (Aggregation and Sorting \u0026#8212; Declarative) \n*Description*: Defines an exclusive range of values\n\n```sql\n'A' until 'G'\n```\n##### Results\n```sql\n['A', 'B', 'C', 'D', 'E', 'F']\n```\n\u003ca name=\"Concurrency\"\u003e\u003c/a\u003e\n## Concurrency Examples\n\u003chr\u003e\n\n\u003ca name=\"after\"\u003e\u003c/a\u003e\n### after (Concurrency \u0026#8212; Reactive) \n*Description*: Schedules a one-time execution of command(s) after a specific delay period\n\n```sql\nvar ticker = 5\nafter Duration('100 millis') ticker += 3\nimport \"java.lang.Thread\"\nThread.sleep(Long(250))\nticker is 8\n```\n##### Results\n```sql\ntrue\n```\n\u003ca name=\"async\"\u003e\u003c/a\u003e\n### async (Concurrency \u0026#8212; Reactive) \n*Description*: Asynchronously executes an instruction\n\n```sql\nasync { OS.listFiles(\"./app\") }\n```\n##### Results\n```sql\n|-------------------------------------------------------------------------------------------------------------------------------------|\n| name        | canonicalPath                                   | lastModified             | length | isDirectory | isFile | isHidden |\n|-------------------------------------------------------------------------------------------------------------------------------------|\n| kungfu      | /Users/ldaniels/GitHub/lollypop/app/kungfu      | 2024-07-30T03:15:25.887Z |    160 | true        | false  | false    |\n| .DS_Store   | /Users/ldaniels/GitHub/lollypop/app/.DS_Store   | 2025-10-30T02:10:47.127Z |   8196 | false       | true   | true     |\n| core        | /Users/ldaniels/GitHub/lollypop/app/core        | 2023-05-23T21:20:11.818Z |    160 | true        | false  | false    |\n| target      | /Users/ldaniels/GitHub/lollypop/app/target      | 2024-02-16T14:34:39.104Z |    192 | true        | false  | false    |\n| examples    | /Users/ldaniels/GitHub/lollypop/app/examples    | 2023-11-12T07:50:27.491Z |    288 | true        | false  | false    |\n| jdbc-driver | /Users/ldaniels/GitHub/lollypop/app/jdbc-driver | 2023-06-29T22:26:20.960Z |    160 | true        | false  | false    |\n|-------------------------------------------------------------------------------------------------------------------------------------|\n```\n\u003ca name=\"every\"\u003e\u003c/a\u003e\n### every (Concurrency \u0026#8212; Reactive) \n*Description*: Schedules the execution of command(s) on a specific interval\n\n```sql\nvar n = 0\nval timer = every Duration(\"20 millis\") n += 1\nimport \"java.lang.Thread\"\nThread.sleep(Long(1000))\ntimer.cancel()\nn\n```\n##### Results\n```sql\n51\n```\n\u003ca name=\"Nodes\"\u003e\u003c/a\u003e\n### Nodes¹ (Concurrency \u0026#8212; Declarative) \n*Description*: Executes a statement on a running Lollypop peer node.\n\n```sql\nnode = Nodes.start()\nnode.awaitStartup(Duration('1 second'))\nresults = node.exec('''\nfrom (\n|-------------------------------------------------------|\n| ticker | market | lastSale | lastSaleTime             |\n|-------------------------------------------------------|\n| NKWI   | OTCBB  |  98.9501 | 2022-09-04T23:36:47.846Z |\n| AQKU   | NASDAQ |  68.2945 | 2022-09-04T23:36:47.860Z |\n| WRGB   | AMEX   |  46.8355 | 2022-09-04T23:36:47.862Z |\n| ESCN   | AMEX   |  42.5934 | 2022-09-04T23:36:47.865Z |\n| NFRK   | AMEX   |  28.2808 | 2022-09-04T23:36:47.864Z |\n|-------------------------------------------------------|\n) where lastSale \u003c 30\n''')\nnode.stop()\nresults\n```\n##### Results\n```sql\n|-------------------------------------------------------|\n| ticker | market | lastSale | lastSaleTime             |\n|-------------------------------------------------------|\n| NFRK   | AMEX   |  28.2808 | 2022-09-04T23:36:47.864Z |\n|-------------------------------------------------------|\n```\n### Nodes² (Concurrency \u0026#8212; Functional) \n*Description*: Creates a new REST API endpoint.\n\n```sql\nnode = Nodes.start()\nnode.awaitStartup(Duration('1 second'))\nnode.api('/api/comments/', {\n  post: (message: String) =\u003e \"post '{{message}}'\"\n  get: (id: UUID) =\u003e \"get {{(id}}\"\n  put: (id: UUID, message: String) =\u003e \"put '{{message}}' ~\u003e {{(id}}\"\n  delete: (id: UUID) =\u003e \"delete {{(id}}\"\n})\nwww post \"http://0.0.0.0:{{node.server.port()}}/api/comments/\" \u003c~ { message: \"Hello World\" }\n```\n##### Results\n```sql\nHttpResponse(body=\"post 'Hello World'\", message=\"OK\", statusCode=200, responseID=5e58a6f8-aca9-4aa8-a11f-2e4cf726b8a2)\n```\n### Nodes³ (Concurrency \u0026#8212; Declarative) \n*Description*: Opens a commandline interface to a remote Lollypop peer node.\n\n```sql\nnode = Nodes.start()\nnode.awaitStartup(Duration('1 second'))\ntry\n  node.exec([\"x = 1\", \"y = 2\", \"z = x + y\", \"z\"])\ncatch e =\u003e stderr \u003c=== e\nfinally\n  node.stop()\n```\n##### Results\n```sql\n|--------|\n| result |\n|--------|\n|      3 |\n|--------|\n```\n### Nodes⁴ (Concurrency \u0026#8212; Declarative) \n*Description*: Creates a new HTML/CSS/File endpoint\n\n```sql\nnode = Nodes.start()\nnode.awaitStartup(Duration('1 second'))\nnode.files('/www/notebooks/', {\n  \"\" : \"public/index.html\",\n  \"*\" : \"public\"\n})\n```\n##### Results\n```sql\nfalse\n```\n\u003ca name=\"once\"\u003e\u003c/a\u003e\n### once (Concurrency \u0026#8212; Reactive) \n*Description*: Invokes an instruction or set of instructions one-time only\n\n```sql\n[1 to 5].foreach(n =\u003e {\n  stdout \u003c=== 'This happens every cycle {{n}}\\n'\n  once stdout \u003c=== 'This happens once {{n}}\\n'\n})\n```\n##### Results\n```sql\n()\n```\n##### Console Output\n```\nThis happens every cycle 1\nThis happens once 1\nThis happens every cycle 2\nThis happens every cycle 3\nThis happens every cycle 4\nThis happens every cycle 5\n```\n\u003ca name=\"whenever\"\u003e\u003c/a\u003e\n### whenever¹ (Concurrency \u0026#8212; Reactive) \n*Description*: Executes an instruction at the moment the conditional expression evaluates as true\n\n```sql\nwhenever n_bricks is 0 { stdout \u003c=== \"n_bricks is empty\\n\" }\nstdout \u003c=== \"Setting n_bricks to 0\\n\"\nn_bricks = 0\nstdout \u003c=== \"Did it work?\"\n```\n##### Results\n```sql\njava.io.PrintStream@23ea8830\n```\n##### Console Output\n```\nSetting n_bricks to 0\nn_bricks is empty\nDid it work?\n```\n### whenever² (Concurrency \u0026#8212; Reactive) \n*Description*: Executes an instruction at the moment the regular expression evaluates as true\n\n```sql\nwhenever '^set(.*)'\n  stdout \u003c=== \"instruction was '{{__INSTRUCTION__}}'\\n\"\n\nset x = { message: \"Confirmed\" }\nstdout \u003c=== \"Did it work?\"\n```\n##### Results\n```sql\njava.io.PrintStream@23ea8830\n```\n##### Console Output\n```\ninstruction was 'set x = { message: \"Confirmed\" }'\nDid it work?\n```\n\u003ca name=\"Control_Flow\"\u003e\u003c/a\u003e\n## Control Flow Examples\n\u003chr\u003e\n\n\u003ca name=\"_\"\u003e\u003c/a\u003e\n### \u0026\u0026 (Control Flow \u0026#8212; Declarative) \n*Description*: Binds multiple statements together\n\n```sql\ndeclare table if not exists TradingSystem (\n  stock_id: RowNumber,\n  symbol: String(5),\n  exchange: Enum ('AMEX', 'NASDAQ', 'NYSE', 'OTCBB', 'OTHEROTC'),\n  lastSale: Double,\n  lastSaleTime: DateTime = DateTime())\n\u0026\u0026 insert into TradingSystem (symbol, exchange, lastSale, lastSaleTime)\n   values (\"MSFT\", \"NYSE\", 56.55, DateTime()),\n          (\"AAPL\", \"NASDAQ\", 98.55, DateTime()),\n          (\"AMZN\", \"NYSE\", 56.55, DateTime()),\n          (\"GOOG\", \"NASDAQ\", 98.55, DateTime())\n\u0026\u0026 from TradingSystem\n```\n##### Results\n```sql\n|--------------------------------------------------------------------|\n| stock_id | symbol | exchange | lastSale | lastSaleTime             |\n|--------------------------------------------------------------------|\n|        0 | MSFT   | NYSE     |    56.55 | 2025-10-30T02:15:01.978Z |\n|        1 | AAPL   | NASDAQ   |    98.55 | 2025-10-30T02:15:01.978Z |\n|        2 | AMZN   | NYSE     |    56.55 | 2025-10-30T02:15:01.978Z |\n|        3 | GOOG   | NASDAQ   |    98.55 | 2025-10-30T02:15:01.978Z |\n|--------------------------------------------------------------------|\n```\n\u003ca name=\"__\"\u003e\u003c/a\u003e\n### ??? (Control Flow \u0026#8212; Declarative) \n*Description*: `???` can be used for marking methods that remain to be implemented.\n\n```sql\ndef blowUp() := ???\ntry\n  blowUp()\ncatch e =\u003e\n  stdout \u003c=== e.getMessage()\n```\n##### Results\n```sql\njava.io.PrintStream@23ea8830\n```\n##### Console Output\n```\nan implementation is missing on line 3 at 3\n```\n\u003ca name=\"call\"\u003e\u003c/a\u003e\n### call (Control Flow \u0026#8212; Procedural) \n*Description*: Executes a stored procedure; returns a row set\n\n```sql\nnamespace \"test.examples\"\nstockQuotes =\n |---------------------------------------------------------|\n | symbol | exchange | lastSale | lastSaleTime             |\n |---------------------------------------------------------|\n | DBGK   | AMEX     |  46.2471 | 2023-08-06T04:50:07.478Z |\n | GROT   | NASDAQ   |  44.3673 | 2023-08-06T04:50:07.480Z |\n | SCOF   | NASDAQ   |  60.8058 | 2023-08-06T04:50:07.482Z |\n | CYCR   | NASDAQ   |  83.9982 | 2023-08-06T04:50:07.483Z |\n | IIDA   | NASDAQ   | 126.3182 | 2023-08-06T04:50:07.484Z |\n |---------------------------------------------------------|\ndrop if exists getStockQuote\ncreate procedure getStockQuote(theExchange: String,\n                               --\u003e exchange: String,\n                               --\u003e total: Double,\n                               --\u003e maxPrice: Double,\n                               --\u003e minPrice: Double) as\n  select exchange, total: count(*), maxPrice: max(lastSale), minPrice: min(lastSale)\n  from @stockQuotes\n  where exchange is theExchange\n  group by exchange\n\ncall getStockQuote(\"NASDAQ\")\n```\n##### Results\n```sql\n|----------------------------------------|\n| exchange | total | maxPrice | minPrice |\n|----------------------------------------|\n| NASDAQ   |   4.0 | 126.3182 |  44.3673 |\n|----------------------------------------|\n```\n\u003ca name=\"create_function\"\u003e\u003c/a\u003e\n### create function (Control Flow \u0026#8212; Procedural) \n*Description*: Creates a function\n\n```sql\ncreate function if not exists calc_add(a: Int, b: Int) := a + b\n```\n##### Results\n```sql\n|------------------------------------------------------------------------------------------------------|\n| altered | created | destroyed | deleted | inserted | matched | scanned | shuffled | updated | rowIDs |\n|------------------------------------------------------------------------------------------------------|\n|       0 |       1 |         0 |       0 |        0 |       0 |       0 |        0 |       0 | []     |\n|------------------------------------------------------------------------------------------------------|\n```\n\u003ca name=\"create_macro\"\u003e\u003c/a\u003e\n### create macro (Control Flow \u0026#8212; Declarative) \n*Description*: Creates a persistent macro\n\n```sql\nnamespace \"temp.examples\"\ncreate macro if not exists n_tickers := \"tickers %e:qty\" {\n  [1 to qty].map(_ =\u003e {\n      exchange = ['AMEX', 'NASDAQ', 'NYSE', 'OTCBB', 'OTHER_OTC'][Random.nextInt(5)]\n      is_otc = exchange.startsWith(\"OT\")\n      lastSaleLimit = switch exchange case \"OTCBB\" then 5.0 case \"OTHER_OTC\" then 1.0 case _ then 100.0\n      lastSale = scaleTo(lastSaleLimit * Random.nextDouble(1.0), 4)\n      lastSaleTime = DateTime(DateTime() - Duration(1000 * 60 * Random.nextDouble(1.0)))\n      symbol = Random.nextString(['A' to 'Z'], iff(exchange.startsWith(\"OT\"), Random.nextInt(2) + 4, Random.nextInt(4) + 2))\n      select lastSaleTime, lastSale, exchange, symbol\n  }).toTable()\n}\n\ntickers 5\n```\n##### Results\n```sql\n|----------------------------------------------------------|\n| exchange  | symbol | lastSale | lastSaleTime             |\n|----------------------------------------------------------|\n| OTHER_OTC | YRKCD  |   0.7349 | 2025-10-30T02:14:33.582Z |\n| AMEX      | IB     |   1.2678 | 2025-10-30T02:14:59.131Z |\n| AMEX      | NNOG   |  15.0754 | 2025-10-30T02:14:41.042Z |\n| NYSE      | UN     |  72.5213 | 2025-10-30T02:14:07.038Z |\n| NASDAQ    | SZYSL  |  45.1858 | 2025-10-30T02:14:14.629Z |\n|----------------------------------------------------------|\n```\n\u003ca name=\"create_procedure\"\u003e\u003c/a\u003e\n### create procedure (Control Flow \u0026#8212; Procedural) \n*Description*: Creates a database procedure\n\n```sql\nnamespace \"test.examples\"\nstockQuotes =\n |---------------------------------------------------------|\n | symbol | exchange | lastSale | lastSaleTime             |\n |---------------------------------------------------------|\n | DBGK   | AMEX     |  46.2471 | 2023-08-06T04:50:07.478Z |\n | GROT   | NASDAQ   |  44.3673 | 2023-08-06T04:50:07.480Z |\n | SCOF   | NASDAQ   |  60.8058 | 2023-08-06T04:50:07.482Z |\n | CYCR   | NASDAQ   |  83.9982 | 2023-08-06T04:50:07.483Z |\n | IIDA   | NASDAQ   | 126.3182 | 2023-08-06T04:50:07.484Z |\n |---------------------------------------------------------|\ndrop if exists getStockQuote\ncreate procedure getStockQuote(theExchange: String,\n                               --\u003e exchange: String,\n                               --\u003e total: Double,\n                               --\u003e maxPrice: Double,\n                               --\u003e minPrice: Double) :=\n    select exchange, total: count(*), maxPrice: max(lastSale), minPrice: min(lastSale)\n    from @stockQuotes\n    where exchange is theExchange\n    group by exchange\n\ncall getStockQuote(\"NASDAQ\")\n```\n##### Results\n```sql\n|----------------------------------------|\n| exchange | total | maxPrice | minPrice |\n|----------------------------------------|\n| NASDAQ   |   4.0 | 126.3182 |  44.3673 |\n|----------------------------------------|\n```\n\u003ca name=\"def\"\u003e\u003c/a\u003e\n### def¹ (Control Flow \u0026#8212; Functional) \n*Description*: Defines a named user-defined function\n\n```sql\ndef ¡(n: Double) := iff(n \u003c= 1.0, 1.0, n * ¡(n - 1.0))\n\n¡(5)\n```\n##### Results\n```sql\n120.0\n```\n### def² (Control Flow \u0026#8212; Functional) \n*Description*: Defines a named user-defined function\n\n```sql\ndef msec(op) := {\n    import [\"java.lang.System\"]\n    val startTime = System.nanoTime()\n    val result = op()\n    val elapsedTime = (System.nanoTime() - startTime) / 1000000.0\n    (elapsedTime, result)\n}\n\ndef ¡(n: Double) := iff(n \u003c= 1.0, 1.0, n * ¡(n - 1.0))\n\nmsec(() =\u003e ¡(6))\n```\n##### Results\n```sql\nTuple2(_1=0.329667, _2=720.0)\n```\n### def³ (Control Flow \u0026#8212; Functional) \n*Description*: Defines a named user-defined function\n\n```sql\ndef roman(value: Int) := (\"I\" * value)\n  .replaceAll(\"IIIII\", \"V\")\n  .replaceAll(\"IIII\", \"IV\")\n  .replaceAll(\"VV\", \"X\")\n  .replaceAll(\"VIV\", \"IX\")\n  .replaceAll(\"XXXXX\", \"L\")\n  .replaceAll(\"XXXX\", \"XL\")\n  .replaceAll(\"LL\", \"C\")\n  .replaceAll(\"LXL\", \"XC\")\n  .replaceAll(\"CCCCC\", \"D\")\n  .replaceAll(\"CCCC\", \"CD\")\n  .replaceAll(\"DD\", \"M\")\n  .replaceAll(\"DCD\", \"CM\")\n\nroman(1023)\n```\n##### Results\n```sql\nMXXIII\n```\n\u003ca name=\"do\"\u003e\u003c/a\u003e\n### do (Control Flow \u0026#8212; Procedural) \n*Description*: Creates a loop that executes enclosed statement(s) until the test condition evaluates to false\n\n```sql\nvar x = 0\nvar y = 1\ndo { x += 1; y *= x } while x \u003c 5\ny\n```\n##### Results\n```sql\n120\n```\n\u003ca name=\"each\"\u003e\u003c/a\u003e\n### each¹ (Control Flow \u0026#8212; Declarative) \n*Description*: Iterates over a dataframe applying a function to each row and optionally yields a new transformed dataframe\n\n```sql\nstocks =\n|---------------------------------------------------------|\n| symbol | exchange | lastSale | lastSaleTime             |\n|---------------------------------------------------------|\n| LORI   | NYSE     |  89.6033 | 2023-07-29T04:09:04.524Z |\n| AVSR   | AMEX     | 477.5694 | 2023-07-29T04:09:04.529Z |\n| KXYP   | OTCBB    | 475.6416 | 2023-07-29T04:09:04.531Z |\n| JYVV   | NYSE     | 197.1071 | 2023-07-29T04:09:04.532Z |\n| EVDX   | OTCBB    |  77.1829 | 2023-07-29T04:09:04.533Z |\n|---------------------------------------------------------|\nvar messages = []\neach item in (select symbol, lastSale from @stocks where lastSale \u003c 100)\n  messages = messages.push('{{item.symbol}} is {{item.lastSale}}/share')\nmessages\n```\n##### Results\n```sql\n[\"LORI is 89.6033/share\", \"EVDX is 77.1829/share\"]\n```\n### each² (Control Flow \u0026#8212; Declarative) \n*Description*: Iterates a dataframe in reverse order applying a function to each row\n\n```sql\nstocks =\n|----------------------------------------------------------|\n| exchange  | symbol | lastSale | lastSaleTime             |\n|----------------------------------------------------------|\n| OTHER_OTC | WAEQK  |   0.6713 | 2023-10-14T18:40:32.998Z |\n| NASDAQ    | RQNMU  |  19.6168 | 2023-10-14T18:40:32.335Z |\n| NASDAQ    | WP     |  45.7338 | 2023-10-14T18:40:24.264Z |\n| OTHER_OTC | NNFO   |    0.151 | 2023-10-14T18:39:51.236Z |\n| NASDAQ    | LVEBB  |   8.4378 | 2023-10-14T18:39:58.491Z |\n| NASDAQ    | SWTD   |  22.5552 | 2023-10-14T18:39:50.783Z |\n| OTHER_OTC | CZYBQ  |   0.8543 | 2023-10-14T18:40:40.513Z |\n| NASDAQ    | CQ     | 174.0586 | 2023-10-14T18:39:55.858Z |\n| NYSE      | QOVGA  |   1.9199 | 2023-10-14T18:40:14.590Z |\n| NYSE      | ZJWL   |  17.3107 | 2023-10-14T18:40:13.205Z |\n|----------------------------------------------------------|\neach item in (stocks.reverse()) yield item\n```\n##### Results\n```sql\n|----------------------------------------------------------|\n| exchange  | symbol | lastSale | lastSaleTime             |\n|----------------------------------------------------------|\n| NYSE      | ZJWL   |  17.3107 | 2023-10-14T18:40:13.205Z |\n| NYSE      | QOVGA  |   1.9199 | 2023-10-14T18:40:14.590Z |\n| NASDAQ    | CQ     | 174.0586 | 2023-10-14T18:39:55.858Z |\n| OTHER_OTC | CZYBQ  |   0.8543 | 2023-10-14T18:40:40.513Z |\n| NASDAQ    | SWTD   |  22.5552 | 2023-10-14T18:39:50.783Z |\n| NASDAQ    | LVEBB  |   8.4378 | 2023-10-14T18:39:58.491Z |\n| OTHER_OTC | NNFO   |    0.151 | 2023-10-14T18:39:51.236Z |\n| NASDAQ    | WP     |  45.7338 | 2023-10-14T18:40:24.264Z |\n| NASDAQ    | RQNMU  |  19.6168 | 2023-10-14T18:40:32.335Z |\n| OTHER_OTC | WAEQK  |   0.6713 | 2023-10-14T18:40:32.998Z |\n|----------------------------------------------------------|\n```\n\u003ca name=\"if\"\u003e\u003c/a\u003e\n### if (Control Flow \u0026#8212; Procedural) \n*Description*: If the `expression` is true, then `outcomeA` otherwise `outcomeB`\n\n```sql\nvalue = 123\nif(value \u003e 99) \"Yes!\" else \"No.\"\n```\n##### Results\n```sql\nYes!\n```\n\u003ca name=\"iff\"\u003e\u003c/a\u003e\n### iff (Control Flow \u0026#8212; Functional) \n*Description*: If the `condition` is true, then `trueValue` otherwise `falseValue`\n\n```sql\nvalue = 123\niff(value \u003e 99, 'Yes!', 'No.')\n```\n##### Results\n```sql\nYes!\n```\n\u003ca name=\"macro\"\u003e\u003c/a\u003e\n### macro (Control Flow \u0026#8212; Declarative) \n*Description*: Creates a user-defined instruction\n\n```sql\nmacro \"drawCircle ( %e:size ) @ ( %e:x , %e:y )\" := {\n  \"Circle({{size}}) \u003c- ({{x * 2}}, {{y / 2}})\"\n}\n\nstdout \u003c=== drawCircle(100)@(80, 650)\n```\n##### Results\n```sql\nCircle(100) \u003c- (160, 325)\n```\n\u003ca name=\"return\"\u003e\u003c/a\u003e\n### return (Control Flow \u0026#8212; Procedural) \n*Description*: Returns a result set (from a daughter scope)\n\n```sql\nreturn 'Hello World'\n```\n##### Results\n```sql\nHello World\n```\n\u003ca name=\"throw\"\u003e\u003c/a\u003e\n### throw (Control Flow \u0026#8212; Procedural) \n*Description*: Throws a JVM exception\n\n```sql\ntry\n  throw new `java.lang.RuntimeException`('A processing error occurred')\ncatch e =\u003e stdout \u003c=== e.getMessage()\n```\n##### Results\n```sql\njava.io.PrintStream@23ea8830\n```\n##### Console Output\n```\nA processing error occurred on line 2 at 3\n```\n\u003ca name=\"try\"\u003e\u003c/a\u003e\n### try¹ (Control Flow \u0026#8212; Functional) \n*Description*: Attempts an operation and catches any exceptions that occur preventing them from stopping program execution\n\n```sql\ndef connect() := throw new `java.lang.RuntimeException`(\"Connection error\")\ntry connect() catch e =\u003e stderr \u003c=== e.getMessage()\n```\n##### Results\n```sql\njava.io.PrintStream@5bb2fb2b\n```\n##### Console Error\n```\nConnection error on line 1 at 17 on line 2 at 5\n```\n### try² (Control Flow \u0026#8212; Functional) \n*Description*: Attempts an operation and catches any exceptions that occur preventing them from stopping program execution\n\n```sql\nvar n = 0\ntry n /= 0 catch e =\u003e stderr \u003c=== e.getMessage() finally n = -1\nthis\n```\n##### Results\n```sql\n|-------------------------------------------------------------------------------------------------------------|\n| name       | kind                | value                                                                    |\n|-------------------------------------------------------------------------------------------------------------|\n| WebSockets | WebSockets$         | lollypop.io.WebSockets$@63485d7                                          |\n| n          | Integer             | -1                                                                       |\n| stdout     | PrintStream         | java.io.PrintStream@23ea8830                                             |\n| stdin      | BufferedReader      | java.io.BufferedReader@790ac3e0                                          |\n| stderr     | PrintStream         | java.io.PrintStream@5bb2fb2b                                             |\n| OS         | OS                  | lollypop.lang.OS                                                         |\n| π          | Double              | 3.141592653589793                                                        |\n| Nodes      | Nodes               | lollypop.io.Nodes@2cee5365                                               |\n| e          | DivisionByZeroError | com.lollypop.runtime.errors.DivisionByZeroError: Division by zero: n / 0 |\n| Random     | Random$             | lollypop.lang.Random                                                     |\n|-------------------------------------------------------------------------------------------------------------|\n```\n##### Console Error\n```\nDivision by zero: n / 0\n```\n\u003ca name=\"while\"\u003e\u003c/a\u003e\n### while (Control Flow \u0026#8212; Procedural) \n*Description*: Repeats the `command` while the `expression` is true\n\n```sql\nvar x = 0\nvar y = 1\nwhile x \u003c 5 do { x += 1; y *= x }\ny\n```\n##### Results\n```sql\n120\n```\n\u003ca name=\"with\"\u003e\u003c/a\u003e\n### with (Control Flow \u0026#8212; Functional) \n*Description*: Provides a closure over a resource; closing it upon completion.\n\n```sql\nnamespace \"temp.examples\"\ndrop if exists `Stocks`\ncreate table `Stocks` (\n    symbol: String(8),\n    exchange: Enum (AMEX, NASDAQ, NYSE, OTCBB, OTHEROTC),\n    lastSale: Double\n) containing (\n    |------------------------------|\n    | symbol | exchange | lastSale |\n    |------------------------------|\n    | AAXX   | NYSE     |    56.12 |\n    | UPEX   | NYSE     |   116.24 |\n    | XYZ    | AMEX     |    31.95 |\n    | JUNK   | AMEX     |    97.61 |\n    | ABC    | OTCBB    |    5.887 |\n    |------------------------------|\n)\n\nwith ns(\"Stocks\") { stocks =\u003e @stocks where lastSale \u003c 50 }\n```\n##### Results\n```sql\n|------------------------------|\n| symbol | exchange | lastSale |\n|------------------------------|\n| XYZ    | AMEX     |    31.95 |\n| ABC    | OTCBB    |    5.887 |\n|------------------------------|\n```\n\u003ca name=\"Dataframe_I_O\"\u003e\u003c/a\u003e\n## Dataframe I/O Examples\n\u003chr\u003e\n\n\u003ca name=\"_\"\u003e\u003c/a\u003e\n### # (Dataframe I/O \u0026#8212; Declarative) \n*Description*: Returns a column slice of a data frame\n\n```sql\ndeclare table stocks(symbol: String(4), exchange: String(6), lastSale: Double, lastSaleTime: DateTime)\ncontaining (\n|---------------------------------------------------------|\n| symbol | exchange | lastSale | lastSaleTime             |\n|---------------------------------------------------------|\n| NQOO   | AMEX     | 190.1432 | 2023-08-10T01:44:20.075Z |\n| LVMM   | NASDAQ   | 164.2654 | 2023-08-10T01:44:20.092Z |\n| VQLJ   | AMEX     |  160.753 | 2023-08-10T01:44:20.093Z |\n| LRBJ   | OTCBB    |  64.0764 | 2023-08-10T01:44:20.095Z |\n| QFHM   | AMEX     | 148.6447 | 2023-08-10T01:44:20.096Z |\n|---------------------------------------------------------|\n)\nstocks#[symbol, lastSale]\n```\n##### Results\n```sql\n|-------------------|\n| symbol | lastSale |\n|-------------------|\n| NQOO   | 190.1432 |\n| LVMM   | 164.2654 |\n| VQLJ   |  160.753 |\n| LRBJ   |  64.0764 |\n| QFHM   | 148.6447 |\n|-------------------|\n```\n\u003ca name=\"delete\"\u003e\u003c/a\u003e\n### delete (Dataframe I/O \u0026#8212; Declarative) \n*Description*: Deletes rows matching an expression from a table\n\n```sql\nval stocks =\n|------------------------------|\n| symbol | exchange | lastSale |\n|------------------------------|\n| OWWO   | NYSE     | 483.0286 |\n| SJJR   | OTCBB    |  56.7381 |\n| EGXY   | OTCBB    | 309.8648 |\n| NXSQ   | OTCBB    | 254.2278 |\n| LQRQ   | AMEX     |    88.42 |\n|------------------------------|\ndelete from @stocks where symbol is \"EGXY\"\nstocks\n```\n##### Results\n```sql\n|------------------------------|\n| symbol | exchange | lastSale |\n|------------------------------|\n| OWWO   | NYSE     | 483.0286 |\n| SJJR   | OTCBB    |  56.7381 |\n| NXSQ   | OTCBB    | 254.2278 |\n| LQRQ   | AMEX     |    88.42 |\n|------------------------------|\n```\n\u003ca name=\"describe\"\u003e\u003c/a\u003e\n### describe (Dataframe I/O \u0026#8212; Declarative) \n*Description*: Returns a table representing the layout of the query expression\n\n```sql\ndescribe (select v1: 123, v2: 'abc')\n```\n##### Results\n```sql\n|------------------------------------------------------------|\n| name | type      | description | defaultValue | isNullable |\n|------------------------------------------------------------|\n| v1   | Int       |             |              |            |\n| v2   | String(3) |             |              |            |\n|------------------------------------------------------------|\n```\n\u003ca name=\"from\"\u003e\u003c/a\u003e\n### from (Dataframe I/O \u0026#8212; Declarative) \n*Description*: Retrieves rows from a datasource\n\n```sql\nfrom [{ item: \"Apple\" }, { item: \"Orange\" }, { item: \"Cherry\" }]\n```\n##### Results\n```sql\n|--------|\n| item   |\n|--------|\n| Apple  |\n| Orange |\n| Cherry |\n|--------|\n```\n\u003ca name=\"graph\"\u003e\u003c/a\u003e\n### graph¹ (Dataframe I/O \u0026#8212; Declarative) \n*Description*: Produces graphical charts from dataframes\n\n```sql\ngraph { shape: \"pie3d\", title: \"Exchange Exposure\" } from (\n  |------------------|\n  | exchange | total |\n  |------------------|\n  | NASDAQ   |    24 |\n  | AMEX     |     5 |\n  | NYSE     |    28 |\n  | OTCBB    |    32 |\n  | OTHEROTC |     7 |\n  |------------------|\n)\n```\n##### Results\n\u003cdiv style=\"width: 100%\"\u003e\n\u003cimg src=\"./docs/images/Exchange_Exposure.png\"\u003e\n\u003c/div\u003e\n\n### graph² (Dataframe I/O \u0026#8212; Declarative) \n*Description*: Produces graphical charts from queries\n\n```sql\nchart = { shape: \"pie\", title: \"Member Types of OS\" }\ngraph chart from (\n  select memberType, total: count(*) from (membersOf(OS))\n  group by memberType\n)\n```\n##### Results\n\u003cdiv style=\"width: 100%\"\u003e\n\u003cimg src=\"./docs/images/Member_Types_of_OS.png\"\u003e\n\u003c/div\u003e\n\n### graph³ (Dataframe I/O \u0026#8212; Declarative) \n*Description*: Produces graphical charts declaratively or procedurally\n\n```sql\nchart = { shape: \"scatter\", title: \"Scatter Demo\" }\nsamples = {\n  import \"java.lang.Math\"\n  def series(x) := \"Series {{ (x % 2) + 1 }}\"\n  select w, x, y from ([0 to 500]\n    .map(x =\u003e select w: series(x), x, y: x * iff((x % 2) is 0, Math.cos(x), Math.sin(x)))\n    .toTable())\n}\ngraph chart from samples\n```\n##### Results\n\u003cdiv style=\"width: 100%\"\u003e\n\u003cimg src=\"./docs/images/Scatter_Demo.png\"\u003e\n\u003c/div\u003e\n\n\u003ca name=\"insert\"\u003e\u003c/a\u003e\n### insert¹ (Dataframe I/O \u0026#8212; Declarative) \n*Description*: Appends new row(s) to a table\n\n```sql\nstagedActors =\n|------------------------------------------|\n| name              | popularity | ratio   |\n|------------------------------------------|\n| John Wayne        | 42         |  0.4206 |\n| Carry Grant       | 87         |  0.8712 |\n| Doris Day         | 89         |  0.8907 |\n| Audrey Hepburn    | 97         |  0.9732 |\n| Gretta Garbeaux   | 57         |  0.5679 |\n|------------------------------------------|\n\ndeclare table Actors (name: String(64), popularity: Int)\ninsert into Actors (name, popularity) select name, popularity from @stagedActors\n\ngraph { shape: \"bar\", title: \"Popularity\" } from Actors\n```\n##### Results\n\u003cdiv style=\"width: 100%\"\u003e\n\u003cimg src=\"./docs/images/Popularity.png\"\u003e\n\u003c/div\u003e\n\n### insert² (Dataframe I/O \u0026#8212; Declarative) \n*Description*: Appends new row(s) to a table\n\n```sql\ndeclare table Stocks(symbol: String(8), exchange: String(8), transactions: Table(price: Double, transactionTime: DateTime))\ninsert into Stocks (symbol, exchange, transactions)\nvalues ('AAPL', 'NASDAQ', {\"price\":156.39, \"transactionTime\":\"2021-08-05T19:23:11.000Z\"}),\n       ('AMD', 'NASDAQ',  {\"price\":56.87, \"transactionTime\":\"2021-08-05T19:23:11.000Z\"}),\n       ('INTC','NYSE',    {\"price\":89.44, \"transactionTime\":\"2021-08-05T19:23:11.000Z\"}),\n       ('AMZN', 'NASDAQ', {\"price\":988.12, \"transactionTime\":\"2021-08-05T19:23:11.000Z\"}),\n       ('SHMN', 'OTCBB', [{\"price\":0.0010, \"transactionTime\":\"2021-08-05T19:23:11.000Z\"},\n                          {\"price\":0.0011, \"transactionTime\":\"2021-08-05T19:23:12.000Z\"}])\n\ninsert into Stocks#transactions (price, transactionTime)\nvalues (35.11, \"2021-08-05T19:23:12.000Z\"),\n       (35.83, \"2021-08-05T19:23:15.000Z\"),\n       (36.03, \"2021-08-05T19:23:17.000Z\")\nwhere symbol is 'AMD'\n```\n##### Results\n```sql\n|---------------------------------------------------------------------------------------------------------|\n| altered | created | destroyed | deleted | inserted | matched | scanned | shuffled | updated | rowIDs    |\n|---------------------------------------------------------------------------------------------------------|\n|       0 |       0 |         0 |       0 |        3 |       1 |       5 |        0 |       0 | [6, 7, 8] |\n|---------------------------------------------------------------------------------------------------------|\n```\n\u003ca name=\"intersect\"\u003e\u003c/a\u003e\n### intersect (Dataframe I/O \u0026#8212; Declarative) \n*Description*: Computes the intersection of two queries\n\n```sql\nfrom (\n    |------------------------------|\n    | symbol | exchange | lastSale |\n    |------------------------------|\n    | AAXX   | NYSE     |    56.12 |\n    | UPEX   | NYSE     |   116.24 |\n    | XYZ    | AMEX     |    31.95 |\n    | ABC    | OTCBB    |    5.887 |\n    |------------------------------|\n) intersect (\n    |------------------------------|\n    | symbol | exchange | lastSale |\n    |------------------------------|\n    | JUNK   | AMEX     |    97.61 |\n    | AAXX   | NYSE     |    56.12 |\n    | ABC    | OTCBB    |    5.887 |\n    |------------------------------|\n)\n```\n##### Results\n```sql\n|------------------------------|\n| symbol | exchange | lastSale |\n|------------------------------|\n| AAXX   | NYSE     |    56.12 |\n| ABC    | OTCBB    |    5.887 |\n|------------------------------|\n```\n\u003ca name=\"into\"\u003e\u003c/a\u003e\n### into (Dataframe I/O \u0026#8212; Declarative) \n*Description*: Inserts a result set into a table\n\n```sql\npennyStocks = Table(symbol: String(10), exchange: String(10), lastSale: Double, lastSaleTime: DateTime)\nfrom (\n|----------------------------------------------------------|\n| exchange  | symbol | lastSale | lastSaleTime             |\n|----------------------------------------------------------|\n| OTHER_OTC | YVWY   |   0.5407 | 2023-09-21T04:47:37.370Z |\n| OTHER_OTC | EPOFJ  |   0.8329 | 2023-09-21T04:47:27.720Z |\n| OTHER_OTC | QEQA   |   0.7419 | 2023-09-21T04:48:07.901Z |\n| OTHER_OTC | SFWCS  |   0.9577 | 2023-09-21T04:47:54.694Z |\n| OTHER_OTC | VBJHF  |   0.8121 | 2023-09-21T04:47:56.769Z |\n| OTHER_OTC | SDLMF  |   0.2186 | 2023-09-21T04:48:18.913Z |\n| OTHER_OTC | JXDZ   |   0.0157 | 2023-09-21T04:48:08.459Z |\n| OTCBB     | ZMNF   |   0.5647 | 2023-09-21T04:47:23.112Z |\n| OTCBB     | VVAH   |   0.5786 | 2023-09-21T04:47:40.420Z |\n| OTCBB     | HSCKG  |   0.2719 | 2023-09-21T04:47:43.268Z |\n| OTCBB     | SHDF   |   0.0161 | 2023-09-21T04:57:07.529Z |\n| OTCBB     | QJGVO  |   0.0026 | 2023-09-21T04:57:39.230Z |\n| OTHER_OTC | PMBFY  |   0.0139 | 2023-09-21T04:57:46.146Z |\n| OTCBB     | CAVY   |   0.0047 | 2023-09-21T04:57:43.503Z |\n|----------------------------------------------------------|\n) where lastSale \u003c= 0.02 into @pennyStocks\n```\n##### Results\n```sql\n|----------------------------------------------------------|\n| symbol | exchange  | lastSale | lastSaleTime             |\n|----------------------------------------------------------|\n| JXDZ   | OTHER_OTC |   0.0157 | 2023-09-21T04:48:08.459Z |\n| SHDF   | OTCBB     |   0.0161 | 2023-09-21T04:57:07.529Z |\n| QJGVO  | OTCBB     |   0.0026 | 2023-09-21T04:57:39.230Z |\n| PMBFY  | OTHER_OTC |   0.0139 | 2023-09-21T04:57:46.146Z |\n| CAVY   | OTCBB     |   0.0047 | 2023-09-21T04:57:43.503Z |\n|----------------------------------------------------------|\n```\n\u003ca name=\"pagination\"\u003e\u003c/a\u003e\n### pagination¹ (Dataframe I/O \u0026#8212; Declarative) \n*Description*: Setups a pagination query\n\n```sql\nstocks =\n|----------------------------------------------------------|\n| exchange  | symbol | lastSale | lastSaleTime             |\n|----------------------------------------------------------|\n| OTCBB     | RPYM   |   0.4932 | 2023-10-02T01:57:31.086Z |\n| OTCBB     | EGBQ   |   0.6747 | 2023-10-02T01:57:09.991Z |\n| OTHER_OTC | PEMCQ  |   0.6176 | 2023-10-02T01:57:23.684Z |\n| NASDAQ    | IPHBY  | 113.9129 | 2023-10-02T01:57:01.837Z |\n| NASDAQ    | HLOQW  | 159.1307 | 2023-10-02T01:57:50.139Z |\n| NYSE      | WQN    | 177.4067 | 2023-10-02T01:57:17.371Z |\n| NASDAQ    | JONV   | 139.6465 | 2023-10-02T01:57:55.758Z |\n| NASDAQ    | KKLPE  | 135.2768 | 2023-10-02T01:57:07.520Z |\n| AMEX      | KHGRO  | 163.3631 | 2023-10-02T01:57:21.286Z |\n| NASDAQ    | GSCF   |  75.8721 | 2023-10-02T01:57:21.640Z |\n| NASDAQ    | ZEP    |   91.009 | 2023-10-02T01:57:03.740Z |\n| OTHER_OTC | KMUEH  |   0.2605 | 2023-10-02T01:57:03.702Z |\n| OTCBB     | WLXIM  |   0.6886 | 2023-10-02T01:57:45.739Z |\n| NASDAQ    | OVTS   | 153.5991 | 2023-10-02T01:57:23.061Z |\n| OTCBB     | YGIVQ  |   0.8364 | 2023-10-02T01:57:38.882Z |\n|----------------------------------------------------------|\nstocksP = pagination(select * from stocks)\nstocksP.first(5)\n```\n##### Results\n```sql\n|----------------------------------------------------------|\n| exchange  | symbol | lastSale | lastSaleTime             |\n|----------------------------------------------------------|\n| OTCBB     | RPYM   |   0.4932 | 2023-10-02T01:57:31.086Z |\n| OTCBB     | EGBQ   |   0.6747 | 2023-10-02T01:57:09.991Z |\n| OTHER_OTC | PEMCQ  |   0.6176 | 2023-10-02T01:57:23.684Z |\n| NASDAQ    | IPHBY  | 113.9129 | 2023-10-02T01:57:01.837Z |\n| NASDAQ    | HLOQW  | 159.1307 | 2023-10-02T01:57:50.139Z |\n|----------------------------------------------------------|\n```\n### pagination² (Dataframe I/O \u0026#8212; Declarative) \n*Description*: Setups a pagination query\n\n```sql\nstocks =\n|----------------------------------------------------------|\n| exchange  | symbol | lastSale | lastSaleTime             |\n|----------------------------------------------------------|\n| OTCBB     | RPYM   |   0.4932 | 2023-10-02T01:57:31.086Z |\n| OTCBB     | EGBQ   |   0.6747 | 2023-10-02T01:57:09.991Z |\n| OTHER_OTC | PEMCQ  |   0.6176 | 2023-10-02T01:57:23.684Z |\n| NASDAQ    | IPHBY  | 113.9129 | 2023-10-02T01:57:01.837Z |\n| NASDAQ    | HLOQW  | 159.1307 | 2023-10-02T01:57:50.139Z |\n| NYSE      | WQN    | 177.4067 | 2023-10-02T01:57:17.371Z |\n| NASDAQ    | JONV   | 139.6465 | 2023-10-02T01:57:55.758Z |\n| NASDAQ    | KKLPE  | 135.2768 | 2023-10-02T01:57:07.520Z |\n| AMEX      | KHGRO  | 163.3631 | 2023-10-02T01:57:21.286Z |\n| NASDAQ    | GSCF   |  75.8721 | 2023-10-02T01:57:21.640Z |\n| NASDAQ    | ZEP    |   91.009 | 2023-10-02T01:57:03.740Z |\n| OTHER_OTC | KMUEH  |   0.2605 | 2023-10-02T01:57:03.702Z |\n| OTCBB     | WLXIM  |   0.6886 | 2023-10-02T01:57:45.739Z |\n| NASDAQ    | OVTS   | 153.5991 | 2023-10-02T01:57:23.061Z |\n| OTCBB     | YGIVQ  |   0.8364 | 2023-10-02T01:57:38.882Z |\n|----------------------------------------------------------|\nstocksP = pagination(select * from stocks)\nstocksP.last(5)\n```\n##### Results\n```sql\n|----------------------------------------------------------|\n| exchange  | symbol | lastSale | lastSaleTime             |\n|----------------------------------------------------------|\n| NASDAQ    | ZEP    |   91.009 | 2023-10-02T01:57:03.740Z |\n| OTHER_OTC | KMUEH  |   0.2605 | 2023-10-02T01:57:03.702Z |\n| OTCBB     | WLXIM  |   0.6886 | 2023-10-02T01:57:45.739Z |\n| NASDAQ    | OVTS   | 153.5991 | 2023-10-02T01:57:23.061Z |\n| OTCBB     | YGIVQ  |   0.8364 | 2023-10-02T01:57:38.882Z |\n|----------------------------------------------------------|\n```\n### pagination³ (Dataframe I/O \u0026#8212; Declarative) \n*Description*: Setups a pagination query\n\n```sql\nstocks =\n|----------------------------------------------------------|\n| exchange  | symbol | lastSale | lastSaleTime             |\n|----------------------------------------------------------|\n| OTCBB     | RPYM   |   0.4932 | 2023-10-02T01:57:31.086Z |\n| OTCBB     | EGBQ   |   0.6747 | 2023-10-02T01:57:09.991Z |\n| OTHER_OTC | PEMCQ  |   0.6176 | 2023-10-02T01:57:23.684Z |\n| NASDAQ    | IPHBY  | 113.9129 | 2023-10-02T01:57:01.837Z |\n| NASDAQ    | HLOQW  | 159.1307 | 2023-10-02T01:57:50.139Z |\n| NYSE      | WQN    | 177.4067 | 2023-10-02T01:57:17.371Z |\n| NASDAQ    | JONV   | 139.6465 | 2023-10-02T01:57:55.758Z |\n| NASDAQ    | KKLPE  | 135.2768 | 2023-10-02T01:57:07.520Z |\n| AMEX      | KHGRO  | 163.3631 | 2023-10-02T01:57:21.286Z |\n| NASDAQ    | GSCF   |  75.8721 | 2023-10-02T01:57:21.640Z |\n| NASDAQ    | ZEP    |   91.009 | 2023-10-02T01:57:03.740Z |\n| OTHER_OTC | KMUEH  |   0.2605 | 2023-10-02T01:57:03.702Z |\n| OTCBB     | WLXIM  |   0.6886 | 2023-10-02T01:57:45.739Z |\n| NASDAQ    | OVTS   | 153.5991 | 2023-10-02T01:57:23.061Z |\n| OTCBB     | YGIVQ  |   0.8364 | 2023-10-02T01:57:38.882Z |\n|----------------------------------------------------------|\nstocksP = pagination(select * from stocks)\nstocksP.first(5)\nstocksP.next(5)\n```\n##### Results\n```sql\n|---------------------------------------------------------|\n| exchange | symbol | lastSale | lastSaleTime             |\n|---------------------------------------------------------|\n| NYSE     | WQN    | 177.4067 | 2023-10-02T01:57:17.371Z |\n| NASDAQ   | JONV   | 139.6465 | 2023-10-02T01:57:55.758Z |\n| NASDAQ   | KKLPE  | 135.2768 | 2023-10-02T01:57:07.520Z |\n| AMEX     | KHGRO  | 163.3631 | 2023-10-02T01:57:21.286Z |\n| NASDAQ   | GSCF   |  75.8721 | 2023-10-02T01:57:21.640Z |\n|---------------------------------------------------------|\n```\n\u003ca name=\"select\"\u003e\u003c/a\u003e\n### select (Dataframe I/O \u0026#8212; Declarative) \n*Description*: Returns row(s) of data based on the expression and options\n\n```sql\nselect symbol: 'GMTQ', exchange: 'OTCBB', lastSale: 0.1111, lastSaleTime: DateTime()\n```\n##### Results\n```sql\n|---------------------------------------------------------|\n| symbol | exchange | lastSale | lastSaleTime             |\n|---------------------------------------------------------|\n| GMTQ   | OTCBB    |   0.1111 | 2025-10-30T02:15:03.165Z |\n|---------------------------------------------------------|\n```\n\u003ca name=\"subtract\"\u003e\u003c/a\u003e\n### subtract (Dataframe I/O \u0026#8212; Declarative) \n*Description*: Computes the subtraction of two queries\n\n```sql\nfrom (\n    |------------------------------|\n    | symbol | exchange | lastSale |\n    |------------------------------|\n    | AAXX   | NYSE     |    56.12 |\n    | UPEX   | NYSE     |   116.24 |\n    | JUNK   | AMEX     |    97.61 |\n    | XYZ    | AMEX     |    31.95 |\n    |------------------------------|\n) subtract (\n    |------------------------------|\n    | symbol | exchange | lastSale |\n    |------------------------------|\n    | JUNK   | AMEX     |    97.61 |\n    | ABC    | OTCBB    |    5.887 |\n    | XYZ    | AMEX     |    31.95 |\n    |------------------------------|\n)\n```\n##### Results\n```sql\n|------------------------------|\n| symbol | exchange | lastSale |\n|------------------------------|\n| AAXX   | NYSE     |    56.12 |\n| UPEX   | NYSE     |   116.24 |\n|------------------------------|\n```\n\u003ca name=\"undelete\"\u003e\u003c/a\u003e\n### undelete (Dataframe I/O \u0026#8212; Declarative) \n*Description*: Restores rows matching an expression from a table\n\n```sql\nval stocks =\n |---------------------------------------------------------|\n | symbol | exchange | lastSale | lastSaleTime             |\n |---------------------------------------------------------|\n | CMHA   | NASDAQ   | 121.4325 | 2023-08-05T22:45:29.370Z |\n | JPJI   | NYSE     | 185.8192 | 2023-08-05T22:45:29.371Z |\n | QCYA   | AMEX     | 152.0165 | 2023-08-05T22:45:29.372Z |\n | TGRV   | NYSE     |   80.225 | 2023-08-05T22:45:29.373Z |\n | XHMQ   | NASDAQ   |   98.445 | 2023-08-05T22:45:29.374Z |\n |---------------------------------------------------------|\ndelete from @stocks where symbol is \"CMHA\"\nundelete from @stocks where symbol is \"CMHA\"\n```\n##### Results\n```sql\n|------------------------------------------------------------------------------------------------------|\n| altered | created | destroyed | deleted | inserted | matched | scanned | shuffled | updated | rowIDs |\n|------------------------------------------------------------------------------------------------------|\n|       0 |       0 |         0 |       0 |        0 |       1 |       1 |        0 |       1 | []     |\n|------------------------------------------------------------------------------------------------------|\n```\n\u003ca name=\"union\"\u003e\u003c/a\u003e\n### union (Dataframe I/O \u0026#8212; Declarative) \n*Description*: Combines two (or more) result sets (vertically)\n\n```sql\nfrom (\n  |------------------------------|\n  | symbol | exchange | lastSale |\n  |------------------------------|\n  | AAXX   | NYSE     |    56.12 |\n  | UPEX   | NYSE     |   116.24 |\n  | XYZ    | AMEX     |    31.95 |\n  |------------------------------|\n) union (\n  |------------------------------|\n  | symbol | exchange | lastSale |\n  |------------------------------|\n  | JUNK   | AMEX     |    97.61 |\n  | ABC    | OTC BB   |    5.887 |\n  |------------------------------|\n)\n```\n##### Results\n```sql\n|------------------------------|\n| symbol | exchange | lastSale |\n|------------------------------|\n| AAXX   | NYSE     |    56.12 |\n| UPEX   | NYSE     |   116.24 |\n| XYZ    | AMEX     |    31.95 |\n| JUNK   | AMEX     |    97.61 |\n| ABC    | OTC BB   |    5.887 |\n|------------------------------|\n```\n\u003ca name=\"union_distinct\"\u003e\u003c/a\u003e\n### union distinct (Dataframe I/O \u0026#8212; Declarative) \n*Description*: Combines two (or more) result sets (vertically) retaining only distinct rows\n\n```sql\nfrom (\n    |------------------------------|\n    | symbol | exchange | lastSale |\n    |------------------------------|\n    | AAXX   | NYSE     |    56.12 |\n    | UPEX   | NYSE     |   116.24 |\n    | XYZ    | AMEX     |    31.95 |\n    | ABC    | OTCBB    |    5.887 |\n    |------------------------------|\n) union distinct (\n    |------------------------------|\n    | symbol | exchange | lastSale |\n    |------------------------------|\n    | JUNK   | AMEX     |    97.61 |\n    | AAXX   | NYSE     |    56.12 |\n    | ABC    | OTCBB    |    5.887 |\n    |------------------------------|\n)\n```\n##### Results\n```sql\n|------------------------------|\n| symbol | exchange | lastSale |\n|------------------------------|\n| AAXX   | NYSE     |    56.12 |\n| UPEX   | NYSE     |   116.24 |\n| XYZ    | AMEX     |    31.95 |\n| ABC    | OTCBB    |    5.887 |\n| JUNK   | AMEX     |    97.61 |\n|------------------------------|\n```\n\u003ca name=\"update\"\u003e\u003c/a\u003e\n### update¹ (Dataframe I/O \u0026#8212; Declarative) \n*Description*: Modifies rows matching a conditional expression from a table\n\n```sql\nval stocks =\n |---------------------------------------------------------|\n | symbol | exchange | lastSale | lastSaleTime             |\n |---------------------------------------------------------|\n | ISIT   | NASDAQ   | 189.3509 | 2023-08-05T22:34:20.263Z |\n | OBEA   | NASDAQ   |  99.1026 | 2023-08-05T22:34:20.279Z |\n | IJYY   | AMEX     | 190.4665 | 2023-08-05T22:34:20.280Z |\n | SMPG   | NYSE     | 184.6356 | 2023-08-05T22:34:20.282Z |\n | UKHT   | NASDAQ   |  71.1514 | 2023-08-05T22:34:20.283Z |\n |---------------------------------------------------------|\nupdate @stocks set lastSaleTime = DateTime() where exchange is \"NASDAQ\"\nstocks\n```\n##### Results\n```sql\n|---------------------------------------------------------|\n| symbol | exchange | lastSale | lastSaleTime             |\n|---------------------------------------------------------|\n| ISIT   | NASDAQ   | 189.3509 | 2025-10-30T02:15:03.196Z |\n| OBEA   | NASDAQ   |  99.1026 | 2025-10-30T02:15:03.197Z |\n| IJYY   | AMEX     | 190.4665 | 2023-08-05T22:34:20.280Z |\n| SMPG   | NYSE     | 184.6356 | 2023-08-05T22:34:20.282Z |\n| UKHT   | NASDAQ   |  71.1514 | 2025-10-30T02:15:03.197Z |\n|---------------------------------------------------------|\n```\n### update² (Dataframe I/O \u0026#8212; Declarative) \n*Description*: Modifies rows matching a conditional expression from a table\n\n```sql\ndeclare table stocks (symbol: String(8), exchange: String(8), transactions: Table (price: Double, transactionTime: DateTime)[5])\ninsert into @stocks (symbol, exchange, transactions)\nvalues ('AAPL', 'NASDAQ', {\"price\":156.39, \"transactionTime\":\"2021-08-05T19:23:11.000Z\"}),\n       ('AMD', 'NASDAQ',  {\"price\":56.87, \"transactionTime\":\"2021-08-05T19:23:11.000Z\"}),\n       ('INTC','NYSE',    {\"price\":89.44, \"transactionTime\":\"2021-08-05T19:23:11.000Z\"}),\n       ('AMZN', 'NASDAQ', {\"price\":988.12, \"transactionTime\":\"2021-08-05T19:23:11.000Z\"}),\n       ('SHMN', 'OTCBB', [{\"price\":0.0010, \"transactionTime\":\"2021-08-05T19:23:11.000Z\"},\n                          {\"price\":0.0011, \"transactionTime\":\"2021-08-05T19:23:12.000Z\"}])\n\nupdate @stocks#transactions\nset price = 0.0012\nwhere symbol is 'SHMN'\nand transactions wherein (price is 0.001)\nlimit 1\nstocks\n```\n##### Results\n```sql\n|-----------------------------------------------------------------------------|\n| symbol | exchange | transactions                                            |\n|-----------------------------------------------------------------------------|\n| AAPL   | NASDAQ   | EmbeddedInnerTableRowCollection(price, transactionTime) |\n| AMD    | NASDAQ   | EmbeddedInnerTableRowCollection(price, transactionTime) |\n| INTC   | NYSE     | EmbeddedInnerTableRowCollection(price, transactionTime) |\n| AMZN   | NASDAQ   | EmbeddedInnerTableRowCollection(price, transactionTime) |\n| SHMN   | OTCBB    | EmbeddedInnerTableRowCollection(price, transactionTime) |\n|-----------------------------------------------------------------------------|\n```\n\u003ca name=\"upsert\"\u003e\u003c/a\u003e\n### upsert¹ (Dataframe I/O \u0026#8212; Declarative) \u003cimg src=\"./docs/images/flask.svg\" width=\"24\" height=\"24\"\u003e\n*Description*: Inserts (or updates) new row(s) into a table\n\n```sql\nnamespace \"temp.examples\"\ndrop if exists Stocks \u0026\u0026\ncreate table Stocks (symbol: String(8), exchange: String(8), lastSale: Double) \u0026\u0026\ncreate index Stocks#symbol \u0026\u0026\ninsert into Stocks (symbol, exchange, lastSale)\n  |------------------------------|\n  | symbol | exchange | lastSale |\n  |------------------------------|\n  | ATT    | NYSE     |    66.78 |\n  | UPEX   | NASDAQ   |   116.24 |\n  | XYZ    | AMEX     |    31.95 |\n  | ABC    | OTCBB    |    5.887 |\n  |------------------------------|\nupsert into Stocks (symbol, exchange, lastSale) values ('AAPL', 'NASDAQ', 156.39) where symbol is 'AAPL'\nns('Stocks')\n```\n##### Results\n```sql\n|------------------------------|\n| symbol | exchange | lastSale |\n|------------------------------|\n| ATT    | NYSE     |    66.78 |\n| UPEX   | NASDAQ   |   116.24 |\n| XYZ    | AMEX     |    31.95 |\n| ABC    | OTCBB    |    5.887 |\n| AAPL   | NASDAQ   |   156.39 |\n|------------------------------|\n```\n### upsert² (Dataframe I/O \u0026#8212; Declarative) \u003cimg src=\"./docs/images/flask.svg\" width=\"24\" height=\"24\"\u003e\n*Description*: Inserts (or updates) new row(s) into a table\n\n```sql\nnamespace \"temp.examples\"\ndrop if exists Stocks \u0026\u0026\ncreate table Stocks (symbol: String(8), exchange: String(8), lastSale: Double) \u0026\u0026\ncreate index Stocks#symbol \u0026\u0026\ninsert into Stocks (symbol, exchange, lastSale)\n  |------------------------------|\n  | symbol | exchange | lastSale |\n  |------------------------------|\n  | AAPL   | NASDAQ   |   156.12 |\n  | ATT    | NYSE     |    66.78 |\n  | UPEX   | NASDAQ   |   116.24 |\n  | XYZ    | AMEX     |    31.95 |\n  | ABC    | OTCBB    |    5.887 |\n  |------------------------------|\n\nupsert into Stocks (symbol, exchange, lastSale)\nvalues ('AAPL', 'NASDAQ', 156.39)\nwhere symbol is 'AAPL'\n\nns('Stocks')\n```\n##### Results\n```sql\n|------------------------------|\n| symbol | exchange | lastSale |\n|------------------------------|\n| AAPL   | NASDAQ   |   156.39 |\n| ATT    | NYSE     |    66.78 |\n| UPEX   | NASDAQ   |   116.24 |\n| XYZ    | AMEX     |    31.95 |\n| ABC    | OTCBB    |    5.887 |\n|------------------------------|\n```\n\u003ca name=\"Dataframe_Management\"\u003e\u003c/a\u003e\n## Dataframe Management Examples\n\u003chr\u003e\n\n\u003ca name=\"alter\"\u003e\u003c/a\u003e\n### alter (Dataframe Management \u0026#8212; Declarative) \n*Description*: Modifies the structure of a table\n\n```sql\nnamespace \"temp.examples\"\ndrop if exists StockQuotes\ncreate table StockQuotes(symbol: String(5), exchange: String(9), lastSale: Double) containing (\n|----------------------------------------------------------|\n| exchange  | symbol | lastSale | lastSaleTime             |\n|----------------------------------------------------------|\n| OTCBB     | YSZUY  |   0.2355 | 2023-10-19T23:25:32.886Z |\n| NASDAQ    | DMZH   | 183.1636 | 2023-10-19T23:26:03.509Z |\n| OTCBB     | VV     |          |                          |\n| NYSE      | TGPNF  |  51.6171 | 2023-10-19T23:25:32.166Z |\n| OTHER_OTC | RIZA   |   0.2766 | 2023-10-19T23:25:42.020Z |\n| NASDAQ    | JXMLB  |  91.6028 | 2023-10-19T23:26:08.951Z |\n|----------------------------------------------------------|\n)\nalter table StockQuotes\n  prepend column saleDate: DateTime = DateTime()\n  rename column symbol to ticker\n  label 'Stock quotes staging table'\nns('StockQuotes')\n```\n##### Results\n```sql\n|----------------------------------------------------------|\n| saleDate                 | ticker | exchange  | lastSale |\n|----------------------------------------------------------|\n| 2025-10-30T02:15:03.318Z | YSZUY  | OTCBB     |   0.2355 |\n| 2025-10-30T02:15:03.318Z | DMZH   | NASDAQ    | 183.1636 |\n| 2025-10-30T02:15:03.318Z | VV     | OTCBB     |          |\n| 2025-10-30T02:15:03.318Z | TGPNF  | NYSE      |  51.6171 |\n| 2025-10-30T02:15:03.318Z | RIZA   | OTHER_OTC |   0.2766 |\n| 2025-10-30T02:15:03.318Z | JXMLB  | NASDAQ    |  91.6028 |\n|----------------------------------------------------------|\n```\n\u003ca name=\"create_external_table\"\u003e\u003c/a\u003e\n### create external table (Dataframe Management \u0026#8212; Declarative) \n*Description*: Creates an external table\n\n```sql\ncreate external table if not exists customers (\n  customer_uid: UUID,\n  name: String,\n  address: String,\n  ingestion_date: Long\n) containing { format: 'json', location: './datasets/customers/json/', null_values: ['n/a'] }\n```\n##### Results\n```sql\n|------------------------------------------------------------------------------------------------------|\n| altered | created | destroyed | deleted | inserted | matched | scanned | shuffled | updated | rowIDs |\n|------------------------------------------------------------------------------------------------------|\n|       0 |       1 |         0 |       0 |        0 |       0 |       0 |        0 |       0 | []     |\n|------------------------------------------------------------------------------------------------------|\n```\n\u003ca name=\"create_index\"\u003e\u003c/a\u003e\n### create index (Dataframe Management \u0026#8212; Declarative) \n*Description*: Creates a table index\n\n```sql\ncreate index if not exists stocks#symbol\n```\n```scala\ncom.lollypop.LollypopException: assertion failed: Table configuration file for 'lollypop.public.stocks#symbol' (lollypop_db/ns/lollypop/public/stocks/stocks.json) was not found on line 1 at 0\n\tat com.lollypop.LollypopException$.apply(LollypopException.scala:11)\n\tat com.lollypop.language.models.InstructionErrors.die(InstructionErrors.scala:16)\n\tat com.lollypop.language.models.InstructionErrors.die$(InstructionErrors.scala:16)\n\tat com.lollypop.runtime.instructions.infrastructure.CreateIndex.die(CreateIndex.scala:16)\n\tat com.lollypop.runtime.LollypopVM$.liftedTree1$1(LollypopVM.scala:38)\n\tat com.lollypop.runtime.LollypopVM$.execute(LollypopVM.scala:33)\n\tat com.lollypop.runtime.LollypopVM$.executeSQL(LollypopVM.scala:66)\n\tat com.lollypop.docs.DocumentGeneratorFunSpec.$anonfun$invoke$6(DocumentGeneratorFunSpec.scala:70)\n\tat scala.util.Try$.apply(Try.scala:217)\n\tat com.lollypop.docs.DocumentGeneratorFunSpec.invoke(DocumentGeneratorFunSpec.scala:70)\n\tat com.lollypop.docs.ReadMeTest.$anonfun$processCategory$5(ReadMeTest.scala:97)\n\tat com.lollypop.docs.ReadMeTest.$anonfun$processCategory$5$adapted(ReadMeTest.scala:92)\n\tat scala.collection.immutable.List.foreach(List.scala:334)\n\tat com.lollypop.docs.ReadMeTest.$anonfun$processCategory$4(ReadMeTest.scala:92)\n\tat com.lollypop.docs.ReadMeTest.$anonfun$processCategory$4$adapted(ReadMeTest.scala:90)\n\tat scala.collection.immutable.List.foreach(List.scala:334)\n\tat com.lollypop.docs.ReadMeTest.processCategory(ReadMeTest.scala:90)\n\tat com.lollypop.docs.ReadMeTest.$anonfun$new$15(ReadMeTest.scala:72)\n\tat com.lollypop.docs.ReadMeTest.$anonfun$new$15$adapted(ReadMeTest.scala:71)\n\tat scala.collection.IterableOnceOps.foreach(IterableOnce.scala:619)\n\tat scala.collection.IterableOnceOps.foreach$(IterableOnce.scala:617)\n\tat scala.collection.AbstractIterable.foreach(Iterable.scala:935)\n\tat scala.collection.IterableOps$WithFilter.foreach(Iterable.scala:905)\n\tat com.lollypop.docs.ReadMeTest.$anonfun$new$5(ReadMeTest.scala:71)\n\tat com.lollypop.docs.ReadMeTest.$anonfun$new$5$adapted(ReadMeTest.scala:22)\n\tat com.lollypop.runtime.package$AutoClose$.use$extension(package.scala:126)\n\tat com.lollypop.docs.ReadMeTest.$anonfun$new$2(ReadMeTest.scala:22)\n\tat org.scalatest.OutcomeOf.outcomeOf(OutcomeOf.scala:85)\n\tat org.scalatest.OutcomeOf.outcomeOf$(OutcomeOf.scala:83)\n\tat org.scalatest.OutcomeOf$.outcomeOf(OutcomeOf.scala:104)\n\tat org.scalatest.Transformer.apply(Transformer.scala:22)\n\tat org.scalatest.Transformer.apply(Transformer.scala:20)\n\tat org.scalatest.funspec.AnyFunSpecLike$$anon$1.apply(AnyFunSpecLike.scala:457)\n\tat org.scalatest.TestSuite.withFixture(TestSuite.scala:196)\n\tat org.scalatest.TestSuite.withFixture$(TestSuite.scala:195)\n\tat org.scalatest.funspec.AnyFunSpec.withFixture(AnyFunSpec.scala:1631)\n\tat org.scalatest.funspec.AnyFunSpecLike.invokeWithFixture$1(AnyFunSpecLike.scala:455)\n\tat org.scalatest.funspec.AnyFunSpecLike.$anonfun$runTest$1(AnyFunSpecLike.scala:467)\n\tat org.scalatest.SuperEngine.runTestImpl(Engine.scala:306)\n\tat org.scalatest.funspec.AnyFunSpecLike.runTest(AnyFunSpecLike.scala:467)\n\tat org.scalatest.funspec.AnyFunSpecLike.runTest$(AnyFunSpecLike.scala:449)\n\tat org.scalatest.funspec.AnyFunSpec.runTest(AnyFunSpec.scala:1631)\n\tat org.scalatest.funspec.AnyFunSpecLike.$anonfun$runTests$1(AnyFunSpecLike.scala:500)\n\tat org.scalatest.SuperEngine.$anonfun$runTestsInBranch$1(Engine.scala:413)\n\tat scala.collection.immutable.List.foreach(List.scala:334)\n\tat org.scalatest.SuperEngine.traverseSubNodes$1(Engine.scala:401)\n\tat org.scalatest.SuperEngine.runTestsInBranch(Engine.scala:390)\n\tat org.scalatest.SuperEngine.$anonfun$runTestsInBranch$1(Engine.scala:427)\n\tat scala.collection.immutable.List.foreach(List.scala:334)\n\tat org.scalatest.SuperEngine.traverseSubNodes$1(Engine.scala:401)\n\tat org.scalatest.SuperEngine.runTestsInBranch(Engine.scala:396)\n\tat org.scalatest.SuperEngine.runTestsImpl(Engine.scala:475)\n\tat org.scalatest.funspec.AnyFunSpecLike.runTests(AnyFunSpecLike.scala:500)\n\tat org.scalatest.funspec.AnyFunSpecLike.runTests$(AnyFunSpecLike.scala:499)\n\tat org.scalatest.funspec.AnyFunSpec.runTests(AnyFunSpec.scala:1631)\n\tat org.scalatest.Suite.run(Suite.scala:1112)\n\tat org.scalatest.Suite.run$(Suite.scala:1094)\n\tat org.scalatest.funspec.AnyFunSpec.org$scalatest$funspec$AnyFunSpecLike$$super$run(AnyFunSpec.scala:1631)\n\tat org.scalatest.funspec.AnyFunSpecLike.$anonfun$run$1(AnyFunSpecLike.scala:504)\n\tat org.scalatest.SuperEngine.runImpl(Engine.scala:535)\n\tat org.scalatest.funspec.AnyFunSpecLike.run(AnyFunSpecLike.scala:504)\n\tat org.scalatest.funspec.AnyFunSpecLike.run$(AnyFunSpecLike.scala:503)\n\tat org.scalatest.funspec.AnyFunSpec.run(AnyFunSpec.scala:1631)\n\tat org.scalatest.tools.SuiteRunner.run(SuiteRunner.scala:45)\n\tat org.scalatest.tools.Runner$.$anonfun$doRunRunRunDaDoRunRun$13(Runner.scala:1320)\n\tat org.scalatest.tools.Runner$.$anonfun$doRunRunRunDaDoRunRun$13$adapted(Runner.scala:1314)\n\tat scala.collection.immutable.List.foreach(List.scala:334)\n\tat org.scalatest.tools.Runner$.doRunRunRunDaDoRunRun(Runner.scala:1314)\n\tat org.scalatest.tools.Runner$.$anonfun$runOptionallyWithPassFailReporter$24(Runner.scala:993)\n\tat org.scalatest.tools.Runner$.$anonfun$runOptionallyWithPassFailReporter$24$adapted(Runner.scala:971)\n\tat org.scalatest.tools.Runner$.withClassLoaderAndDispatchReporter(Runner.scala:1480)\n\tat org.scalatest.tools.Runner$.runOptionallyWithPassFailReporter(Runner.scala:971)\n\tat org.scalatest.tools.Runner$.run(Runner.scala:798)\n\tat org.scalatest.tools.Runner.run(Runner.scala)\n\tat org.jetbrains.plugins.scala.testingSupport.scalaTest.ScalaTestRunner.runScalaTest2or3(ScalaTestRunner.java:43)\n\tat org.jetbrains.plugins.scala.testingSupport.scalaTest.ScalaTestRunner.main(ScalaTestRunner.java:26)\nCaused by: java.lang.AssertionError: assertion failed: Table configuration file for 'lollypop.public.stocks#symbol' (lollypop_db/ns/lollypop/public/stocks/stocks.json) was not found\n\tat scala.Predef$.assert(Predef.scala:279)\n\tat com.lollypop.runtime.DatabaseManagementSystem.createIndex(DatabaseManagementSystem.scala:173)\n\tat com.lollypop.runtime.DatabaseManagementSystem.createIndex$(DatabaseManagementSystem.scala:171)\n\tat com.lollypop.runtime.DatabaseManagementSystem$.createIndex(DatabaseManagementSystem.scala:503)\n\tat com.lollypop.runtime.instructions.infrastructure.CreateIndex.execute(CreateIndex.scala:20)\n\tat com.lollypop.runtime.LollypopVM$.liftedTree1$1(LollypopVM.scala:34)\n\t... 71 more\n\n```\n\u003ca name=\"create_table\"\u003e\u003c/a\u003e\n### create table (Dataframe Management \u0026#8212; Declarative) \n*Description*: Creates a persistent database table\n\n```sql\ndef generateStocks(qty: Int) := {\n  [1 to qty].map(_ =\u003e {\n      exchange = ['AMEX', 'NASDAQ', 'NYSE', 'OTCBB', 'OTHER_OTC'][Random.nextInt(5)]\n      is_otc = exchange.startsWith(\"OT\")\n      lastSale = scaleTo(iff(is_otc, 1, 201) * Random.nextDouble(1.0), 4)\n      lastSaleTime = DateTime(DateTime() - Duration(1000 * 60 * Random.nextDouble(1.0)))\n      symbol = Random.nextString(['A' to 'Z'], iff(is_otc, Random.nextInt(2) + 4, Random.nextInt(4) + 2))\n      select lastSaleTime, lastSale, exchange, symbol\n  }).toTable()\n}\n\nnamespace \"temp.examples\"\ndrop if exists Stocks\ncreate table Stocks (symbol: String(10), exchange: String(10), lastSale: Double, lastSaleTime: DateTime)\n  containing (generateStocks(1000))\n\ngraph { shape: \"pie3d\", title: \"Small Caps\" }\nselect exchange, total: sum(lastSale) from Stocks\nwhere lastSale \u003c= 5.0\ngroup by exchange\n```\n##### Results\n\u003cdiv style=\"width: 100%\"\u003e\n\u003cimg src=\"./docs/images/Small_Caps.png\"\u003e\n\u003c/div\u003e\n\n\u003ca name=\"create_type\"\u003e\u003c/a\u003e\n### create type (Dataframe Management \u0026#8212; Declarative) \n*Description*: Creates a database type\n\n```sql\ncreate type mood := Enum (sad, okay, happy)\n```\n##### Results\n```sql\n|------------------------------------------------------------------------------------------------------|\n| altered | created | destroyed | deleted | inserted | matched | scanned | shuffled | updated | rowIDs |\n|------------------------------------------------------------------------------------------------------|\n|       0 |       1 |         0 |       0 |        0 |       0 |       0 |        0 |       0 | []     |\n|------------------------------------------------------------------------------------------------------|\n```\n\u003ca name=\"create_unique_index\"\u003e\u003c/a\u003e\n### create unique index (Dataframe Management \u0026#8212; Declarative) \n*Description*: Creates a unique index\n\n```sql\nnamespace \"temp.examples\"\ndrop if exists Stocks\ncreate table Stocks (\n  symbol: String(5),\n  exchange: Enum (AMEX, NASDAQ, NYSE, OTCBB, OTHEROTC),\n  lastSale: Double,\n  lastSaleTime: DateTime\n)\ncreate unique index Stocks#symbol\n```\n##### Results\n```sql\n|------------------------------------------------------------------------------------------------------|\n| altered | created | destroyed | deleted | inserted | matched | scanned | shuffled | updated | rowIDs |\n|------------------------------------------------------------------------------------------------------|\n|       0 |       1 |         0 |       0 |        0 |       0 |       0 |        0 |       0 | []     |\n|------------------------------------------------------------------------------------------------------|\n```\n\u003ca name=\"create_view\"\u003e\u003c/a\u003e\n### create view (Dataframe Management \u0026#8212; Declarative) \n*Description*: Creates a view\n\n```sql\nnamespace \"temp.temp\"\ndrop if exists Students\ncreate table Students (name: String(64), grade: Char, ratio: Double) containing (\n|----------------------------------|\n| name            | grade | ratio  |\n|----------------------------------|\n| John Wayne      | D     | 0.6042 |\n| Carry Grant     | B     | 0.8908 |\n| Doris Day       | A     | 0.9936 |\n| Audrey Hepburn  | A     | 0.9161 |\n| Gretta Garbeaux | C     | 0.7656 |\n|----------------------------------|\n)\ndrop if exists A_Students\ncreate view A_Students as select * from Students where ratio \u003e= 0.9\nns('A_Students')\n```\n##### Results\n```sql\n|---------------------------------|\n| name           | grade | ratio  |\n|---------------------------------|\n| Doris Day      | A     | 0.9936 |\n| Audrey Hepburn | A     | 0.9161 |\n|---------------------------------|\n```\n\u003ca name=\"declare_table\"\u003e\u003c/a\u003e\n### declare table (Dataframe Management \u0026#8212; Declarative) \n*Description*: Creates a durable database table\n\n```sql\ndeclare table Stocks (\nsymbol: String(8),\nexchange: Enum (AMEX, NASDAQ, NYSE, OTCBB, OTHEROTC),\nlastSale: Double,\nlastSaleTime: DateTime)\n```\n##### Results\n```sql\n|------------------------------------------------------------------------------------------------------|\n| altered | created | destroyed | deleted | inserted | matched | scanned | shuffled | updated | rowIDs |\n|------------------------------------------------------------------------------------------------------|\n|       0 |       1 |         0 |       0 |        0 |       0 |       0 |        0 |       0 | []     |\n|------------------------------------------------------------------------------------------------------|\n```\n\u003ca name=\"declare_view\"\u003e\u003c/a\u003e\n### declare view (Dataframe Management \u0026#8212; Declarative) \n*Description*: Creates a view\n\n```sql\ndeclare table Students (name: String(64), grade: Char, ratio: Double) containing (\n|----------------------------------|\n| name            | grade | ratio  |\n|----------------------------------|\n| John Wayne      | D     | 0.6042 |\n| Carry Grant     | B     | 0.8908 |\n| Doris Day       | A     | 0.9936 |\n| Audrey Hepburn  | A     | 0.9161 |\n| Gretta Garbeaux | C     | 0.7656 |\n|----------------------------------|\n)\ndeclare view A_Students as select * from Students where ratio \u003e= 0.9\nA_Students\n```\n##### Results\n```sql\n|---------------------------------|\n| name           | grade | ratio  |\n|---------------------------------|\n| Doris Day      | A     | 0.9936 |\n| Audrey Hepburn | A     | 0.9161 |\n|---------------------------------|\n```\n\u003ca name=\"drop\"\u003e\u003c/a\u003e\n### drop (Dataframe Management \u0026#8212; Declarative) \n*Description*: Deletes a database object\n\n```sql\nnamespace \"temp.examples\"\ndrop if exists Stocks\ncreate table Stocks (\n  symbol: String(8),\n  exchange: Enum (AMEX, NASDAQ, NYSE, OTCBB, OTHEROTC),\n  lastSale: Double,\n  lastSaleTime: DateTime,\n  headlines Table ( headline String(128), newsDate DateTime )[100]\n)\ndrop Stocks\n```\n##### Results\n```sql\n|------------------------------------------------------------------------------------------------------|\n| altered | created | destroyed | deleted | inserted | matched | scanned | shuffled | updated | rowIDs |\n|------------------------------------------------------------------------------------------------------|\n|       0 |       0 |         1 |       0 |        0 |       0 |       0 |        0 |       0 | []     |\n|------------------------------------------------------------------------------------------------------|\n```\n\u003ca name=\"Table\"\u003e\u003c/a\u003e\n### Table (Dataframe Management \u0026#8212; Functional) \n*Description*: Returns a new transient table\n\n```sql\nval stocks = Table(symbol: String(4), exchange: String(6), transactions: Table(price: Double, transactionTime: DateTime)[5])\ninsert into @stocks (symbol, exchange, transactions)\nvalues ('AAPL', 'NASDAQ', {price:156.39, transactionTime:\"2021-08-05T19:23:11.000Z\"}),\n       ('AMD',  'NASDAQ', {price:56.87, transactionTime:\"2021-08-05T19:23:11.000Z\"}),\n       ('INTC', 'NYSE',   {price:89.44, transactionTime:\"2021-08-05T19:23:11.000Z\"}),\n       ('AMZN', 'NASDAQ', {price:988.12, transactionTime:\"2021-08-05T19:23:11.000Z\"}),\n       ('SHMN', 'OTCBB', [{price:0.0010, transactionTime:\"2021-08-05T19:23:11.000Z\"},\n                          {price:0.0011, transactionTime:\"2021-08-05T19:23:12.000Z\"}])\n@stocks\n```\n##### Results\n```sql\n|--------------------------------------------------------------------|\n| symbol | exchange | transactions                                   |\n|--------------------------------------------------------------------|\n| AAPL   | NASDAQ   | (price, transactionTime)                       |\n| AMD    | NASDAQ   | (price, transactionTime)                       |\n| INTC   | NYSE     | (price, transactionTime)                       |\n| AMZN   | NASDAQ   | (price, transactionTime)                       |\n| SHMN   | OTCBB    | ByteArrayRowCollection(price, transactionTime) |\n|----------","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fldaniels528%2Flollypop","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fldaniels528%2Flollypop","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fldaniels528%2Flollypop/lists"}