{"id":32424602,"url":"https://github.com/alipsa/jparq","last_synced_at":"2026-06-14T01:32:50.490Z","repository":{"id":319516131,"uuid":"1077794160","full_name":"Alipsa/JParq","owner":"Alipsa","description":"JDBC driver for parquet files","archived":false,"fork":false,"pushed_at":"2026-03-27T17:11:27.000Z","size":2098,"stargazers_count":2,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-14T01:32:45.654Z","etag":null,"topics":["jdbc","jdbc-driver","parquet","parquet-files","parquet-tools"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Alipsa.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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2025-10-16T18:43:24.000Z","updated_at":"2026-03-27T17:11:31.000Z","dependencies_parsed_at":"2025-11-02T22:02:55.394Z","dependency_job_id":null,"html_url":"https://github.com/Alipsa/JParq","commit_stats":null,"previous_names":["alipsa/jparq"],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/Alipsa/JParq","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Alipsa%2FJParq","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Alipsa%2FJParq/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Alipsa%2FJParq/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Alipsa%2FJParq/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Alipsa","download_url":"https://codeload.github.com/Alipsa/JParq/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Alipsa%2FJParq/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34306772,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-13T02:00:06.617Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["jdbc","jdbc-driver","parquet","parquet-files","parquet-tools"],"created_at":"2025-10-25T19:51:25.866Z","updated_at":"2026-06-14T01:32:50.483Z","avatar_url":"https://github.com/Alipsa.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Maven Central](https://img.shields.io/maven-central/v/se.alipsa/jparq)](https://mvnrepository.com/artifact/se.alipsa/jparq)\n[![javadoc](https://javadoc.io/badge2/se.alipsa/jparq/javadoc.svg)](https://javadoc.io/doc/se.alipsa/jparq)\n\n# JParq\n\nJParq is a JDBC driver for Apache Parquet files. It treats a directory as a database and every `.parquet` file in that\ndirectory as a table. The table name is the filename without the `.parquet` extension. \nSub directories are treated as schemas. \nFor example, given the following directory structure:\n\n```\n/data\n  ├── employees.parquet\n  ├── departments.parquet\n  └── sales\n      ├── orders.parquet\n      └── customers.parquet   \n```\nThe tables `employees` and `departments` would be in the default PUBLIC schema, while `orders` and `customers` would be in the `sales` schema.\n\nJParq uses Apache Arrow and Apache Parquet for efficient columnar reads and jsqlparser to parse SQL statements. \nIt aims to be 100% compliant with the read part of the SQL standard. There are a few common extensions supported as well e.g. LIMIT, ASCII, REPEAT, DIFFERENCE.\n\nNote: When common implementations differ from the SQL standard, we stick to the standard. An example of this is\nconvert which in many databases is used for data type casting, but in the SQL standard is used for character set\nconversion. If you want to convert data types, use CAST instead.\n\n\u003e **Note**\n\u003e The majority of the code was created in collaboration with (vibe coded with) ChatGPT Codex with Copilot and \n\u003e myself (Per Nyfelt) as code reviewers.\n\n## Requirements\n\n- Java 21 (higher is not supported due to Hadoop restrictions)\n- Parquet files stored in a directory accessible from the JVM running the driver\n\n## Installation\n\nAdd the dependency to your build. Replace `x.y.z` with the latest version number from the Maven Central badge above.\n\n```xml\n\u003cdependency\u003e\n  \u003cgroupId\u003ese.alipsa\u003c/groupId\u003e\n  \u003cartifactId\u003ejparq\u003c/artifactId\u003e\n  \u003cversion\u003ex.y.z\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n## Usage\n\nThe driver registers itself when the `se.alipsa.jparq.JParqDriver` class is loaded, so simply placing the JAR on the\nclasspath is normally enough. If your runtime requires explicit registration you can call\n`Class.forName(\"se.alipsa.jparq.JParqDriver\")` before obtaining a connection.\n\n```java\nimport java.sql.Connection;\nimport java.sql.DriverManager;\nimport java.sql.ResultSet;\nimport java.sql.SQLException;\nimport java.sql.Statement;\n\nimport se.alipsa.jparq.JParqSql;\n\npublic class JParqExample {\n\n  // Standard JDBC\n  void selectMtcarsLimit() throws SQLException {\n    String jdbcUrl = \"jdbc:jparq:/home/user/data\";\n    try (Connection conn = DriverManager.getConnection(jdbcUrl);\n         Statement stmt = conn.createStatement();\n         ResultSet rs = stmt.executeQuery(\"SELECT * FROM mtcars LIMIT 5\")) {\n      while (rs.next()) {\n        System.out.println(rs.getString(1));\n      }\n    }\n  }\n\n  // Using the JParqSql helper\n  void selectMtcarsToyotas() {\n    String jdbcUrl = \"jdbc:jparq:/home/user/data\";\n    JParqSql jparqSql = new JParqSql(jdbcUrl);\n    jparqSql.query(\"SELECT model, cyl, mpg FROM mtcars WHERE model LIKE 'Toyota%'\", rs -\u003e {\n      try {\n        while (rs.next()) {\n          System.out.println(rs.getString(1) + \", \" + rs.getInt(2) + \", \" + rs.getDouble(3));\n        }\n      } catch (SQLException e) {\n        System.out.println(\"Query failed: \" + e);\n      }\n    });\n  }\n}\n```\n\n### Connection options\n\n- `caseSensitive` — defaults to `false`. Set to `true` to make table-name resolution case-sensitive.\n  ```text\n  jdbc:jparq:/home/user/data?caseSensitive=true\n  ```\n- Paths may be specified directly or using the `file://` prefix.\n\n### Fat Jar\n\nA \"fat\" jar, which includes all dependencies, is also created. This is useful when you want to add the driver to the classpath of a tool. The fat jar is named `jparq-x.y.z-fat.jar` i.e. fat is the maven classifier. It is available in maven central and in the [releases](https://github.com/Alipsa/JParq/releases) section.\n\n## JParq CLI\nAn interactive command line interface is available for querying Parquet files using JParq. The CLI supports command\nhistory and basic line editing features. It also includes several commands starting with a slash (/) for controlling the CLI itself.\nTo start the CLI, run the following command, replacing `path/to/jparq.jar` with the actual path to the JParq fat jar and the {path to jparq dir} with the path the directory where your parquet files reside. \n\n```shell\njava -jar path/to/jparq.jar {path to jparq dir}\n```\n\nTo download the fat jar, you can either download it from [releases](https://github.com/Alipsa/JParq/releases) or use the following command:\n\n```shell\nLATEST_VERSION=$(curl -s https://repo1.maven.org/maven2/se/alipsa/jparq/maven-metadata.xml | sed -nE 's/.*\u003crelease\u003e(.*)\u003c\\/release\u003e.*/\\1/p') \u0026\u0026 \\\ncurl -o jparq.jar https://repo1.maven.org/maven2/se/alipsa/jparq/$LATEST_VERSION/jparq-$LATEST_VERSION-fat.jar\n```\nFor simpler access you can create a script to it (e.g called jparq) that you put in your ~/bin dir\n\n```shell\n#!/usr/bin/env bash\njava -jar /path/to/jparq.jar $@\n```\n\nOnce the CLI is started, you can use the following commands:\n- /connect \u003cbase directory path\u003e - Connect to a Parquet database directory (dir with parquet files)\n- /close - Close the current connection\n- /list - List available tables\n- /describe \u003ctable name\u003e - Show column definitions for a table\n- /info - Show information about the current connection\n- /help - Display this help text\n- /exit - Exit the CLI\n\n\n\u003e Anything else will be treated as a SQL query and executed against the connected dir.\n\nExample session:\n```\n$ java -jar ~/lib/jparq.jar target/test-classes/acme\nJParq CLI version 1.3.0\nConnected to /home/user1/project/JParq/target/test-classes/acme\njparq(acme)\u003e select * from employees e left join salary s on e.id = salary.employee\ne__id | first_name | last_name  | s__id | employee | salary   | change_date\n------+------------+------------+-------+----------+----------+------------\n1     | Per        | Andersson  | 1     | 1        | 150000.0 | 2020-03-01 \n1     | Per        | Andersson  | 6     | 1        | 160000.0 | 2021-01-01 \n1     | Per        | Andersson  | 8     | 1        | 165000.0 | 2021-08-01 \n2     | Karin      | Pettersson | 2     | 2        | 180000.0 | 2020-03-01 \n3     | Tage       | Lundström  | 3     | 3        | 130000.0 | 2021-01-01 \n3     | Tage       | Lundström  | 7     | 3        | 140000.0 | 2021-12-01 \n4     | Arne       | Larsson    | 4     | 4        | 195000.0 | 2020-10-01 \n5     | Sixten     | Svensson   | 5     | 5        | 230000.0 | 2020-12-15 \njparq(acme)\u003e /exit\n$\n```\n\n## JDBC support\n\n- **Driver scope** — Read-only. Only `SELECT` statements are supported; `executeUpdate`/DML, generated keys, and updatable result sets are not implemented. Result sets are `TYPE_FORWARD_ONLY`, `CONCUR_READ_ONLY` with `CLOSE_CURSORS_AT_COMMIT` holdability.\n- **Prepared statements** — SQL is planned when the `PreparedStatement` is created. Positional `?` parameters are bound via the standard `setXxx` methods and rendered as safe SQL literals (named parameters are also supported). Parameter metadata is available but reports generic `VARCHAR`/`IN` characteristics because actual typing occurs at execution. Only forward-only/read-only statements with `CLOSE_CURSORS_AT_COMMIT` holdability are accepted; overloads requesting other result-set types or generated keys/column-based key selection throw `SQLFeatureNotSupportedException`. Prepared-statement batching without a SQL argument is supported for convenience and reports `SUCCESS_NO_INFO` counts per entry. `Statement` batching and `addBatch(String)` remain unsupported.\n- **Parquet predicate pushdown** — When a query targets a Parquet-backed table with readable schema metadata and the full `WHERE` clause can be translated by `ParquetFilterBuilder`, JParq attaches a Parquet `FilterPredicate` and enables statistics, column-index, dictionary, and bloom-filter pruning. Supported shapes are column-vs-literal comparisons (`=`, `!=`, `\u003c`, `\u003c=`, `\u003e`, `\u003e=`), `BETWEEN`, `IN` with up to 20 literals, and `AND`/`OR`/`NOT` compositions where every branch is pushdownable. Predicates involving functions, `LIKE`, column-to-column comparisons, subqueries, unsupported types, or mixed pushdownable/non-pushdownable trees fall back to residual filtering in Java. `JParqPreparedStatement.getPushdownInfo()` exposes which path a prepared statement uses.\n- **Transactions and sessions** — The connection is always read-only with `TRANSACTION_NONE`; `commit`, `rollback`, and savepoints are no-ops. `getAutoCommit()` always returns `true`, and changing isolation level, holdability, or poolability is not supported.\n- **Metadata** — `DatabaseMetaData` exposes tables and columns derived from the base directory and subdirectories (schemas); the catalog is the base directory name. Callable statements, stored procedures, and custom type mappings are not supported.\n- **Other JDBC surfaces** — `CallableStatement`, `createClob`/`createBlob`/`createArrayOf`, network timeout, and client-info features are not implemented. Connection validation via `isValid()` returns `true` while the connection is open and `false` after it is closed.\n\n### Non standard JDBC extensions\n- Named parameters i.e. :paramName syntax for prepared statements\n\n## SQL Support\nJParq aims to be fully compliant with the read part of the SQL standard (SQL:2016 and earlier). \nAs of version 1.1.1, the support for the standard is complete (as far as I know). The following is a detailed list of supported features and functions.\n\nThe following SQL statements are supported:\n- `SELECT` with support for\n  - `*` to select all columns\n  - Qualified wildcard projections (table.*).\n  - alias support for columns and tables\n  - Support computed expressions with aliases (e.g. SELECT mpg*2 AS double_mpg)\n  - Quoted identifiers using \"double quotes\" as per the SQL standard.\n  - `CASE` support\n- `SELECT` statements with `WHERE` supporting:\n  - `BETWEEN`, `IN`, `LIKE` operators\n  - `AND`, `OR`, `NOT` logical operators\n  - Comparison operators: `=`, `!=`, `\u003c`, `\u003e`, `\u003c=`, `\u003e=`\n  - Null checks: `IS NULL`, `IS NOT NULL`\n- `ORDER BY` clause with multiple columns and `ASC`/`DESC` options\n  - support for optional explicit NULLS FIRST and NULLS LAST\n- `OFFSET` and `LIMIT` support\n  - Also support the PostgreSQL shorthand `LIMIT n OFFSET m` syntax\n- Standard row-limiting syntax (FETCH FIRST / OFFSET … FETCH)\n- `DISTINCT` support\n- Functions support\n  - Date functions\n  - Aggregate functions (count, sum, avg, max, min)\n  - CAST support\n  - CONVERT support (for both character set conversion with USING and data type conversion without USING, as per SQL standard and common extensions)\n  - coalesce (The COALESCE() function returns the first non-null value in a list.)\n  - String functions (all SQL standard string function supported)\n    - also support || operator for string concatenations\n  - Numeric functions (abs, ceil/ceiling, floor, round, sqrt, truncate/trunc, mod, power/pow, exp, log, log10,\n    rand/random, sign, sin, cos, tan, cot, asin, acos, atan, atan2, degrees, radians, pi)\n  - ARRAY constructor function\n- comments (line --) and block (/* */)\n- Subquery support\n  - In the SELECT Clause : Used to return a single value or a set of values. e.g.\n    SELECT first_name, (\n    SELECT department_name FROM departments WHERE departments.department_id = employees.department_id\n    ) AS department_name\n    FROM employees;\n  - In the FROM Clause : Treated as a derived table or inline view. E.g:\n    SELECT *\n    FROM (SELECT first_name, salary FROM employees WHERE salary \u003e 5000) AS \"high_salaried\"\n  - In the WHERE Clause : Used to filter the results. e.g\n    SELECT first_name\n    FROM employees\n    WHERE department_id IN (SELECT department_id FROM departments WHERE location_id\u003e1500);\n  - In the HAVING Clause : Used to filter groups. E.g:\n    SELECT department_id, AVG(salary)\n    FROM employees\n    GROUP BY department_id\n    HAVING AVG(salary) \u003e (SELECT AVG(salary) FROM employees);\n- `GROUP BY` support\n  - `COUNT(*)` aggregation\n  - `HAVING` clause with conditions\n  - support aggregation functions and case statements in the `GROUP BY` and `SELECT` clause\n- `EXISTS` support\n- `ANY` and `ALL` support\n- Join support: INNER, LEFT, RIGHT, FULL, CROSS, and Self Join, join ... using syntax\n- `UNION` and `UNION ALL` support\n- Complete set-operation coverage.\n  - `EXCEPT`\n  - `INTERSECT`\n  - `INTERSECT ALL`\n  - `EXCEPT ALL`\n  - nesting of set operations\n- CTE (Common Table Expressions) support\n- Windowing\n  - Ranking functions\n    - `ROW_NUMBER`, `RANK`, `DENSE_RANK`, `PERCENT_RANK`, `CUME_DIST`, `NTILE`\n  -  Aggregate window functions\n    - `SUM`, `AVG`, `MIN`, `MAX`, `COUNT`\n  - Analytic Value/Navigation Functions\n    -  `LAG`, `LEAD`, `FIRST_VALUE`, `LAST_VALUE`, `NTH_VALUE`\n- Advanced GROUP BY constructs i.e:\n  - `GROUPING SETS`\n  - `ROLLUP`\n  - `CUBE`\n- Derived Tables: `UNNEST` with or without a table wrapper, `LATERAL` derived tables, `VALUES` table constructors\n- `INFORMATION_SCHEMA.COLUMNS` and `INFORMATION_SCHEMA.TABLES`\n\n#### String functions support details\n##### Character Length and Position\n- CHAR_LENGTH(string) or CHARACTER_LENGTH(string)       Returns number of characters in a string.       CHAR_LENGTH('hello') → 5\n- OCTET_LENGTH(string)  Returns number of bytes in the string (depends on encoding).    OCTET_LENGTH('Å') → 2 (in UTF-8)\n- POSITION(substring IN string) Finds the position (1-based) of substring in string.    POSITION('l' IN 'hello') → 3\n\n##### Substrings and Extraction\n- SUBSTRING(string FROM start [FOR length])     Extracts substring starting at start, optionally limited by length.     SUBSTRING('abcdef' FROM 2 FOR 3) → 'bcd'\n- LEFT(string, count) (optional extension)      Leftmost characters.    LEFT('abcdef', 3) → 'abc'\n- RIGHT(string, count) (optional extension)     Rightmost characters.   RIGHT('abcdef', 2) → 'ef'\n\n##### Concatenation\n- CONCAT(string1, string2, …)   Concatenates two or more strings (SQL:2016 added variadic support).     CONCAT('a','b','c') → 'abc'\n- Support for the || operator, covering both binary and text concatenation, as well as null propagation.\n\n##### Case Conversion\n- UPPER(string) Converts to uppercase.  UPPER('sql') → 'SQL'\n- LOWER(string) Converts to lowercase.  LOWER('SQL') → 'sql'\n\n##### Trimming and Padding\n- TRIM([LEADING TRAILING        BOTH] [characters] FROM string)\n- LTRIM(string) (extension)     Trims leading spaces.   LTRIM(' hi') → 'hi'\n- RTRIM(string) (extension)     Trims trailing spaces.  RTRIM('hi ') → 'hi'\n- LPAD(string, length [, fill]) (SQL:2008 optional)     Pads string on the left.        LPAD('42', 5, '0') → '00042'\n- RPAD(string, length [, fill]) (SQL:2008 optional)     Pads string on the right.       RPAD('42', 5, '0') → '42000'\n\n##### Searching and Replacing\n- OVERLAY(string PLACING replacement FROM start [FOR length])   Replaces part of string starting at start with replacement.    OVERLAY('abcdef' PLACING 'xyz' FROM 3 FOR 2) → 'abxyze f'\n- REPLACE(string, search, replace) (SQL:2008)   Replaces all occurrences of search with replace.        REPLACE('banana', 'na', 'xy') → 'baxyxy'\n\n##### Collation and Comparison\n- COLLATE(string, collation_name)       Applies a specific collation to a string.       'abc' COLLATE \"sv_SE\"\n- SIMILAR TO e.g.\n  'cat' SIMILAR TO '(cat|dog)'      → TRUE\n  'cab' SIMILAR TO 'c(a|o)b'        → TRUE\n  'cab' SIMILAR TO 'c(a|e)b'        → FALSE\n  'abc' SIMILAR TO 'a%'             → TRUE\n- REGEXP_LIKE (pattern matching operators) e.g:\n  REGEXP_LIKE('abc123', '^[a-z]+[0-9]+$')   → TRUE\n  REGEXP_LIKE('AbC', 'abc', 'i')            → TRUE  -- 'i' = case-insensitive\n  REGEXP_LIKE('cat', 'dog|cat')             → TRUE\n\n##### Unicode and Codepoints\n- CHAR(code)    Returns the character corresponding to a code point.    CHAR(65) → 'A'\n- UNICODE(string)       Returns Unicode code point of first character.  UNICODE('A') → 65\n\n##### SQL:2016–2023 Additions\n- NORMALIZE(string [USING form])        Normalizes Unicode text (SQL:2016).     NORMALIZE('é') → 'é'\n- STRING_AGG(expression, separator)     Aggregates values into a single string with a separator.        STRING_AGG(name, ', ') → 'Alice, Bob, Carol'\n- JSON_VALUE, JSON_QUERY, JSON_OBJECT, JSON_ARRAY       JSON construction/extraction—technically not core string functions but string-returning functions standardized in SQL:2016–2023.\n\n##### Non-standard extensions\n- ASCII(string)    Returns the ASCII code of the first character.    ASCII('A') → 65\n- LOCATE(substring, string[, start])    Locates substring in string with optional start position.    LOCATE('c', 'abcabc', 3) → 3\n- REPEAT(string, count)    Repeats the string N times.    REPEAT('a', 4) → 'aaaa'\n- SPACE(count)    Creates a string of N space characters.    SPACE(5) → '     '\n- INSERT(string, start, length, replacement)    Inserts replacement at position after removing length characters.    INSERT('abcdef', 3, 2, 'XYZ') → 'abXYZef'\n- SOUNDEX(string)    Computes the Soundex phonetic code.    SOUNDEX('Robert') → 'R163'\n- DIFFERENCE(string1, string2)    Calculates similarity based on Soundex codes (0-4).    DIFFERENCE('Smith', 'Smyth') → 4\n\n### Build and test\n\n```bash\nmvn verify\n```\n- To run without spotless, add -Dspotless.check.skip=true\n- To skip unit tests, add -DskipTests\n- To skip integration tests add -DskipITs=true\n\nThis project uses Checkstyle, PMD, and Spotless. The checks run automatically as part of the Maven build. Use the\n`spotless:apply` goal before committing if you need to fix formatting issues.\n\n### Release notes\n\nSee [release.md](release.md) for the full version history and work in progress.\n\n## Roadmap: _Might_ be implemented in the future\n\n### Non standard extensions\n- Allow omission of from clause in some cases\n  - Several popular databases allow you to omit the FROM clause when you are only selecting literal values, performing arithmetic, or evaluating scalar functions (functions that return a single value). In these cases, the query returns a single row e.g: `SELECT CURRENT_DATE as cur_date`.\n- Support for variable assignment and use within SQL scripts.\n  - @variable_name syntax to define a variable that exists for the duration of the connection\n    - Example (direct assignment, connection scope):\n      declare @myVar INT = 10;\n      SELECT * FROM myTable WHERE myColumn \u003e @myVar;\n      SELECT * FROM anotherTable LIMIT @myVar;\n- PIVOT and UNPIVOT operators.\n- TABLESAMPLE clause for sampling rows from a table.\n- Support for modular encryption via a keystore and/or a Key Management Service\n\n## Out of scope (will not be supported, at least not in the foreseeable future)\n- Data modification statements (INSERT, UPDATE, DELETE, MERGE)\n- Transaction control (COMMIT, ROLLBACK, SAVEPOINT)\n- Data definition statements (CREATE, ALTER, DROP, TRUNCATE)\n- User management and security (GRANT, REVOKE, CREATE USER, etc.)\n- Stored procedures and functions (CREATE PROCEDURE, CREATE FUNCTION)\n- Triggers (CREATE TRIGGER, DROP TRIGGER)\n- Advanced indexing and optimization hints\n- Full-text search capabilities\n- TEMPORARY TABLES, you need to use CTE's or value tables instead.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falipsa%2Fjparq","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falipsa%2Fjparq","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falipsa%2Fjparq/lists"}