mirror of
https://github.com/ElementsProject/lightning.git
synced 2024-11-19 01:43:36 +01:00
b327bd30c3
Without this, we have hardly any enforcement. This is why the schema mistake fixed in the previous patches weren't spotted immediately. The hard work was done by: ``` $ for f in lightning-*.json; do grep -v '^ "additionalProperties": false,' $f | bagto $f; done $ for f in lightning-*.json; do sed 's/"properties": {/"additionalProperties": false, "properties": {/' $f | bagto $f; done $ make fmt-schemas ``` Then checking where 'additionalProperties: true' had been turned to false (we deliberately use it in some places where there are if statements in the schema, or occasionally where there can be arbitrary fields). [Including doc/rpc-schema-draft.json update by Shahana] Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
306 lines
8.4 KiB
JSON
306 lines
8.4 KiB
JSON
{
|
|
"$schema": "../rpc-schema-draft.json",
|
|
"type": "object",
|
|
"added": "v23.02",
|
|
"rpc": "sql",
|
|
"title": "Command to do complex queries on list commands",
|
|
"description": [
|
|
"The **sql** RPC command runs the given query across a sqlite3 database created from various list commands.",
|
|
"",
|
|
"When tables are accessed, it calls the below commands, so it's no faster than any other local access (though it goes to great length to cache `listnodes` and `listchannels`) which then processes the results.",
|
|
"",
|
|
"It is, however faster for remote access if the result of the query is much smaller than the list commands would be.",
|
|
"",
|
|
"Note that you may need to use `-o` if you use queries which contain `=` (which make lightning-cli(1) default to keyword style)"
|
|
],
|
|
"request": {
|
|
"required": [
|
|
"query"
|
|
],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"query": {
|
|
"type": "string",
|
|
"description": [
|
|
"The standard sqlite3 query to run.",
|
|
"Note that queries like \"SELECT *\" are fragile, as columns will change across releases; see lightning-listsqlschemas(7)."
|
|
]
|
|
}
|
|
}
|
|
},
|
|
"response": {
|
|
"required": [
|
|
"rows"
|
|
],
|
|
"additionalProperties": false,
|
|
"properties": {
|
|
"rows": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "array"
|
|
}
|
|
},
|
|
"warning_db_failure": {
|
|
"type": "string",
|
|
"description": [
|
|
"A message if the database encounters an error partway through."
|
|
]
|
|
}
|
|
},
|
|
"pre_return_value_notes": [
|
|
"On success, an object containing **rows** is returned. It is an array. Each array entry contains an array of values, each an integer, real number, string or *null*, depending on the sqlite3 type.",
|
|
"",
|
|
"The object may contain **warning_db_failure** if the database fails partway through its operation."
|
|
]
|
|
},
|
|
"treatment_of_types": [
|
|
"The following types are supported in schemas, and this shows how they are presented in the database. This matters: a JSON boolean is represented as an integer in the database, so a query will return 0 or 1, not true or false.",
|
|
"",
|
|
"* *hex*. A hex string.",
|
|
" * JSON: a string",
|
|
" * sqlite3: BLOB",
|
|
"",
|
|
"* *hash*/*secret*/*pubkey*/*txid*: just like *hex*.",
|
|
"",
|
|
"* *msat*/*integer*/*u64*/*u32*/*u16*/*u8*. Normal numbers.",
|
|
" * JSON: an unsigned integer",
|
|
" * sqlite3: INTEGER",
|
|
"",
|
|
"* *boolean*. True or false.",
|
|
" * JSON: literal **true** or **false**",
|
|
" * sqlite3: INTEGER",
|
|
"",
|
|
"* *number*. A floating point number (used for times in some places).",
|
|
" * JSON: number",
|
|
" * sqlite3: REAL",
|
|
"",
|
|
"* *string*. Text.",
|
|
" * JSON: string",
|
|
" * sqlite3: TEXT",
|
|
"",
|
|
"* *short_channel_id*. A short-channel-id of form 1x2x3.",
|
|
" * JSON: string",
|
|
" * sqlite3: TEXT"
|
|
],
|
|
"permitted_sqlite3_functions": [
|
|
"Writing to the database is not permitted, and limits are placed on various other query parameters.",
|
|
"",
|
|
"Additionally, only the following functions are allowed:",
|
|
"",
|
|
"* abs",
|
|
"* avg",
|
|
"* coalesce",
|
|
"* count",
|
|
"* date",
|
|
"* datetime",
|
|
"* julianday",
|
|
"* hex",
|
|
"* quote",
|
|
"* length",
|
|
"* like",
|
|
"* lower",
|
|
"* upper",
|
|
"* min",
|
|
"* max",
|
|
"* strftime",
|
|
"* sum",
|
|
"* time",
|
|
"* timediff",
|
|
"* total",
|
|
"* unixepoch"
|
|
],
|
|
"tables": [
|
|
"Note that the first column of every table is a unique integer called `rowid`: this is used for related tables to refer to specific rows in their parent. sqlite3 usually has this as an implicit column, but we make it explicit as the implicit version is not allowed to be used as a foreign key.",
|
|
""
|
|
],
|
|
"errors": [
|
|
"On failure, an error is returned."
|
|
],
|
|
"author": [
|
|
"Rusty Russell <<rusty@rustcorp.com.au>> is mainly responsible."
|
|
],
|
|
"see_also": [
|
|
"lightning-listtransactions(7)",
|
|
"lightning-listchannels(7)",
|
|
"lightning-listpeers(7)",
|
|
"lightning-listnodes(7)",
|
|
"lightning-listforwards(7)"
|
|
],
|
|
"resources": [
|
|
"Main web site: <https://github.com/ElementsProject/lightning>"
|
|
],
|
|
"examples": [
|
|
{
|
|
"description": [
|
|
"A simple peers selection query:"
|
|
],
|
|
"request": {
|
|
"id": "example:sql#1",
|
|
"method": "sql",
|
|
"params": {
|
|
"query": "SELECT id FROM peers"
|
|
}
|
|
},
|
|
"response": {
|
|
"rows": [
|
|
[
|
|
"022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59"
|
|
]
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"description": [
|
|
"A statement containing `=` needs `-o` in shell:"
|
|
],
|
|
"request": {
|
|
"id": "example:sql#2",
|
|
"method": "sql",
|
|
"params": [
|
|
"SELECT nodeid,last_timestamp FROM nodes WHERE last_timestamp>=1669578892"
|
|
]
|
|
},
|
|
"response": {
|
|
"rows": [
|
|
[
|
|
"022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59",
|
|
1722303662
|
|
],
|
|
[
|
|
"0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518",
|
|
1722303662
|
|
],
|
|
[
|
|
"035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d",
|
|
1722303669
|
|
],
|
|
[
|
|
"0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199",
|
|
1722303669
|
|
]
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"description": [
|
|
"If you want to get specific nodeid values from the nodes table:"
|
|
],
|
|
"request": {
|
|
"id": "example:sql#3",
|
|
"method": "sql",
|
|
"params": [
|
|
"SELECT nodeid FROM nodes WHERE nodeid != x'035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d'"
|
|
]
|
|
},
|
|
"response": {
|
|
"rows": [
|
|
[
|
|
"022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59"
|
|
],
|
|
[
|
|
"0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518"
|
|
],
|
|
[
|
|
"0382ce59ebf18be7d84677c2e35f23294b9992ceca95491fcf8a56c6cb2d9de199"
|
|
]
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"description": [
|
|
"If you want to compare a BLOB column, `x'hex'` or `X'hex'` are needed:"
|
|
],
|
|
"request": {
|
|
"id": "example:sql#4",
|
|
"method": "sql",
|
|
"params": [
|
|
"SELECT nodeid FROM nodes WHERE nodeid IN (x'0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518', x'035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d')"
|
|
]
|
|
},
|
|
"response": {
|
|
"rows": [
|
|
[
|
|
"0266e4598d1d3c415f572a8488830b60f7e744ed9235eb0b1ba93283b315c03518"
|
|
],
|
|
[
|
|
"035d2b1192dfba134e10e540875d366ebc8bc353d5aa766b80c090b39c3a5d885d"
|
|
]
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"description": [
|
|
"Related tables are usually referenced by JOIN:"
|
|
],
|
|
"request": {
|
|
"id": "example:sql#5",
|
|
"method": "sql",
|
|
"params": [
|
|
"SELECT peer_id, short_channel_id, to_us_msat, total_msat, peerchannels_status.status FROM peerchannels INNER JOIN peerchannels_status ON peerchannels_status.row = peerchannels.rowid"
|
|
]
|
|
},
|
|
"response": {
|
|
"rows": [
|
|
[
|
|
"022d223620a359a47ff7f7ac447c85c46c923da53389221a0054c11c1e3ca31d59",
|
|
"109x1x1",
|
|
490503792,
|
|
1000000000,
|
|
"CHANNELD_NORMAL:Channel ready for use."
|
|
]
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"description": [
|
|
"Simple function usage, in this case COUNT. Strings inside arrays need \", and ' to protect them from the shell:"
|
|
],
|
|
"request": {
|
|
"id": "example:sql#6",
|
|
"method": "sql",
|
|
"params": [
|
|
"SELECT COUNT(*) FROM forwards"
|
|
]
|
|
},
|
|
"response": {
|
|
"rows": [
|
|
[
|
|
8
|
|
]
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"request": {
|
|
"id": "example:sql#7",
|
|
"method": "sql",
|
|
"params": [
|
|
"SELECT * from peerchannels_features"
|
|
]
|
|
},
|
|
"response": {
|
|
"rows": [
|
|
[
|
|
23,
|
|
18,
|
|
0,
|
|
"option_static_remotekey"
|
|
],
|
|
[
|
|
24,
|
|
18,
|
|
1,
|
|
"option_anchors_zero_fee_htlc_tx"
|
|
],
|
|
[
|
|
25,
|
|
18,
|
|
2,
|
|
"option_anchors"
|
|
]
|
|
]
|
|
}
|
|
}
|
|
]
|
|
}
|