From f87c94c4116dda099b85d3c67e34a7465ec524e5 Mon Sep 17 00:00:00 2001 From: Galen Charlton Date: Sun, 2 Apr 2017 14:59:00 -0400 Subject: [PATCH] LP#1678638: technical documentation for qstore Technical documentation and sample stored queries for the open-ils.qstore service, written by Scott McKellar and copyright 2010 by the Equinox Open Library Initiative. Signed-off-by: Galen Charlton Signed-off-by: Mike Rylander --- docs/TechRef/qstore/README | 60 ++++ docs/TechRef/qstore/qstore.odt | Bin 0 -> 29471 bytes docs/TechRef/qstore/query_dump.sh | 9 + docs/TechRef/qstore/query_dump.sql | 393 +++++++++++++++++++++++++ docs/TechRef/qstore/query_schema.odt | Bin 0 -> 37048 bytes docs/TechRef/qstore/stored_queries.txt | 316 ++++++++++++++++++++ docs/TechRef/qstore/test_qstore.txt | 48 +++ 7 files changed, 826 insertions(+) create mode 100644 docs/TechRef/qstore/README create mode 100644 docs/TechRef/qstore/qstore.odt create mode 100755 docs/TechRef/qstore/query_dump.sh create mode 100644 docs/TechRef/qstore/query_dump.sql create mode 100644 docs/TechRef/qstore/query_schema.odt create mode 100644 docs/TechRef/qstore/stored_queries.txt create mode 100644 docs/TechRef/qstore/test_qstore.txt diff --git a/docs/TechRef/qstore/README b/docs/TechRef/qstore/README new file mode 100644 index 0000000000..a0209b1ee0 --- /dev/null +++ b/docs/TechRef/qstore/README @@ -0,0 +1,60 @@ +This archive includes documentation of the query schema and the +qstore server, along with some examples of stored queries. + +The query schema stores database queries in an abstract form +within the database itself. + +The qstore server loads queries from the query schema, constructs +the corresponding SQL, and executes the queries. + +Table of contents: + +qstore.odt + + Documentation of the qstore methods. + +query_dump.sh + + A shell script used to generate query_dump.sql, using the + pg_dump utility. I include this script mostly for my own + convenience in case I want to update this archive, but you may + find it useful to know exactly where the sql script came from. + (Note: after generating the sql script I manually edited it to + remove the loading of the datatype table.) + +query_dump.sql + + An sql script to install a collection of examples. The script + assumes that the query schema exists but has no data in it, + except for the datatypes in query.datatype as installed by + the installation script. + +query_schema.odt + + Documentation of the query schema. + +README + + You're looking at it. + +stored_queries.txt + + SQL queries generated from the queries loaded by query_dump.sql. + +test_qstore.txt + + Documentation of the test_qstore utility. The same documentation + appears in a comment block at the top of test_qstore.c. + +The sql script loads 25 example queries, with query ids in the range 1-25. +These are the queries I used to develop and test qstore. I used +the test_qstore utility to generate each query, and then pasted the +output into stored_queries.txt. + +The queries themselves are not particularly useful, and often don't +even make much sense from an application standpoint. They are just +exercises in the generation of syntax. In any case they all run +successfully within psql (except for query # 12, which features +an unsubstituted bind variable). + +Scott McKellar diff --git a/docs/TechRef/qstore/qstore.odt b/docs/TechRef/qstore/qstore.odt new file mode 100644 index 0000000000000000000000000000000000000000..2f416e861bc1214c27c89b3857adcb6bf31d639d GIT binary patch literal 29471 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 literal 0 HcmV?d00001 diff --git a/docs/TechRef/qstore/query_dump.sh b/docs/TechRef/qstore/query_dump.sh new file mode 100755 index 0000000000..f3e96760b8 --- /dev/null +++ b/docs/TechRef/qstore/query_dump.sh @@ -0,0 +1,9 @@ +pg_dump -n query \ + --file=query_dump.sql \ + --data-only \ + --schema=query \ + --disable-triggers \ + --host=localhost \ + --username=evergreen \ + --password \ + evergreen diff --git a/docs/TechRef/qstore/query_dump.sql b/docs/TechRef/qstore/query_dump.sql new file mode 100644 index 0000000000..4a7c062b0c --- /dev/null +++ b/docs/TechRef/qstore/query_dump.sql @@ -0,0 +1,393 @@ +-- +-- PostgreSQL database dump +-- + +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = off; +SET check_function_bodies = false; +SET client_min_messages = warning; +SET escape_string_warning = off; + +SET search_path = query, pg_catalog; + +-- +-- Name: case_branch_id_seq; Type: SEQUENCE SET; Schema: query; Owner: evergreen +-- + +SELECT pg_catalog.setval('case_branch_id_seq', 3, true); + + +-- +-- Name: expression_id_seq; Type: SEQUENCE SET; Schema: query; Owner: evergreen +-- + +SELECT pg_catalog.setval('expression_id_seq', 60, true); + + +-- +-- Name: from_relation_id_seq; Type: SEQUENCE SET; Schema: query; Owner: evergreen +-- + +SELECT pg_catalog.setval('from_relation_id_seq', 10, true); + + +-- +-- Name: function_param_def_id_seq; Type: SEQUENCE SET; Schema: query; Owner: evergreen +-- + +SELECT pg_catalog.setval('function_param_def_id_seq', 1, false); + + +-- +-- Name: function_sig_id_seq; Type: SEQUENCE SET; Schema: query; Owner: evergreen +-- + +SELECT pg_catalog.setval('function_sig_id_seq', 6, true); + + +-- +-- Name: order_by_item_id_seq; Type: SEQUENCE SET; Schema: query; Owner: evergreen +-- + +SELECT pg_catalog.setval('order_by_item_id_seq', 4, true); + + +-- +-- Name: query_sequence_id_seq; Type: SEQUENCE SET; Schema: query; Owner: evergreen +-- + +SELECT pg_catalog.setval('query_sequence_id_seq', 4, true); + + +-- +-- Name: record_column_id_seq; Type: SEQUENCE SET; Schema: query; Owner: evergreen +-- + +SELECT pg_catalog.setval('record_column_id_seq', 1, false); + + +-- +-- Name: select_item_id_seq; Type: SEQUENCE SET; Schema: query; Owner: evergreen +-- + +SELECT pg_catalog.setval('select_item_id_seq', 47, true); + + +-- +-- Name: stored_query_id_seq; Type: SEQUENCE SET; Schema: query; Owner: evergreen +-- + +SELECT pg_catalog.setval('stored_query_id_seq', 25, true); + + +-- +-- Name: subfield_id_seq; Type: SEQUENCE SET; Schema: query; Owner: evergreen +-- + +SELECT pg_catalog.setval('subfield_id_seq', 1, false); + + +-- +-- Data for Name: bind_variable; Type: TABLE DATA; Schema: query; Owner: evergreen +-- + +ALTER TABLE bind_variable DISABLE TRIGGER ALL; + +COPY bind_variable (name, type, description, default_value, label) FROM stdin; +shortname string org unit shortname "BR3" lib shortname +O'Leary string Ireland's kind of name "O'Bryan" nom d'Eire +ou number org unit \N lib +\. + + +ALTER TABLE bind_variable ENABLE TRIGGER ALL; + +-- +-- Data for Name: case_branch; Type: TABLE DATA; Schema: query; Owner: evergreen +-- + +ALTER TABLE case_branch DISABLE TRIGGER ALL; + +COPY case_branch (id, parent_expr, seq_no, condition, result) FROM stdin; +2 53 2 54 56 +3 53 3 \N 57 +1 53 1 58 55 +\. + + +ALTER TABLE case_branch ENABLE TRIGGER ALL; + +-- +-- Data for Name: expression; Type: TABLE DATA; Schema: query; Owner: evergreen +-- + +ALTER TABLE expression DISABLE TRIGGER ALL; + +COPY expression (id, type, parenthesize, parent_expr, seq_no, literal, table_alias, column_name, left_operand, operator, right_operand, function_id, subquery, cast_type, negate, bind_variable) FROM stdin; +1 xbool f \N 1 TRUE \N \N \N \N \N \N \N \N f \N +2 xcol f \N 1 \N aou id \N \N \N \N \N \N f \N +3 xcol f \N 1 \N aou name \N \N \N \N \N \N f \N +4 xcol f \N 1 \N aou shortname \N \N \N \N \N \N f \N +5 xcol f \N 1 \N aou parent_ou \N \N \N \N \N \N f \N +6 xnum f \N 1 3 \N \N \N \N \N \N \N \N f \N +7 xop f \N 1 \N \N \N 5 > 6 \N \N \N f \N +8 xop f \N 1 \N \N \N 2 = 6 \N \N \N f \N +9 xsubq f \N 1 \N \N \N \N \N \N \N 3 \N f \N +10 xcol f \N 1 \N aout id \N \N \N \N \N \N f \N +11 xin f \N 1 \N \N \N 10 \N \N \N 3 \N f \N +12 xcol f \N 1 \N aou ou_type \N \N \N \N \N \N f \N +13 xcol f \N 1 \N au id \N \N \N \N \N \N f \N +14 xop f \N 1 \N \N \N 13 = 12 \N \N \N f \N +15 xex f \N 1 \N \N \N \N \N \N \N 3 \N f \N +16 xcol f \N 1 \N aou \N \N \N \N \N \N \N f \N +17 xbind f \N 1 \N \N \N \N \N \N \N \N \N f ou +18 xop f \N 1 \N \N \N 2 = 17 \N \N \N f \N +19 xcol f \N 1 \N aou opac_visible \N \N \N \N \N \N f \N +20 xbind f \N 1 \N \N \N \N \N \N \N \N \N f shortname +21 xop f \N 1 \N \N \N 4 = 20 \N \N \N f \N +23 xcol f \N 1 \N aou email \N \N \N \N \N \N f \N +24 xcol f \N 1 \N aou holds_address \N \N \N \N \N \N f \N +27 xser f \N 1 \N \N \N \N OR \N \N \N \N f \N +22 xisnull f 27 1 \N \N \N 5 \N \N \N \N \N f \N +25 xisnull f 27 2 \N \N \N 23 \N \N \N \N \N f \N +26 xisnull f 27 3 \N \N \N 24 \N \N \N \N \N f \N +32 xin f \N 1 \N \N \N 5 \N \N \N \N \N f \N +29 xnum f 32 1 1 \N \N \N \N \N \N \N \N f \N +30 xnum f 32 2 3 \N \N \N \N \N \N \N \N f \N +31 xnum f 32 3 6 \N \N \N \N \N \N \N \N f \N +33 xfunc f \N 1 \N \N \N \N \N \N 1 \N \N f \N +34 xcol f 33 1 \N aou name \N \N \N \N \N \N f \N +35 xop f \N 1 \N \N \N 2 = 6 \N \N \N f \N +36 xfunc f \N 1 \N \N name \N \N \N 2 \N \N f \N +37 xcol f 36 1 \N aou id \N \N \N \N \N \N f \N +38 xbet f \N 1 \N \N \N 5 \N \N \N \N \N f \N +39 xnum f 38 1 1 \N \N \N \N \N \N \N \N f \N +40 xnum f 38 2 4 \N \N \N \N \N \N \N \N f \N +41 xfunc f \N 1 \N \N \N \N \N \N 3 \N \N f \N +42 xstr f 41 1 DOW \N \N \N \N \N \N \N \N f \N +43 xcol f 41 2 \N au create_date \N \N \N \N \N \N f \N +44 xfunc f \N 1 \N \N \N \N \N \N 4 \N \N f \N +45 xnum f 44 1 1 \N \N \N \N \N \N \N \N f \N +46 xfunc f \N 1 \N \N \N \N \N \N 1 \N \N f \N +47 xstr f 46 1 goober \N \N \N \N \N \N \N \N f \N +48 xcol f \N 1 \N \N \N \N \N \N \N \N \N f \N +49 xfunc f \N 1 \N \N \N \N \N \N 5 \N \N f \N +50 xfunc f \N 1 \N \N \N \N \N \N 6 \N \N f \N +51 xstr f 50 1 both \N \N \N \N \N \N \N \N f \N +52 xcol f 50 2 \N au usrname \N \N \N \N \N \N f \N +54 xnum f \N 1 2 \N \N \N \N \N \N \N \N f \N +55 xstr f \N 1 First \N \N \N \N \N \N \N \N f \N +56 xstr f \N 1 Second \N \N \N \N \N \N \N \N f \N +57 xstr f \N 1 Other \N \N \N \N \N \N \N \N f \N +53 xcase f \N 1 \N \N \N 2 \N \N \N \N \N f \N +58 xnum f \N 1 1 \N \N \N \N \N \N \N \N f \N +59 xcast f \N 1 \N \N \N 2 \N \N \N \N 13 f \N +60 xnum f \N 1 100 \N \N \N \N \N \N \N \N f \N +\. + + +ALTER TABLE expression ENABLE TRIGGER ALL; + +-- +-- Data for Name: from_relation; Type: TABLE DATA; Schema: query; Owner: evergreen +-- + +ALTER TABLE from_relation DISABLE TRIGGER ALL; + +COPY from_relation (id, type, table_name, class_name, subquery, function_call, table_alias, parent_relation, seq_no, join_type, on_clause) FROM stdin; +1 RELATION actor.org_unit aou \N \N aou \N 1 \N \N +2 RELATION actor.org_unit_type aout \N \N aout 1 1 INNER 1 +3 RELATION actor.org_unit aou \N \N aou \N 1 \N \N +4 RELATION actor.org_unit_type aout \N \N aout \N 1 \N \N +5 SUBQUERY \N \N 3 \N aou \N 1 \N \N +6 RELATION actor.usr au \N \N au \N 1 \N \N +7 SUBQUERY \N \N 3 \N aou 6 1 INNER 14 +8 RELATION \N aou \N \N aou \N 1 \N \N +9 RELATION actor.usr au \N \N au \N 1 \N \N +10 FUNCTION \N \N \N 46 \N \N 1 \N \N +\. + + +ALTER TABLE from_relation ENABLE TRIGGER ALL; + +-- +-- Data for Name: function_param_def; Type: TABLE DATA; Schema: query; Owner: evergreen +-- + +ALTER TABLE function_param_def DISABLE TRIGGER ALL; + +COPY function_param_def (id, function_id, seq_no, datatype) FROM stdin; +\. + + +ALTER TABLE function_param_def ENABLE TRIGGER ALL; + +-- +-- Data for Name: function_sig; Type: TABLE DATA; Schema: query; Owner: evergreen +-- + +ALTER TABLE function_sig DISABLE TRIGGER ALL; + +COPY function_sig (id, function_name, return_type, is_aggregate) FROM stdin; +1 upper 13 f +2 actor.org_unit_ancestors \N f +4 COUNT \N t +5 CURRENT_DATE 19 f +3 EXTRACT 7 f +6 TRIM 13 f +\. + + +ALTER TABLE function_sig ENABLE TRIGGER ALL; + +-- +-- Data for Name: order_by_item; Type: TABLE DATA; Schema: query; Owner: evergreen +-- + +ALTER TABLE order_by_item DISABLE TRIGGER ALL; + +COPY order_by_item (id, stored_query, seq_no, expression) FROM stdin; +3 10 1 5 +4 10 2 2 +\. + + +ALTER TABLE order_by_item ENABLE TRIGGER ALL; + +-- +-- Data for Name: query_sequence; Type: TABLE DATA; Schema: query; Owner: evergreen +-- + +ALTER TABLE query_sequence DISABLE TRIGGER ALL; + +COPY query_sequence (id, parent_query, seq_no, child_query) FROM stdin; +3 2 1 1 +4 2 2 1 +\. + + +ALTER TABLE query_sequence ENABLE TRIGGER ALL; + +-- +-- Data for Name: record_column; Type: TABLE DATA; Schema: query; Owner: evergreen +-- + +ALTER TABLE record_column DISABLE TRIGGER ALL; + +COPY record_column (id, from_relation, seq_no, column_name, column_type) FROM stdin; +\. + + +ALTER TABLE record_column ENABLE TRIGGER ALL; + +-- +-- Data for Name: select_item; Type: TABLE DATA; Schema: query; Owner: evergreen +-- + +ALTER TABLE select_item DISABLE TRIGGER ALL; + +COPY select_item (id, stored_query, seq_no, expression, column_alias, grouped_by) FROM stdin; +1 1 1 2 id f +2 1 2 3 name f +3 1 3 4 short_name f +6 4 2 9 \N f +5 4 1 10 \N f +7 5 1 10 \N f +8 6 1 12 \N f +4 3 1 12 \N f +9 7 1 12 goober f +10 8 1 10 \N f +11 9 1 16 \N f +12 10 1 2 id f +13 10 2 5 parent f +14 10 3 4 short_name f +15 11 1 2 id f +16 12 1 2 \N f +17 12 2 3 \N f +18 12 3 4 \N f +19 12 4 19 \N f +20 12 5 5 \N f +21 13 1 2 \N f +22 13 2 3 \N f +23 13 3 4 \N f +24 13 4 19 \N f +25 13 5 5 \N f +26 14 1 2 \N f +27 15 1 2 id f +28 16 1 2 id f +29 17 1 2 id f +30 17 2 3 name f +31 17 3 33 name f +32 18 1 2 id f +33 18 2 3 id f +34 18 4 36 root_name f +35 19 1 2 id f +36 20 1 13 id f +37 20 2 41 create_day f +39 21 2 44 how_many f +38 21 1 5 parent t +40 23 1 48 \N f +41 22 1 44 how_many f +42 22 2 5 parent t +43 20 3 49 today f +45 24 2 53 Branch sequence f +46 24 1 2 id f +47 25 1 59 cast_text f +\. + + +ALTER TABLE select_item ENABLE TRIGGER ALL; + +-- +-- Data for Name: stored_query; Type: TABLE DATA; Schema: query; Owner: evergreen +-- + +ALTER TABLE stored_query DISABLE TRIGGER ALL; + +COPY stored_query (id, type, use_all, use_distinct, from_clause, where_clause, having_clause, limit_count, offset_count) FROM stdin; +1 SELECT f f 1 7 \N \N \N +2 UNION f f \N \N \N \N \N +3 SELECT f f 3 8 \N \N \N +4 SELECT f f 4 \N \N \N \N +5 SELECT f f 4 11 \N \N \N +6 SELECT f f 5 \N \N \N \N +7 SELECT f f 6 \N \N \N \N +8 SELECT f f 4 15 \N \N \N +9 SELECT f f 3 \N \N \N \N +10 SELECT f f 3 \N \N \N \N +13 SELECT f f 8 21 \N \N \N +14 SELECT f f 3 22 \N \N \N +15 SELECT f f 3 27 \N \N \N +16 SELECT f f 3 32 \N \N \N +17 SELECT f f 3 32 \N \N \N +18 SELECT f f 3 35 \N \N \N +19 SELECT f f 3 38 \N \N \N +20 SELECT f f 9 \N \N \N \N +21 SELECT f f 3 \N \N \N \N +23 SELECT f f 10 \N \N \N \N +22 SELECT f f 3 \N \N \N \N +24 SELECT f f 3 \N \N \N \N +25 SELECT f f 3 \N \N \N \N +12 SELECT f f 8 18 \N \N \N +11 SELECT f f 8 \N \N 60 58 +\. + + +ALTER TABLE stored_query ENABLE TRIGGER ALL; + +-- +-- Data for Name: subfield; Type: TABLE DATA; Schema: query; Owner: evergreen +-- + +ALTER TABLE subfield DISABLE TRIGGER ALL; + +COPY subfield (id, composite_type, seq_no, subfield_type) FROM stdin; +\. + + +ALTER TABLE subfield ENABLE TRIGGER ALL; + +-- +-- PostgreSQL database dump complete +-- + diff --git a/docs/TechRef/qstore/query_schema.odt b/docs/TechRef/qstore/query_schema.odt new file mode 100644 index 0000000000000000000000000000000000000000..823fa80709be07d4ef08e0fa3de039f1ba670d54 GIT binary patch literal 37048 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 3; + +------------------------------------------------------------ +2: UNION + +SELECT + "aou".id AS "id", + "aou".name AS "name", + "aou".shortname AS "short_name" +FROM + actor.org_unit AS "aou" + INNER JOIN actor.org_unit_type AS "aout" + ON TRUE +WHERE + "aou".parent_ou > 3 +UNION +SELECT + "aou".id AS "id", + "aou".name AS "name", + "aou".shortname AS "short_name" +FROM + actor.org_unit AS "aou" + INNER JOIN actor.org_unit_type AS "aout" + ON TRUE +WHERE + "aou".parent_ou > 3; + +----------------------------------------------------------- +3: Simple query (to be used elsewhere as a subquery) + +SELECT + "aou".ou_type +FROM + actor.org_unit AS "aou" +WHERE + "aou".id = 3; + +------------------------------------------------------------- +4: SELECTing a subquery + +SELECT + "aout".id, + ( + SELECT + "aou".ou_type + FROM + actor.org_unit AS "aou" + WHERE + "aou".id = 3 + ) +FROM + actor.org_unit_type AS "aout"; + +-------------------------------------------------------------- +5: IN clause with a subquery + +SELECT + "aout".id +FROM + actor.org_unit_type AS "aout" +WHERE + "aout".id IN ( + SELECT + "aou".ou_type + FROM + actor.org_unit AS "aou" + WHERE + "aou".id = 3 + ); + +--------------------------------------------------------------- +6: Subquery in the FROM clause + +SELECT + "aou".ou_type +FROM + ( + SELECT + "aou".ou_type + FROM + actor.org_unit AS "aou" + WHERE + "aou".id = 3 + ) AS "aou"; + +---------------------------------------------------------------- +7: JOINing to a subquery + +SELECT + "aou".ou_type AS "goober" +FROM + actor.usr AS "au" + INNER JOIN ( + SELECT + "aou".ou_type + FROM + actor.org_unit AS "aou" + WHERE + "aou".id = 3 + ) AS "aou" + ON "au".id = "aou".ou_type; + +---------------------------------------------------------------- +8: EXISTS clause + +SELECT + "aout".id +FROM + actor.org_unit_type AS "aout" +WHERE + EXISTS ( + SELECT + "aou".ou_type + FROM + actor.org_unit AS "aou" + WHERE + "aou".id = 3 + ); + +---------------------------------------------------------------- +9: SELECTing a wild card + +SELECT + "aou".* +FROM + actor.org_unit AS "aou"; + +------------------------------------------------------------------ +10: ORDER BY clause + +SELECT + "aou".id AS "id", + "aou".parent_ou AS "parent", + "aou".shortname AS "short_name" +FROM + actor.org_unit AS "aou" +ORDER BY + "aou".parent_ou, + "aou".id; + +-------------------------------------------------------------------- +11: Looking up table name in IDL + +SELECT + "aou".id AS "id" +FROM + actor.org_unit AS "aou"; + +-------------------------------------------------------------------- +12: numeric bind variable (also works if default value is available) + +SELECT + "aou".id, + "aou".name, + "aou".shortname, + "aou".opac_visible, + "aou".parent_ou +FROM + actor.org_unit AS "aou" +WHERE + "aou".id = :ou; + +-------------------------------------------------------------------- +13: string bind variable (using default value 'BRE' for :shortname) + +SELECT + "aou".id, + "aou".name, + "aou".shortname, + "aou".opac_visible, + "aou".parent_ou +FROM + actor.org_unit AS "aou" +WHERE + "aou".shortname = 'BR3'; + +-------------------------------------------------------------------- +14: IS NULL expression + +SELECT + "aou".id +FROM + actor.org_unit AS "aou" +WHERE + "aou".parent_ou IS NULL; + +-------------------------------------------------------------------- +15: Series expression (chain of ORs) + +SELECT + "aou".id AS "id" +FROM + actor.org_unit AS "aou" +WHERE + "aou".parent_ou IS NULL + OR "aou".email IS NULL + OR "aou".holds_address IS NULL; + +-------------------------------------------------------------------- +16: IN list + +SELECT + "aou".id AS "id" +FROM + actor.org_unit AS "aou" +WHERE + "aou".parent_ou IN (1, 3, 6); + +-------------------------------------------------------------------- +17: Function call + +SELECT + "aou".id AS "id", + "aou".name AS "name", + upper("aou".name) AS "name" +FROM + actor.org_unit AS "aou" +WHERE + "aou".parent_ou IN (1, 3, 6); + +-------------------------------------------------------------------- +18: Function call with subfield + +SELECT + "aou".id AS "id", + "aou".name AS "id", + (actor.org_unit_ancestors("aou".id))."name" AS "root_name" +FROM + actor.org_unit AS "aou" +WHERE + "aou".id = 3; + +-------------------------------------------------------------------- +19: BETWEEN expression + +SELECT + "aou".id AS "id" +FROM + actor.org_unit AS "aou" +WHERE + "aou".parent_ou BETWEEN 1 AND 4; + +-------------------------------------------------------------------- +20: EXTRACT and CURRENT_DATE functions + +SELECT + "au".id AS "id", + EXTRACT(DOW FROM "au".create_date) AS "create_day", + CURRENT_DATE AS "today" +FROM + actor.usr AS "au"; + +-------------------------------------------------------------------- +21: GROUP BY, with aggregate function last + +SELECT + "aou".parent_ou AS "parent", + COUNT(1) AS "how_many" +FROM + actor.org_unit AS "aou" +GROUP BY 1; + +-------------------------------------------------------------------- +22: GROUP BY, with aggregate function first + +SELECT + COUNT(1) AS "how_many", + "aou".parent_ou AS "parent" +FROM + actor.org_unit AS "aou" +GROUP BY 2; + +-------------------------------------------------------------------- +23: Function in the FROM clause + +SELECT + * +FROM + upper('goober'); + +-------------------------------------------------------------------- +24: CASE expression + +SELECT + "aou".id AS "id", + CASE "aou".id + WHEN 1 + THEN 'First' + WHEN 2 + THEN 'Second' + ELSE + 'Other' + END AS "Branch sequence" +FROM + actor.org_unit AS "aou"; + +-------------------------------------------------------------------- +25: CAST expression + +SELECT + CAST ("aou".id AS TEXT) AS "cast_text" +FROM + actor.org_unit AS "aou"; diff --git a/docs/TechRef/qstore/test_qstore.txt b/docs/TechRef/qstore/test_qstore.txt new file mode 100644 index 0000000000..6210767ad4 --- /dev/null +++ b/docs/TechRef/qstore/test_qstore.txt @@ -0,0 +1,48 @@ +test_qstore + +This command-line utility exercises most of the code used in the qstore server, but +without the complications of sending and receiving OSRF messages. + +Synopsis: + +test_qstore [options] query_id + +Query_id is the id of a row in the query.stored_query table, defining a stored query. + +The program reads the specified row in query.stored_query, along with associated rows +in other tables, and displays the corresponding query as an SQL command. Optionally it +may execute the query, display the column names of the query result, and/or display the +bind variables. + +In order to connect to the database, test_qstore uses various connection parameters +that may be specified on the command line. Any connection parameter not specified +reverts to a plausible default. + +The database password may be read from a specified file or entered from the keyboard. + +Options: + +-b Boolean; Display the name of any bind variables, and their default values. + +-D Specifies the name of the database driver; defaults to "pgsql". + +-c Boolean; display column names of the query results, as assigned by PostgreSQL. + +-d Specifies the database name; defaults to "evergreen". + +-h Specifies the hostname of the database; defaults to "localhost". + +-i Specifies the name of the IDL file; defaults to "/openils/conf/fm_IDL.xml". + +-p Specifies the port number of the database; defaults to 5432. + +-u Specifies the database user name; defaults to "evergreen". + +-v Boolean; Run in verbose mode, spewing various detailed messages. This option is not + likely to be useful unless you are troubleshooting the code that loads the stored + query. + +-w Specifies the name of a file containing the database password (no default). + +-x Boolean: Execute the query and display the results. + -- 2.43.2