===========
Crate Shell
===========

The crash shell provides a CLI for the Crate Server.

If the package was installed using `pip` the shell can be started by
invoking `crash` in a terminal.

`crash` by default will try to connect to `localhost:4200`. To connect to
another host use the `connect` command inside the shell or use the `--hosts`
argument when launching the shell.

When you connect to a server that is not reachable or whose hostname cannot be resolved
you will get an error::

    cr> connect 127.0.0.1:65535
    +------------------------+-----------+-----------+---------------------...-+
    | server_url             | node_name | connected | message                 |
    +------------------------+-----------+-----------+---------------------...-+
    | http://127.0.0.1:65535 | NULL      | FALSE     | Server not available... |
    +------------------------+-----------+-----------+---------------------...-+
    CONNECT ERROR

    cr> connect null.lol:4200
    +----------------------+-----------+-----------+---------------------...-+
    | server_url           | node_name | connected | message                 |
    +----------------------+-----------+-----------+---------------------...-+
    | http://null.lol:4200 | NULL      | FALSE     | Server not available... |
    +----------------------+-----------+-----------+---------------------...-+
    CONNECT ERROR


Successful connects will give you some information about the servers you connect to::

    cr> connect 127.0.0.1:44209
    +------------------------+-----------+-----------+---------+
    | server_url             | node_name | connected | message |
    +------------------------+-----------+-----------+---------+
    | http://127.0.0.1:44209 | crate     | TRUE      | OK      |
    +------------------------+-----------+-----------+---------+
    CONNECT OK

If you connect to more than one server, the command will succeed
if at least one server is reachable::

    cr> CONNECT 127.0.0.1:44209 null.lol:4295
    +------------------------+-----------+-----------+---------------------...-+
    | server_url             | node_name | connected | message                 |
    +------------------------+-----------+-----------+---------------------...-+
    | http://127.0.0.1:44209 | crate     | TRUE      | OK                      |
    | http://null.lol:4295   | NULL      | FALSE     | Server not available... |
    +------------------------+-----------+-----------+---------------------...-+
    CONNECT OK

Once the shell is connected, SQL statements can be executed simply by entering
them without any special arguments like this::

    cr> SELECT schema_name, table_name from information_schema.tables
    ... order by table_name
    +--------------------+-------------------+
    | schema_name        | table_name        |
    +--------------------+-------------------+
    | sys                | cluster           |
    | information_schema | columns           |
    | sys                | nodes             |
    | information_schema | routines          |
    | sys                | shards            |
    | information_schema | table_constraints |
    | information_schema | table_partitions  |
    | information_schema | tables            |
    +--------------------+-------------------+
    SELECT 8 rows in set (... sec)


Limitations
===========

Nested Objects and Arrays
-------------------------

While it is possible to select or filter by nested objects it is currently not
possible to insert them using crash. In order to do that the `Crate REST
endpoint`_ or a client library like `crate-python`_ has to be used.

The same also applies for arrays.

.. _`Crate REST endpoint`: https://crate.io/docs/current/sql/rest.html
.. _`crate-python`: https://pypi.python.org/pypi/crate/
