GithubHelp home page GithubHelp logo

gluesql / gluesql Goto Github PK

View Code? Open in Web Editor NEW
2.6K 35.0 208.0 4.64 MB

GlueSQL is quite sticky. It attaches to anywhere.

Home Page: https://gluesql.org/docs

License: Apache License 2.0

Rust 99.42% JavaScript 0.14% HTML 0.10% Python 0.34%
rust sql webassembly websql database nosql schemaless storage

gluesql's Issues

Testdata from file and/or stdin

Love this project.
Have a lot of sql database dumps I want to have for verification
A separate bin project can't refer to locally libraries.

But a rough approach is to introduce tests for loading sql from a file instead of inline strings

Give me a hint where to start in my downloaded glusql-main

ORDER BY support

Hej,

Sorry for all issues. Not complaining. Love the SQL and in Rust!

But browsing into my swedish testdabase on recipes and it's categories
the output is not ordered on column 2.

(We have the same sort order in Swedish as in any Latin-1 countries)

"select * from category where categoryid > 50 order by 2;"
53 "Fläskkött" ""
54 "Vegetarisk" ""
55 "Pastej" ""
56 "Gratäng" ""
57 "Finskt" ""
58 "Kassler" ""

Apply trait alias to optional store traits

Though some custom storages don't need ALTER TABLE syntaxes, they still need to add it.

impl AlterTable for CustomStorage {}

It looks unnecessary but required.

In execute.rs,

pub fn execute<T: 'static + Debug, U: Store<T> + StoreMut<T> + AlterTable>(
...
...

If trait alias feature ships on stable Rust then, we can improve the code above like this.

#[cfg(feature = "alter-table")]
trait Storage<T: 'static + Debug> = Store<T> + StoreMut<T> + AlterTable>
#[cfg(not(feature = "alter-table"))]
trait Storage<T: 'static + Debug> = Store<T> + StoreMut<T>>

pub fn execute<T: 'static + Debug, U: Storage>(
...
...

It is blocked by this issue: rust-lang/rust#41517
Looking forward to see trait alias in stable Rust.

Inserting multiple values

Currently, GlueSQL support only single value insertion for INSERT query.

INSERT INTO TableA VALUES (100, "Foo");

This issue is for supporting multiple value insertion using single INSERT query, like this below:

INSERT INTO TableA VALUES (100, "Hello"), (200, "World"), (300, "GOOOOOD");

WebAssembly build

After finishing #7
Make WebAssembly build and test using MemoryStorage.

It's required to make JavaScript interface. 🔢

CLI interface

Is a command line interface planned? I liked playing around with the web interface but there doesn't seem to be something equivalent for the terminal?

ALTER TABLE support

There exists two store traits: Store and StoreMut.

Plan is adding new Alter store trait, but this time, Alter trait will be optional.

Provide 3 SQL statements

  • ADD COLUMN
  • DROP COLUMN
  • RENAME COLUMN

Add Evaluated enum doc comments

#59

enum Evaluated can be quite confusing for newcomers, it's required to have some explanation of this.
Use source code doc comments feature.

Then, someone wants to contributor can see that in source code or by cargo doc --document-private-items.

'SingleQuotedString' is not accepted in inserts

Problem with insert of text.

Insert into tableA values ("WORKS BUT NOT STANDARD" , 'STANDARD BUT IS NOT ACCEPTED');

Most exports from other databases uses SingleQuotedString. More Standard SQL.

Seems like expressions with SingleQuotedString works

Getting SELECT projection aliases

Related to #80 - due to long threads, it's hard to recognize what exact task is, so let's use this issue.

input:

SELECT a, b AS foo, SUM(id) AS bar FROM TableA;

output:

vec!["a", "foo", "bar"]

This issue is adding a new function get_projection_aliases to src/parse.rs which takes sqlparser::ast::Query reference and return column aliases, Vec<String>

fn get_projection_aliases(query: &sqlparser::ast::Query) -> Vec<String>

Row-unreachable occurs

CREATE TABLE Test (id INTEGER, name INTEGER NULL);

INSERT INTO Test VALUES (100);

Then error occurs on insert query.

{"Row":"Unreachable"}

It is reachable but unreachable!

Add filter.rs integration test cases

related to #56

There doesn't exist place for adding conditional statement tests cases which are used in WHERE clause.
It's obviously better to have, let's add src/tests/filter.rs, like blend.

filter.rs check_expr function is stateless, so we can easily add test cases to reach all possible branches.

It would be good to start from renaming src/tests/between.rs to src/tests/filter.rs.

MVCC Transactions Support

I can only imagine how large a feature this is but I wanted to put it out there. MVCC Transaction support would empower developer's to prevent reading and writing inconsistent data to gluesql.

I'm guessing however that this is currently blocked on Sled's lack of transactional scan support inside TransactionTrees(?)

Plus(+) & Minus(-) signs support in WHERE

Following WHERE clauses are not supported now.

SELECT * FROM TableA WHERE +1 = 1;
SELECT * FROM TableA WHERE -1 = -1;

Proper place to add test cases would be in src/tests/filter.rs.

SELECT 1 FROM Test; not working

SELECT 1 + 1 FROM Test;

Above works, but...

SELECT 1 FROM Test;

This doesn't work with this error [Blend Error] "FieldDefinitionNotSupported"

RIGHT [OUTER] JOIN support

For now, GlueSQL supports 2 join types, INNER JOIN and LEFT OUTER JOIN.
RIGHT OUTER JOIN Implementation can be a bit more tough, but all modifications required to change is in a single file, 198 lines of codes.

It can be a sort of quite fun programming quiz.

Add more types to Value

pub enum Value {
    I64(i64),
    String(String),
}

Now GlueSQL only has 2 value types.
Let's add two more types,

  • Bool(bool)
  • Real(f64)

Then It looks enough for the first release.

think about adding github releases

It would be very nice for people like me who would like to be notified about version updates, without necessarily having to be notified about issues and PRs 🥰

MemoryStorage support

Currently the only supported storage is SledStorage.
But it can't be built for Web.

So, make the MemoryStorage and use it for WebAssembly build.

Arithmetic operator support

For example,
UPDATE TableA SET v1 = v1 + 1 is not supported because current GlueSQL does not support this arithmetic operator.
Let's make it.

Replace "Context" data structure from LinkedList to Vector

GlueSQL fetches data and convert each row into struct named Context.

FilterContext contains the row from join and nested select.
BlendContext does similar role but it does not need to include nested selected row on where clause.

Currently linked list is used but it's better to replace those into vector.
Linked list assumes that total number of items are not predictable, but in this case, it is not.
It is certainly pre-calculated from AST made from sql query.

So, it means it's possible to specify the length of context at first, like using this.. Vec::with_capacity(10).

But let's start with simply replacing data structure, from linked list to vector.
At this point, it would be good to start with using im-rc

This is not urgent issue, but it should be done in... some day.

INSERT with more values is accepted

CREATE TABLE Test (id INTEGER);
INSERT INTO Test VALUES (100, 200);

below insertion query should report an error but it is accepted.

Current Row struct cares lack of values or columns but not handling more values properly.

NULLABLE field support

NULLABLE should be supported in the first release.
👍

Allow Nullable keyword in CREATE and apply to Value and join works.

Fix `blend.rs` to support Join

  1. Current blend.rs does not support Join queries.
    It only takes the first node of BlendContext linked list, but it should handle all properly.

  2. And I also need to some kind of macro for helping value comparison test.
    There's an example in basic.rs.

let res = helper.run("select id from test").expect("select");
assert_eq!(res, Payload::Select(vec![Row(vec![Value::I64(1)])]));

Make a macro to shorten and readify this: Payload::Select(vec![Row(vec![Value::I64(1)])]).

Enhance programmer methods on Select result

Have made some programming around select.
It's a little bit complicated and column names is missing I think.

In order to make glusql competitive to JS, sqlite, PHP and more
I think something like the following is required
Some kind of Displayselected instead od Selected
The outermost SELECT could get this result.
But of course not for an INSERT .. SELECT ...

  1. Column names
  2. Simplified enums on cell values

A: Usage is: iter over colnames in order to display them in order
B: Usage on whole row is: 'simple' item for all column values
C: Usage on columns in a row

let cell = arow[colname.iter().position(|&x| x == "THECOLNAME")

Below is some pseudo Rust for data definitions

All is immutable

enum DisplayCell
{
Str {value:&str},
Int {value:i64},
Float {value:f64},
Empty, // null
Bool {value:&str} // 'true', 'false' or 1,0 for language independancy
}
struct DisplayRow
{
arow:Vec
}

struct Displayselected
{
headers:Vec<&str>,
rows:Vec
}

Column names in Select results

Have made some programming around select in Rust
It's a little bit complicated and column names is missing I think.

In order to make gluesql competitive to (sqlite and mysql and more ) using (JS, C/C++, PHP, Java and more)
I think something like the following is required for Rust at least
(and C using gluesql. wow!)

  1. Array of column names on payload

A: Usage is: iter over colnames in order to display them in order
B: Usage on whole row is: 'simple' item for all column values
C: Usage on columns in a row
I think it's important to get a value for a named column in a 'active row'
(From my own experience)

let value = get_value_from_column_named(colnam, some_context);

Fail to find table alias to blend in SELECT + JOIN query

SELECT user.* FROM item LEFT JOIN user ON user.id = item.user_id;
SELECT * FROM item LEFT JOIN user ON user.id = item.user_id;

Above 2 queries work but,

SELECT Item.* FROM item LEFT JOIN user ON user.id = item.user_id;

This one fails.
[ERR] { "Blend": { "TableNotFound": "item" } }
Blend failed to find table alias.

Single quoted string is not accepted

INSERT INTO TableA VALUES ("asdf");

INSERT INTO TableA VALUES ('asdf');

"asdf" works but 'asdf' is not accepted which should be not a problem at all.

SELECT foo AS bar ... support,

mentioned in #80

SELECT id AS SOMEALIASCOLUMNNAME, num FROM Test

Current blend.rs is not handling AS.
Simple fix, blend does not need to work on AS at all, just ignore AS and simply evaluate column expression.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.