summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibSQL
AgeCommit message (Collapse)Author
2021-08-13AK+Everywhere: Delete Variant's default constructorAli Mohammad Pur
This was exposed to the user by mistake, and even accumulated a bunch of users that didn't blow up out of sheer luck.
2021-08-06LibSQL: Use compiler generated default functionsLenny Maiorani
Problem: - Clang ToT generates warnings due to user-declared functions causing the implicitly generated assignment operator to not be generated. Solution: - Declare the default constructor `= default`. - Remove the default copy constructor declaration.
2021-07-08LibSQL+SQLServer: Build SQLServer system serviceJan de Visser
This patch introduces the SQLServer system server. This service is supposed to be the only process/application talking to database storage. This makes things like locking and caching more reliable, easier to implement, and more efficient. In LibSQL we added a client component that does the ugly IPC nitty- gritty for you. All that's needed is setting a number of event handler lambdas and you can connect to databases and execute statements on them. Applications that wish to use this SQLClient class obviously need to link LibSQL and LibIPC.
2021-07-08LibSQL: Invent statement execution machinery and CREATE SCHEMA statementJan de Visser
This patch introduces the ability execute parsed SQL statements. The abstract AST Statement node now has a virtual 'execute' method. This method takes a Database object as parameter and returns a SQLResult object. Also introduced here is the CREATE SCHEMA statement. Tables live in a schema, and if no schema is present in a table reference the 'default' schema is implied. This schema is created if it doesn't yet exist when a Database object is created. Finally, as a proof of concept, the CREATE SCHEMA and CREATE TABLE statements received an 'execute' implementation. The CREATE TABLE method is not able to create tables created from SQL queries yet.
2021-07-08LibSQL: Move Order and Nulls enums from SQL::AST to SQL namespaceJan de Visser
The Order enum is used in the Meta component of LibSQL. Using this enum meant having to include the monster AST/AST.h include file. Furthermore, they are sort of basic and therefore can live in the general SQL namespace. Moved to LibSQL/Type.h. Also introduced a new class, SQLResult, which is needed in future patches.
2021-06-24LibSQL: Make lexer and parser more standard SQL compliantJan de Visser
SQL was standardized before there was consensus on sane language syntax constructs had evolved. The language is mostly case-insensitive, with unquoted text converted to upper case. Identifiers can include lower case characters and other 'special' characters by enclosing the identifier with double quotes. A double quote is escaped by doubling it. Likewise, a single quote in a literal string is escaped by doubling it. All this means that the strategy used in the lexer, where a token's value is a StringView 'window' on the source string, does not work, because the value needs to be massaged before being handed to the parser. Therefore a token now has a String containing its value. Given the limited lifetime of a token, this is acceptable overhead. Not doing this means that for example quote removal and double quote escaping would need to be done in the parser or in AST node construction, which would spread lexing basically all over the place. Which would be suboptimal. There was some impact on the sql utility and SyntaxHighlighter component which was addressed by storing the token's end position together with the start position in order to properly highlight it. Finally, reviewing the tests for parsing numeric literals revealed an inconsistency in which tokens we accept or reject: `1a` is accepted but `1e` is rejected. Related to this is the fate of `0x`. Added a FIXME reminding us to address this.
2021-06-24LibSQL: Move Lexer and Parser machinery to AST directoryJan de Visser
The SQL engine is expected to be a fairly sizeable piece of software. Therefore we're starting to restructure the codebase for growth.
2021-06-19LibSQL: Database layerJan de Visser
This patch implements the beginnings of a database API allowing for the creation of tables, inserting rows in those tables, and retrieving those rows.
2021-06-19LibSQL: Hash index implementation for the SQL storage layerJan de Visser
This patch implements a basic hash index. It uses the extendible hashing algorith. Also includes a test file.
2021-06-19LibSQL: BTree index, Heap, and Meta objects for SQL Storage layerJan de Visser
Unfortunately this patch is quite large. The main functionality included are a BTree index implementation and the Heap class which manages persistent storage. Also included are a Key subclass of the Tuple class, which is a specialization for index key tuples. This "dragged in" the Meta layer, which has classes defining SQL objects like tables and indexes.
2021-06-19LibSQL: Basic dynamic value classes for SQL Storage layerJan de Visser
This patch adds the basic dynamic value classes used by the SQL Storage layer. The most elementary class is Value, which holds a typed Value which can be converted to standard C++ types. A Tuple is a collection of Values described by a TupleDescriptor, which specifies the names, types, and ordering of the elements in the Tuple. Tuples and Values can be serialized and deserialized to and from ByteBuffers. This is mechanism which is used to save them to disk. Tuples are used as keys in SQL indexes and rows in SQL tables. Also included is a test file.
2021-06-13Userland: Allow building SerenityOS with -funsigned-charGunnar Beutner
Some of the code assumed that chars were always signed while that is not the case on ARM hosts. Also, some of the code tried to use EOF (-1) in a way similar to what fgetc() does, however instead of storing the characters in an int variable a char was used. While this seemed to work it also meant that character 0xFF would be incorrectly seen as an end-of-file. Careful reading of fgetc() reveals that fgetc() stores character data in an int where valid characters are in the range of 0-255 and the EOF value is explicitly outside of that range (usually -1).
2021-06-08LibSQL: Limit the number of nested subqueriesTimothy Flynn
SQLite hasn't documented a limit on https://www.sqlite.org/limits.html for the maximum number of nested subqueries. However, its parser is generated with Yacc and has an internal limit of 100 for general nested statements. Fixes https://crbug.com/oss-fuzz/35022.
2021-06-07LibWeb+LibSyntax: Implement nested syntax highlightersAli Mohammad Pur
And use them to highlight javascript in HTML source. This commit also changes how TextDocumentSpan::data is interpreted, as it used to be an opaque pointer, but everyone stuffed an enum value inside it, which made the values not unique to each highlighter; that field is now a u64 serial id. The syntax highlighters don't need to change their ways of stuffing token types into that field, but a highlighter that calls another nested highlighter needs to register the nested types for use with token pairs.
2021-06-05LibSQL: Limit the allowed depth of an expression treeTimothy Flynn
According to the definition at https://sqlite.org/lang_expr.html, SQL expressions could be infinitely deep. For practicality, SQLite enforces a maxiumum expression tree depth of 1000. Apply the same limit in LibSQL to avoid stack overflow in the expression parser. Fixes https://crbug.com/oss-fuzz/34859.
2021-06-05LibSQL: Fix off-by-one error in SyntaxHighlighterMax Wipfli
This changes the SQL SyntaxHighlighter to conform to the now-fixed rendering of syntax highlighting spans in GUI::TextEditor.
2021-06-05LibSQL: Clean up SyntaxHighlighter codeMax Wipfli
This changes SyntaxHighlighter.{cpp,h} to use east const style. It also removes two unused headers and simplifies a loop.
2021-06-03LibSQL: Report a syntax error for unsupported LIMIT clause syntaxTimothy Flynn
Rather than aborting when a LIMIT clause of the form 'LIMIT expr, expr' is encountered, fail the parser with a syntax error. This will be nicer for the user and fixes the following fuzzer bug: https://crbug.com/oss-fuzz/34837
2021-06-01LibSQL: Return an error for empty common table expression listsTimothy Flynn
SQL::CommonTableExpressionList is required to be non-empty. Return an error if zero common table expressions were parsed. Fixes #7627
2021-05-17Everywhere: Fix a bunch of typosLinus Groh
2021-05-09LibSQL: Add a syntax highlighterDylan Katz
2021-05-06Tests: Move LibSQL tests to Tests/LibSQLBrian Gianforcaro
2021-05-05LibSQL: Fix incorrect return typesGunnar Beutner
Right now RefPtr<T> is way more lenient than it should be. That might change in the future though.
2021-04-25AK+Userland: Move AK/TestSuite.h into LibTest and rework Tests' CMakeAndrew Kaster
As many macros as possible are moved to Macros.h, while the macros to create a test case are moved to TestCase.h. TestCase is now the only user-facing header for creating a test case. TestSuite and its helpers have moved into a .cpp file. Instead of requiring a TEST_MAIN macro to be instantiated into the test file, a TestMain.cpp file is provided instead that will be linked against each test. This has the side effect that, if we wanted to have test cases split across multiple files, it's as simple as adding them all to the same executable. The test main should be portable to kernel mode as well, so if there's a set of tests that should be run in self-test mode in kernel space, we can accomodate that. A new serenity_test CMake function streamlines adding a new test with arguments for the test source file, subdirectory under /usr/Tests to install the test application and an optional list of libraries to link against the test application. To accomodate future test where the provided TestMain.cpp is not suitable (e.g. test-js), a CUSTOM_MAIN parameter can be passed to the function to not link against the boilerplate main function.
2021-04-24LibSQL: Parse ALTER TABLE statementTimothy Flynn
There are 4 forms an ALTER TABLE statement can take, and each are very distinct, so they each get their own AST node class.
2021-04-24LibSQL: Parse UPDATE statementTimothy Flynn
This also migrates parsing of conflict resolution to a helper method, since both INSERT and UPDATE need it.
2021-04-24LibSQL: Parse INSERT statementTimothy Flynn
This also adds missing '&' on a couple AST getter methods.
2021-04-24LibSQL: Add missing forward declarationsTimothy Flynn
2021-04-23LibSQL: Parse IN / NOT IN expressions with a nested SELECT statementTimothy Flynn
2021-04-23LibSQL: Parse common-table-expressions with a nested SELECT statementTimothy Flynn
This also moves testing of common-table-expression to its own test case.
2021-04-23LibSQL: Parse CREATE TABLE statements with a nested SELECT statementTimothy Flynn
2021-04-23LibSQL: Parse EXISTS expressionsTimothy Flynn
The EXISTS expression is a bit of an odd-man-out because it can appear as any of the following forms: EXISTS (select-stmt) NOT EXISTS (select-stmt) (select-stmt) Which makes it the only keyword expression that doesn't require its keyword to actually be used. The consequence is that we might come across an EXISTS expression while parsing another expression type; NOT would have triggered a unary operator expression, and an opening parentheses would have triggered an expression chain.
2021-04-23LibSQL: Parse terminating semi-colon in top-level statement parserTimothy Flynn
Currently, every parse_*_statement method ends by parsing a semi-colon. This will prevent nested statements, e.g. a SELECT statement may be nested in a CREATE TABLE statement. Move the semi-colon expectation up and out of the individual statement parsers.
2021-04-23LibSQL: Add Parser::parse_schema_and_table_name helperTimothy Flynn
Another common semantic is parsing an identifier of the form "schema_name.table_name" / "table_name". Add a helper to do this work. This helper does not parse any optional alias after the table name. some syntaxes specify an alias using the AS keyword, some let the AS keyword be optional, and others just parse it as an identifier. So callers to this helper will just continue parsing the alias however they require.
2021-04-23LibSQL: Add Parser::parse_comma_separated_list helperTimothy Flynn
A quite common semantic emerged for parsing comma-separated expressions: consume(TokenType::ParenOpen); do { // do something if (!match(TokenType::Comma)) break; consume(TokenType::Comma); } while (!match(TokenType::Eof)); consume(TokenType::ParenClose); Add a helper to do the bulk of the while loop.
2021-04-23LibSQL: Fix handling of optional AS keywordsTimothy Flynn
In some syntaxes, using the 'AS' keyword to define an alias is optional. But if it does appear, an identifier better appear afterwards.
2021-04-23AK: Rename adopt() to adopt_ref()Andreas Kling
This makes it more symmetrical with adopt_own() (which is used to create a NonnullOwnPtr from the result of a naked new.)
2021-04-22LibSQL: Parse (most of) SELECT statementTimothy Flynn
This doesn't yet parse join clauses, windowing functions, or compound SELECT statements.
2021-04-22LibSQL: Separate parsing of common-table-expression listTimothy Flynn
Statements like SELECT, INSERT, and UPDATE also optionally include this list, so move its parsing out of parse_delete_statement(). Since it will appear before the actual statement, parse it first in next_statement(); then only parse for statements that are allowed to include the list.
2021-04-22LibSQL: Fix parsing of lists of common-table-expressionTimothy Flynn
Misread the graph: In the "WITH [RECURSIVE] common-table-expression" section, common-table-expression is actually a repeating list. This changes the parser to correctly parse this section as a list. Create a new AST node, CommonTableExpressionList, to store both this list and the boolean RECURSIVE attribute (because every statement that uses this list also includes the RECURSIVE attribute beforehand).
2021-04-22Everything: Move to SPDX license identifiers in all files.Brian Gianforcaro
SPDX License Identifiers are a more compact / standardized way of representing file license information. See: https://spdx.dev/resources/use/#identifiers This was done with the `ambr` search and replace tool. ambr --no-parent-ignore --key-from-file --rep-from-file key.txt rep.txt *
2021-04-21LibSQL: Rename TestSqlParser -> TestSqlStatementParserTimothy Flynn
A little bit clearer what is being tested now, since the expression parser also lives in its own file.
2021-04-21LibSQL: Parse DELETE statementTimothy Flynn
2021-04-21LibSQL: Parse most language expressionsTimothy Flynn
https://sqlite.org/lang_expr.html The entry point to using expressions, parse_expression(), is not used by SQL::Parser in this commit. But there's so much here that it's easier to grok as its own commit.
2021-04-21LibSQL: Add forwarding headerTimothy Flynn
SQL AST nodes will need to have other node types forward declared before using them.
2021-04-21LibSQL: Add Parser::consume_if helperTimothy Flynn
The following is a common (and soon to be *very* common) expression: if (match(token_type)) consume(); Using consume_if() makes this a bit simpler and makes it less likely to forget to invoke consume() after the match().
2021-04-21LibSQL: Lex string and blob literalsTimothy Flynn
Blob literals are the same as string literals except prefixed with an 'x' or 'X'.
2021-04-20LibSQL: Parse DROP TABLE statementTimothy Flynn
2021-04-20LibSQL: Add unit testing of the SQL parserTimothy Flynn
2021-04-20LibSQL: Create a very barebones SQL parserTimothy Flynn
This parser builds on the LibSQL lexer and currently only allows users to parse 'CREATE TABLE' statements.