From 95dc4a1a501ca72135c558e9530716ed11a3464e Mon Sep 17 00:00:00 2001 From: Todd Gruben Date: Mon, 13 Sep 2021 14:02:50 -0500 Subject: [PATCH 01/15] basic looker connection tests pass sql1 pass through works --- go.mod | 2 +- pg/lookerToFeaturebase.md | 652 ++++++++++++++++++++++++++++++++++++ pg/lookerToPostgres.md | 677 ++++++++++++++++++++++++++++++++++++++ pg/message/io.go | 2 + pg/message/message.go | 181 +++++++++- pg/protocol.go | 543 +++++++++++++++++++++++++++++- pg/query.go | 1 + pg/server.go | 5 + server/pg.go | 49 ++- sql/mapper.go | 6 + 10 files changed, 2098 insertions(+), 20 deletions(-) create mode 100644 pg/lookerToFeaturebase.md create mode 100644 pg/lookerToPostgres.md diff --git a/go.mod b/go.mod index e590bdd1b..d64a32730 100644 --- a/go.mod +++ b/go.mod @@ -54,7 +54,7 @@ require ( golang.org/x/sys v0.0.0-20210510120138-977fb7262007 // indirect golang.org/x/text v0.3.5 // indirect google.golang.org/grpc v1.28.0 - gopkg.in/yaml.v2 v2.3.0 // indirect + gopkg.in/yaml.v2 v2.3.0 modernc.org/mathutil v1.0.0 modernc.org/strutil v1.0.0 sigs.k8s.io/yaml v1.2.0 // indirect diff --git a/pg/lookerToFeaturebase.md b/pg/lookerToFeaturebase.md new file mode 100644 index 000000000..cd7c82b9b --- /dev/null +++ b/pg/lookerToFeaturebase.md @@ -0,0 +1,652 @@ +```mermaid +sequenceDiagram + +participant 213070643358480 as c0 +participant 213070643358482 as c1 +participant 213070643358484 as c2 +participant 213070643358486 as c3 +participant 213070643358488 as c4 +participant 213070643358490 as c5 +participant 213070643358492 as c6 +participant 213070643358494 as c7 +participant 213070643358496 as c8 +participant 213070643358498 as c9 +participant 213070643358500 as c10 +participant 213070643358502 as c11 +213070643358480->>server:+SSL REQUEST +server-->>213070643358480:-SSL BACKEND ANSWER: N +213070643358480->>server:+STARTUP MESSAGE version: 3 database=trait_store extra_float_digits=2 TimeZone=GMT client_encoding=UTF8 user=docker DateStyle=ISO +server-->>213070643358480:-AUTHENTIFICATION REQUEST code=0 (SUCCESS) +server-->>213070643358480:-PARAMETER STATUS name='application_name', value='' +server-->>213070643358480:-PARAMETER STATUS name='client_encoding', value='UTF8' +server-->>213070643358480:-PARAMETER STATUS name='DateStyle', value='ISO, MDY' +server-->>213070643358480:-PARAMETER STATUS name='integer_datetimes', value='on' +server-->>213070643358480:-PARAMETER STATUS name='IntervalStyle', value='postgres' +server-->>213070643358480:-PARAMETER STATUS name='is_superuser', value='on' +server-->>213070643358480:-PARAMETER STATUS name='server_encoding', value='UTF8' +server-->>213070643358480:-PARAMETER STATUS name='server_version', value='13.0.0' +server-->>213070643358480:-PARAMETER STATUS name='session_authorization', value='docker' +server-->>213070643358480:-PARAMETER STATUS name='standard_conforming_strings', value='on' +server-->>213070643358480:-PARAMETER STATUS name='TimeZone', value='GMT' +server-->>213070643358480:-BACKEND KEY DATA pid=1459324827, key=1506254533 +server-->>213070643358480:-READY FOR QUERY type= +213070643358480->>server:+PARSE name='', num_params=0, params_type=, query=SET extra_float_digits = 3 +213070643358480->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358480->>server:+EXECUTE name='', nb_rows=1 +213070643358480->>server:+SYNC +server-->>213070643358480:-PARSE COMPLETE +server-->>213070643358480:-BIND COMPLETE +server-->>213070643358480:-COMMAND COMPLETE command='SET' +server-->>213070643358480:-READY FOR QUERY type= +213070643358480->>server:+PARSE name='', num_params=0, params_type=, query=SET application_name = 'PostgreSQL JDBC Driver' +213070643358480->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358480->>server:+EXECUTE name='', nb_rows=1 +213070643358480->>server:+SYNC +server-->>213070643358480:-PARSE COMPLETE +server-->>213070643358480:-BIND COMPLETE +server-->>213070643358480:-PARAMETER STATUS name='application_name', value='PostgreSQL JDBC Driver' +server-->>213070643358480:-COMMAND COMPLETE command='SET' +server-->>213070643358480:-READY FOR QUERY type= +213070643358480->>server:+PARSE name='', num_params=0, params_type=, query= +213070643358480->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358480->>server:+DESCRIBE kind='P', name='' +213070643358480->>server:+EXECUTE name='', nb_rows=1 +213070643358480->>server:+SYNC +server-->>213070643358480:-PARSE COMPLETE +server-->>213070643358480:-BIND COMPLETE +server-->>213070643358480:-NO DATA +server-->>213070643358480:-EMPTY QUERY RESPONSE +server-->>213070643358480:-READY FOR QUERY type= +213070643358480->>server:+DISCONNECT +213070643358482->>server:+SSL REQUEST +server-->>213070643358482:-SSL BACKEND ANSWER: N +213070643358482->>server:+STARTUP MESSAGE version: 3 database=trait_store extra_float_digits=2 TimeZone=GMT client_encoding=UTF8 user=docker DateStyle=ISO +server-->>213070643358482:-AUTHENTIFICATION REQUEST code=0 (SUCCESS) +server-->>213070643358482:-PARAMETER STATUS name='application_name', value='' +server-->>213070643358482:-PARAMETER STATUS name='client_encoding', value='UTF8' +server-->>213070643358482:-PARAMETER STATUS name='DateStyle', value='ISO, MDY' +server-->>213070643358482:-PARAMETER STATUS name='integer_datetimes', value='on' +server-->>213070643358482:-PARAMETER STATUS name='IntervalStyle', value='postgres' +server-->>213070643358482:-PARAMETER STATUS name='is_superuser', value='on' +server-->>213070643358482:-PARAMETER STATUS name='server_encoding', value='UTF8' +server-->>213070643358482:-PARAMETER STATUS name='server_version', value='13.0.0' +server-->>213070643358482:-PARAMETER STATUS name='session_authorization', value='docker' +server-->>213070643358482:-PARAMETER STATUS name='standard_conforming_strings', value='on' +server-->>213070643358482:-PARAMETER STATUS name='TimeZone', value='GMT' +server-->>213070643358482:-BACKEND KEY DATA pid=1742342691, key=1299317425 +server-->>213070643358482:-READY FOR QUERY type= +213070643358482->>server:+PARSE name='', num_params=0, params_type=, query=SET extra_float_digits = 3 +213070643358482->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358482->>server:+EXECUTE name='', nb_rows=1 +213070643358482->>server:+SYNC +server-->>213070643358482:-PARSE COMPLETE +server-->>213070643358482:-BIND COMPLETE +server-->>213070643358482:-COMMAND COMPLETE command='SET' +server-->>213070643358482:-READY FOR QUERY type= +213070643358482->>server:+PARSE name='', num_params=0, params_type=, query=SET application_name = 'PostgreSQL JDBC Driver' +213070643358482->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358482->>server:+EXECUTE name='', nb_rows=1 +213070643358482->>server:+SYNC +server-->>213070643358482:-PARSE COMPLETE +server-->>213070643358482:-BIND COMPLETE +server-->>213070643358482:-PARAMETER STATUS name='application_name', value='PostgreSQL JDBC Driver' +server-->>213070643358482:-COMMAND COMPLETE command='SET' +server-->>213070643358482:-READY FOR QUERY type= +213070643358482->>server:+PARSE name='', num_params=0, params_type=, query= +213070643358482->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358482->>server:+DESCRIBE kind='P', name='' +213070643358482->>server:+EXECUTE name='', nb_rows=1 +213070643358482->>server:+SYNC +server-->>213070643358482:-PARSE COMPLETE +server-->>213070643358482:-BIND COMPLETE +server-->>213070643358482:-NO DATA +server-->>213070643358482:-EMPTY QUERY RESPONSE +server-->>213070643358482:-READY FOR QUERY type= +213070643358482->>server:+DISCONNECT +213070643358484->>server:+SSL REQUEST +server-->>213070643358484:-SSL BACKEND ANSWER: N +213070643358484->>server:+STARTUP MESSAGE version: 3 database=trait_store extra_float_digits=2 TimeZone=GMT client_encoding=UTF8 user=docker DateStyle=ISO +server-->>213070643358484:-AUTHENTIFICATION REQUEST code=0 (SUCCESS) +server-->>213070643358484:-PARAMETER STATUS name='application_name', value='' +server-->>213070643358484:-PARAMETER STATUS name='client_encoding', value='UTF8' +server-->>213070643358484:-PARAMETER STATUS name='DateStyle', value='ISO, MDY' +server-->>213070643358484:-PARAMETER STATUS name='integer_datetimes', value='on' +server-->>213070643358484:-PARAMETER STATUS name='IntervalStyle', value='postgres' +server-->>213070643358484:-PARAMETER STATUS name='is_superuser', value='on' +server-->>213070643358484:-PARAMETER STATUS name='server_encoding', value='UTF8' +server-->>213070643358484:-PARAMETER STATUS name='server_version', value='13.0.0' +server-->>213070643358484:-PARAMETER STATUS name='session_authorization', value='docker' +server-->>213070643358484:-PARAMETER STATUS name='standard_conforming_strings', value='on' +server-->>213070643358484:-PARAMETER STATUS name='TimeZone', value='GMT' +server-->>213070643358484:-BACKEND KEY DATA pid=700852804, key=1377869267 +server-->>213070643358484:-READY FOR QUERY type= +213070643358484->>server:+PARSE name='', num_params=0, params_type=, query=SET extra_float_digits = 3 +213070643358484->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358484->>server:+EXECUTE name='', nb_rows=1 +213070643358484->>server:+SYNC +server-->>213070643358484:-PARSE COMPLETE +server-->>213070643358484:-BIND COMPLETE +server-->>213070643358484:-COMMAND COMPLETE command='SET' +server-->>213070643358484:-READY FOR QUERY type= +213070643358484->>server:+PARSE name='', num_params=0, params_type=, query=SET application_name = 'PostgreSQL JDBC Driver' +213070643358484->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358484->>server:+EXECUTE name='', nb_rows=1 +213070643358484->>server:+SYNC +server-->>213070643358484:-PARSE COMPLETE +server-->>213070643358484:-BIND COMPLETE +server-->>213070643358484:-PARAMETER STATUS name='application_name', value='PostgreSQL JDBC Driver' +server-->>213070643358484:-COMMAND COMPLETE command='SET' +server-->>213070643358484:-READY FOR QUERY type= +213070643358484->>server:+PARSE name='', num_params=0, params_type=, query= +213070643358484->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358484->>server:+DESCRIBE kind='P', name='' +213070643358484->>server:+EXECUTE name='', nb_rows=1 +213070643358484->>server:+SYNC +server-->>213070643358484:-PARSE COMPLETE +server-->>213070643358484:-BIND COMPLETE +server-->>213070643358484:-NO DATA +server-->>213070643358484:-EMPTY QUERY RESPONSE +server-->>213070643358484:-READY FOR QUERY type= +213070643358484->>server:+DISCONNECT +213070643358486->>server:+SSL REQUEST +server-->>213070643358486:-SSL BACKEND ANSWER: N +213070643358486->>server:+STARTUP MESSAGE version: 3 database=trait_store extra_float_digits=2 TimeZone=GMT client_encoding=UTF8 user=docker DateStyle=ISO +server-->>213070643358486:-AUTHENTIFICATION REQUEST code=0 (SUCCESS) +server-->>213070643358486:-PARAMETER STATUS name='application_name', value='' +server-->>213070643358486:-PARAMETER STATUS name='client_encoding', value='UTF8' +server-->>213070643358486:-PARAMETER STATUS name='DateStyle', value='ISO, MDY' +server-->>213070643358486:-PARAMETER STATUS name='integer_datetimes', value='on' +server-->>213070643358486:-PARAMETER STATUS name='IntervalStyle', value='postgres' +server-->>213070643358486:-PARAMETER STATUS name='is_superuser', value='on' +server-->>213070643358486:-PARAMETER STATUS name='server_encoding', value='UTF8' +server-->>213070643358486:-PARAMETER STATUS name='server_version', value='13.0.0' +server-->>213070643358486:-PARAMETER STATUS name='session_authorization', value='docker' +server-->>213070643358486:-PARAMETER STATUS name='standard_conforming_strings', value='on' +server-->>213070643358486:-PARAMETER STATUS name='TimeZone', value='GMT' +server-->>213070643358486:-BACKEND KEY DATA pid=413235241, key=1302652759 +server-->>213070643358486:-READY FOR QUERY type= +213070643358486->>server:+PARSE name='', num_params=0, params_type=, query=SET extra_float_digits = 3 +213070643358486->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358486->>server:+EXECUTE name='', nb_rows=1 +213070643358486->>server:+SYNC +server-->>213070643358486:-PARSE COMPLETE +server-->>213070643358486:-BIND COMPLETE +server-->>213070643358486:-COMMAND COMPLETE command='SET' +server-->>213070643358486:-READY FOR QUERY type= +213070643358486->>server:+PARSE name='', num_params=0, params_type=, query=SET application_name = 'PostgreSQL JDBC Driver' +213070643358486->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358486->>server:+EXECUTE name='', nb_rows=1 +213070643358486->>server:+SYNC +server-->>213070643358486:-PARSE COMPLETE +server-->>213070643358486:-BIND COMPLETE +server-->>213070643358486:-PARAMETER STATUS name='application_name', value='PostgreSQL JDBC Driver' +server-->>213070643358486:-COMMAND COMPLETE command='SET' +server-->>213070643358486:-READY FOR QUERY type= +213070643358486->>server:+PARSE name='', num_params=0, params_type=, query= +213070643358486->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358486->>server:+DESCRIBE kind='P', name='' +213070643358486->>server:+EXECUTE name='', nb_rows=1 +213070643358486->>server:+SYNC +server-->>213070643358486:-PARSE COMPLETE +server-->>213070643358486:-BIND COMPLETE +server-->>213070643358486:-NO DATA +server-->>213070643358486:-EMPTY QUERY RESPONSE +server-->>213070643358486:-READY FOR QUERY type= +213070643358486->>server:+PARSE name='', num_params=0, params_type=, query=SELECT pg_backend_pid() +213070643358486->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358486->>server:+DESCRIBE kind='P', name='' +213070643358486->>server:+EXECUTE name='', nb_rows=0 +213070643358486->>server:+SYNC +server-->>213070643358486:-PARSE COMPLETE +server-->>213070643358486:-BIND COMPLETE +server-->>213070643358486:-ROW DESCRIPTION: num_fields=1 ---[Field 01]--- name='pg_backend_pid' type=23 type_len=4 type_mod=4294967295 relid=0 attnum=0 format=0 +server-->>213070643358486:-DATA ROW num_values=1 ---[Value 0001]--- length=9 value='413235241' +server-->>213070643358486:-COMMAND COMPLETE command='SELECT' +server-->>213070643358486:-READY FOR QUERY type= +213070643358486->>server:+PARSE name='', num_params=0, params_type=, query=SELECT VERSION() AS version +213070643358486->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358486->>server:+DESCRIBE kind='P', name='' +213070643358486->>server:+EXECUTE name='', nb_rows=0 +213070643358486->>server:+SYNC +server-->>213070643358486:-PARSE COMPLETE +server-->>213070643358486:-BIND COMPLETE +server-->>213070643358486:-ROW DESCRIPTION: num_fields=1 ---[Field 01]--- name='version' type=25 type_len=65535 type_mod=4294967295 relid=0 attnum=0 format=0 +server-->>213070643358486:-DATA ROW num_values=1 ---[Value 0001]--- length=27 value='PostgresSQL 13.0 (molecula)' +server-->>213070643358486:-COMMAND COMPLETE command='SELECT' +server-->>213070643358486:-READY FOR QUERY type= +213070643358486->>server:+PARSE name='', num_params=0, params_type=, query= SELECT COUNT(*) FROM pg_type AS t0, pg_aggregate AS t1, pg_settings AS t2, pg_settings AS t3 +213070643358486->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358486->>server:+DESCRIBE kind='P', name='' +213070643358486->>server:+EXECUTE name='', nb_rows=0 +213070643358486->>server:+SYNC +213070643358488->>server:+SSL REQUEST +server-->>213070643358488:-SSL BACKEND ANSWER: N +213070643358488->>server:+STARTUP MESSAGE version: 3 database=trait_store extra_float_digits=2 TimeZone=GMT client_encoding=UTF8 user=docker DateStyle=ISO +server-->>213070643358488:-AUTHENTIFICATION REQUEST code=0 (SUCCESS) +server-->>213070643358488:-PARAMETER STATUS name='application_name', value='' +server-->>213070643358488:-PARAMETER STATUS name='client_encoding', value='UTF8' +server-->>213070643358488:-PARAMETER STATUS name='DateStyle', value='ISO, MDY' +server-->>213070643358488:-PARAMETER STATUS name='integer_datetimes', value='on' +server-->>213070643358488:-PARAMETER STATUS name='IntervalStyle', value='postgres' +server-->>213070643358488:-PARAMETER STATUS name='is_superuser', value='on' +server-->>213070643358488:-PARAMETER STATUS name='server_encoding', value='UTF8' +server-->>213070643358488:-PARAMETER STATUS name='server_version', value='13.0.0' +server-->>213070643358488:-PARAMETER STATUS name='session_authorization', value='docker' +server-->>213070643358488:-PARAMETER STATUS name='standard_conforming_strings', value='on' +server-->>213070643358488:-PARAMETER STATUS name='TimeZone', value='GMT' +server-->>213070643358488:-BACKEND KEY DATA pid=180554708, key=1504602717 +server-->>213070643358488:-READY FOR QUERY type= +213070643358488->>server:+PARSE name='', num_params=0, params_type=, query=SET extra_float_digits = 3 +213070643358488->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358488->>server:+EXECUTE name='', nb_rows=1 +213070643358488->>server:+SYNC +server-->>213070643358488:-PARSE COMPLETE +server-->>213070643358488:-BIND COMPLETE +server-->>213070643358488:-COMMAND COMPLETE command='SET' +server-->>213070643358488:-READY FOR QUERY type= +213070643358488->>server:+PARSE name='', num_params=0, params_type=, query=SET application_name = 'PostgreSQL JDBC Driver' +213070643358488->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358488->>server:+EXECUTE name='', nb_rows=1 +213070643358488->>server:+SYNC +server-->>213070643358488:-PARSE COMPLETE +server-->>213070643358488:-BIND COMPLETE +server-->>213070643358488:-PARAMETER STATUS name='application_name', value='PostgreSQL JDBC Driver' +server-->>213070643358488:-COMMAND COMPLETE command='SET' +server-->>213070643358488:-READY FOR QUERY type= +213070643358488->>server:+PARSE name='', num_params=0, params_type=, query= +213070643358488->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358488->>server:+DESCRIBE kind='P', name='' +213070643358488->>server:+EXECUTE name='', nb_rows=1 +213070643358488->>server:+SYNC +server-->>213070643358488:-PARSE COMPLETE +server-->>213070643358488:-BIND COMPLETE +server-->>213070643358488:-NO DATA +server-->>213070643358488:-EMPTY QUERY RESPONSE +server-->>213070643358488:-READY FOR QUERY type= +213070643358488->>server:+DISCONNECT +213070643358490->>server:+SSL REQUEST +server-->>213070643358490:-SSL BACKEND ANSWER: N +213070643358490->>server:+STARTUP MESSAGE version: 3 database=trait_store extra_float_digits=2 TimeZone=GMT client_encoding=UTF8 user=docker DateStyle=ISO +server-->>213070643358490:-AUTHENTIFICATION REQUEST code=0 (SUCCESS) +server-->>213070643358490:-PARAMETER STATUS name='application_name', value='' +server-->>213070643358490:-PARAMETER STATUS name='client_encoding', value='UTF8' +server-->>213070643358490:-PARAMETER STATUS name='DateStyle', value='ISO, MDY' +server-->>213070643358490:-PARAMETER STATUS name='integer_datetimes', value='on' +server-->>213070643358490:-PARAMETER STATUS name='IntervalStyle', value='postgres' +server-->>213070643358490:-PARAMETER STATUS name='is_superuser', value='on' +server-->>213070643358490:-PARAMETER STATUS name='server_encoding', value='UTF8' +server-->>213070643358490:-PARAMETER STATUS name='server_version', value='13.0.0' +server-->>213070643358490:-PARAMETER STATUS name='session_authorization', value='docker' +server-->>213070643358490:-PARAMETER STATUS name='standard_conforming_strings', value='on' +server-->>213070643358490:-PARAMETER STATUS name='TimeZone', value='GMT' +server-->>213070643358490:-BACKEND KEY DATA pid=1713101217, key=29850369 +server-->>213070643358490:-READY FOR QUERY type= +213070643358490->>server:+PARSE name='', num_params=0, params_type=, query=SET extra_float_digits = 3 +213070643358490->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358490->>server:+EXECUTE name='', nb_rows=1 +213070643358490->>server:+SYNC +server-->>213070643358490:-PARSE COMPLETE +server-->>213070643358490:-BIND COMPLETE +server-->>213070643358490:-COMMAND COMPLETE command='SET' +server-->>213070643358490:-READY FOR QUERY type= +213070643358490->>server:+PARSE name='', num_params=0, params_type=, query=SET application_name = 'PostgreSQL JDBC Driver' +213070643358490->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358490->>server:+EXECUTE name='', nb_rows=1 +213070643358490->>server:+SYNC +server-->>213070643358490:-PARSE COMPLETE +server-->>213070643358490:-BIND COMPLETE +server-->>213070643358490:-PARAMETER STATUS name='application_name', value='PostgreSQL JDBC Driver' +server-->>213070643358490:-COMMAND COMPLETE command='SET' +server-->>213070643358490:-READY FOR QUERY type= +213070643358490->>server:+PARSE name='', num_params=0, params_type=, query= +213070643358490->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358490->>server:+DESCRIBE kind='P', name='' +213070643358490->>server:+EXECUTE name='', nb_rows=1 +213070643358490->>server:+SYNC +server-->>213070643358490:-PARSE COMPLETE +server-->>213070643358490:-BIND COMPLETE +server-->>213070643358490:-NO DATA +server-->>213070643358490:-EMPTY QUERY RESPONSE +server-->>213070643358490:-READY FOR QUERY type= +213070643358490->>server:+PARSE name='', num_params=0, params_type=, query=SELECT VERSION() AS version +213070643358490->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358490->>server:+DESCRIBE kind='P', name='' +213070643358490->>server:+EXECUTE name='', nb_rows=0 +213070643358490->>server:+SYNC +server-->>213070643358490:-PARSE COMPLETE +server-->>213070643358490:-BIND COMPLETE +server-->>213070643358490:-ROW DESCRIPTION: num_fields=1 ---[Field 01]--- name='version' type=25 type_len=65535 type_mod=4294967295 relid=0 attnum=0 format=0 +server-->>213070643358490:-DATA ROW num_values=1 ---[Value 0001]--- length=27 value='PostgresSQL 13.0 (molecula)' +server-->>213070643358490:-COMMAND COMPLETE command='SELECT' +server-->>213070643358490:-READY FOR QUERY type= +213070643358490->>server:+PARSE name='', num_params=0, params_type=, query= +213070643358490->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358490->>server:+DESCRIBE kind='P', name='' +213070643358490->>server:+EXECUTE name='', nb_rows=1 +213070643358490->>server:+SYNC +server-->>213070643358490:-PARSE COMPLETE +server-->>213070643358490:-BIND COMPLETE +server-->>213070643358490:-NO DATA +server-->>213070643358490:-EMPTY QUERY RESPONSE +server-->>213070643358490:-READY FOR QUERY type= +213070643358490->>server:+PARSE name='', num_params=0, params_type=, query= SELECT pid as id, query as stmt, EXTRACT(seconds from query_start - NOW()) as elapsed_time FROM pg_stat_activity WHERE usename='docker' +213070643358490->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358490->>server:+DESCRIBE kind='P', name='' +213070643358490->>server:+EXECUTE name='', nb_rows=0 +213070643358490->>server:+SYNC +server-->>213070643358490:-PARSE COMPLETE +server-->>213070643358490:-BIND COMPLETE +server-->>213070643358490:-ROW DESCRIPTION: num_fields=3 ---[Field 01]--- name='id' type=23 type_len=4 type_mod=4294967295 relid=0 attnum=0 format=0 ---[Field 02]--- name='stmt' type=25 type_len=65535 type_mod=4294967295 relid=0 attnum=0 format=0 ---[Field 03]--- name='elapsed_time' type=701 type_len=8 type_mod=4294967295 relid=0 attnum=0 format=0 +server-->>213070643358490:-DATA ROW num_values=3 ---[Value 0001]--- length=9 value='413235241' ---[Value 0002]--- length=148 value=' SELECT COUNT(*). FROM pg_type AS t0,. pg_aggregate AS t1,. pg_settings AS t2,. pg_settings AS t3.' ---[Value 0003]--- length=11 value='1.311371547' +server-->>213070643358490:-DATA ROW num_values=3 ---[Value 0001]--- length=10 value='1713101217' ---[Value 0002]--- length=190 value=' SELECT pid as id,. query as stmt,. EXTRACT(seconds from query_start - NOW()) as elapsed_time. FROM pg_stat_activity. WHERE usename='docker'.' ---[Value 0003]--- length=11 value='0.000169969' +server-->>213070643358490:-COMMAND COMPLETE command='SELECT' +server-->>213070643358490:-READY FOR QUERY type= +213070643358492->>server:+SSL REQUEST +server-->>213070643358492:-SSL BACKEND ANSWER: N +213070643358492->>server:+STARTUP MESSAGE version: 3 database=trait_store extra_float_digits=2 TimeZone=GMT client_encoding=UTF8 user=docker DateStyle=ISO +server-->>213070643358492:-AUTHENTIFICATION REQUEST code=0 (SUCCESS) +server-->>213070643358492:-PARAMETER STATUS name='application_name', value='' +server-->>213070643358492:-PARAMETER STATUS name='client_encoding', value='UTF8' +server-->>213070643358492:-PARAMETER STATUS name='DateStyle', value='ISO, MDY' +server-->>213070643358492:-PARAMETER STATUS name='integer_datetimes', value='on' +server-->>213070643358492:-PARAMETER STATUS name='IntervalStyle', value='postgres' +server-->>213070643358492:-PARAMETER STATUS name='is_superuser', value='on' +server-->>213070643358492:-PARAMETER STATUS name='server_encoding', value='UTF8' +server-->>213070643358492:-PARAMETER STATUS name='server_version', value='13.0.0' +server-->>213070643358492:-PARAMETER STATUS name='session_authorization', value='docker' +server-->>213070643358492:-PARAMETER STATUS name='standard_conforming_strings', value='on' +server-->>213070643358492:-PARAMETER STATUS name='TimeZone', value='GMT' +server-->>213070643358492:-BACKEND KEY DATA pid=2034361563, key=1419995666 +server-->>213070643358492:-READY FOR QUERY type= +213070643358492->>server:+PARSE name='', num_params=0, params_type=, query=SET extra_float_digits = 3 +213070643358492->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358492->>server:+EXECUTE name='', nb_rows=1 +213070643358492->>server:+SYNC +server-->>213070643358492:-PARSE COMPLETE +server-->>213070643358492:-BIND COMPLETE +server-->>213070643358492:-COMMAND COMPLETE command='SET' +server-->>213070643358492:-READY FOR QUERY type= +213070643358492->>server:+PARSE name='', num_params=0, params_type=, query=SET application_name = 'PostgreSQL JDBC Driver' +213070643358492->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358492->>server:+EXECUTE name='', nb_rows=1 +213070643358492->>server:+SYNC +server-->>213070643358492:-PARSE COMPLETE +server-->>213070643358492:-BIND COMPLETE +server-->>213070643358492:-PARAMETER STATUS name='application_name', value='PostgreSQL JDBC Driver' +server-->>213070643358492:-COMMAND COMPLETE command='SET' +server-->>213070643358492:-READY FOR QUERY type= +213070643358492->>server:+PARSE name='', num_params=0, params_type=, query= +213070643358492->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358492->>server:+DESCRIBE kind='P', name='' +213070643358492->>server:+EXECUTE name='', nb_rows=1 +213070643358492->>server:+SYNC +server-->>213070643358492:-PARSE COMPLETE +server-->>213070643358492:-BIND COMPLETE +server-->>213070643358492:-NO DATA +server-->>213070643358492:-EMPTY QUERY RESPONSE +server-->>213070643358492:-READY FOR QUERY type= +213070643358492->>server:+DISCONNECT +213070643358494->>server:+SSL REQUEST +server-->>213070643358494:-SSL BACKEND ANSWER: N +213070643358494->>server:+STARTUP MESSAGE version: 3 database=trait_store extra_float_digits=2 TimeZone=GMT client_encoding=UTF8 user=docker DateStyle=ISO +server-->>213070643358494:-AUTHENTIFICATION REQUEST code=0 (SUCCESS) +server-->>213070643358494:-PARAMETER STATUS name='application_name', value='' +server-->>213070643358494:-PARAMETER STATUS name='client_encoding', value='UTF8' +server-->>213070643358494:-PARAMETER STATUS name='DateStyle', value='ISO, MDY' +server-->>213070643358494:-PARAMETER STATUS name='integer_datetimes', value='on' +server-->>213070643358494:-PARAMETER STATUS name='IntervalStyle', value='postgres' +server-->>213070643358494:-PARAMETER STATUS name='is_superuser', value='on' +server-->>213070643358494:-PARAMETER STATUS name='server_encoding', value='UTF8' +server-->>213070643358494:-PARAMETER STATUS name='server_version', value='13.0.0' +server-->>213070643358494:-PARAMETER STATUS name='session_authorization', value='docker' +server-->>213070643358494:-PARAMETER STATUS name='standard_conforming_strings', value='on' +server-->>213070643358494:-PARAMETER STATUS name='TimeZone', value='GMT' +server-->>213070643358494:-BACKEND KEY DATA pid=964429462, key=1673405115 +server-->>213070643358494:-READY FOR QUERY type= +213070643358494->>server:+PARSE name='', num_params=0, params_type=, query=SET extra_float_digits = 3 +213070643358494->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358494->>server:+EXECUTE name='', nb_rows=1 +213070643358494->>server:+SYNC +server-->>213070643358494:-PARSE COMPLETE +server-->>213070643358494:-BIND COMPLETE +server-->>213070643358494:-COMMAND COMPLETE command='SET' +server-->>213070643358494:-READY FOR QUERY type= +213070643358494->>server:+PARSE name='', num_params=0, params_type=, query=SET application_name = 'PostgreSQL JDBC Driver' +213070643358494->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358494->>server:+EXECUTE name='', nb_rows=1 +213070643358494->>server:+SYNC +server-->>213070643358494:-PARSE COMPLETE +server-->>213070643358494:-BIND COMPLETE +server-->>213070643358494:-PARAMETER STATUS name='application_name', value='PostgreSQL JDBC Driver' +server-->>213070643358494:-COMMAND COMPLETE command='SET' +server-->>213070643358494:-READY FOR QUERY type= +213070643358494->>server:+PARSE name='', num_params=0, params_type=, query= +213070643358494->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358494->>server:+DESCRIBE kind='P', name='' +213070643358494->>server:+EXECUTE name='', nb_rows=1 +213070643358494->>server:+SYNC +server-->>213070643358494:-PARSE COMPLETE +server-->>213070643358494:-BIND COMPLETE +server-->>213070643358494:-NO DATA +server-->>213070643358494:-EMPTY QUERY RESPONSE +server-->>213070643358494:-READY FOR QUERY type= +213070643358494->>server:+PARSE name='', num_params=0, params_type=, query=select pg_terminate_backend(413235241) +213070643358494->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358494->>server:+DESCRIBE kind='P', name='' +213070643358494->>server:+EXECUTE name='', nb_rows=0 +213070643358494->>server:+SYNC +server-->>213070643358494:-PARSE COMPLETE +server-->>213070643358494:-BIND COMPLETE +server-->>213070643358494:-ROW DESCRIPTION: num_fields=1 ---[Field 01]--- name='pg_terminate_backend' type=16 type_len=1 type_mod=4294967295 relid=0 attnum=0 format=0 +server-->>213070643358494:-DATA ROW num_values=1 ---[Value 0001]--- length=1 value='t' +server-->>213070643358494:-COMMAND COMPLETE command='SELECT 1' +server-->>213070643358486:-PARSE COMPLETE +server-->>213070643358486:-BIND COMPLETE +server-->>213070643358486:-ROW DESCRIPTION: num_fields=1 ---[Field 01]--- name='count' type=20 type_len=8 type_mod=4294967295 relid=0 attnum=0 format=0 +server-->>213070643358486:-ERROR RESPONSE Severity: 'FATAL' Message: 'terminating connection due to administrator command' Code: '57P01' +server-->>213070643358494:-READY FOR QUERY type= +213070643358490->>server:+DISCONNECT +213070643358494->>server:+DISCONNECT +213070643358496->>server:+SSL REQUEST +server-->>213070643358496:-SSL BACKEND ANSWER: N +213070643358496->>server:+STARTUP MESSAGE version: 3 database=trait_store extra_float_digits=2 TimeZone=GMT client_encoding=UTF8 user=docker DateStyle=ISO +server-->>213070643358496:-AUTHENTIFICATION REQUEST code=0 (SUCCESS) +server-->>213070643358496:-PARAMETER STATUS name='application_name', value='' +server-->>213070643358496:-PARAMETER STATUS name='client_encoding', value='UTF8' +server-->>213070643358496:-PARAMETER STATUS name='DateStyle', value='ISO, MDY' +server-->>213070643358496:-PARAMETER STATUS name='integer_datetimes', value='on' +server-->>213070643358496:-PARAMETER STATUS name='IntervalStyle', value='postgres' +server-->>213070643358496:-PARAMETER STATUS name='is_superuser', value='on' +server-->>213070643358496:-PARAMETER STATUS name='server_encoding', value='UTF8' +server-->>213070643358496:-PARAMETER STATUS name='server_version', value='13.0.0' +server-->>213070643358496:-PARAMETER STATUS name='session_authorization', value='docker' +server-->>213070643358496:-PARAMETER STATUS name='standard_conforming_strings', value='on' +server-->>213070643358496:-PARAMETER STATUS name='TimeZone', value='GMT' +server-->>213070643358496:-BACKEND KEY DATA pid=841257432, key=992978867 +server-->>213070643358496:-READY FOR QUERY type= +213070643358496->>server:+PARSE name='', num_params=0, params_type=, query=SET extra_float_digits = 3 +213070643358496->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358496->>server:+EXECUTE name='', nb_rows=1 +213070643358496->>server:+SYNC +server-->>213070643358496:-PARSE COMPLETE +server-->>213070643358496:-BIND COMPLETE +server-->>213070643358496:-COMMAND COMPLETE command='SET' +server-->>213070643358496:-READY FOR QUERY type= +213070643358496->>server:+PARSE name='', num_params=0, params_type=, query=SET application_name = 'PostgreSQL JDBC Driver' +213070643358496->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358496->>server:+EXECUTE name='', nb_rows=1 +213070643358496->>server:+SYNC +server-->>213070643358496:-PARSE COMPLETE +server-->>213070643358496:-BIND COMPLETE +server-->>213070643358496:-PARAMETER STATUS name='application_name', value='PostgreSQL JDBC Driver' +server-->>213070643358496:-COMMAND COMPLETE command='SET' +server-->>213070643358496:-READY FOR QUERY type= +213070643358496->>server:+PARSE name='', num_params=0, params_type=, query= +213070643358496->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358496->>server:+DESCRIBE kind='P', name='' +213070643358496->>server:+EXECUTE name='', nb_rows=1 +213070643358496->>server:+SYNC +server-->>213070643358496:-PARSE COMPLETE +server-->>213070643358496:-BIND COMPLETE +server-->>213070643358496:-NO DATA +server-->>213070643358496:-EMPTY QUERY RESPONSE +server-->>213070643358496:-READY FOR QUERY type= +213070643358496->>server:+DISCONNECT +213070643358498->>server:+SSL REQUEST +server-->>213070643358498:-SSL BACKEND ANSWER: N +213070643358498->>server:+STARTUP MESSAGE version: 3 database=trait_store extra_float_digits=2 TimeZone=GMT client_encoding=UTF8 user=docker DateStyle=ISO +server-->>213070643358498:-AUTHENTIFICATION REQUEST code=0 (SUCCESS) +server-->>213070643358498:-PARAMETER STATUS name='application_name', value='' +server-->>213070643358498:-PARAMETER STATUS name='client_encoding', value='UTF8' +server-->>213070643358498:-PARAMETER STATUS name='DateStyle', value='ISO, MDY' +server-->>213070643358498:-PARAMETER STATUS name='integer_datetimes', value='on' +server-->>213070643358498:-PARAMETER STATUS name='IntervalStyle', value='postgres' +server-->>213070643358498:-PARAMETER STATUS name='is_superuser', value='on' +server-->>213070643358498:-PARAMETER STATUS name='server_encoding', value='UTF8' +server-->>213070643358498:-PARAMETER STATUS name='server_version', value='13.0.0' +server-->>213070643358498:-PARAMETER STATUS name='session_authorization', value='docker' +server-->>213070643358498:-PARAMETER STATUS name='standard_conforming_strings', value='on' +server-->>213070643358498:-PARAMETER STATUS name='TimeZone', value='GMT' +server-->>213070643358498:-BACKEND KEY DATA pid=645931978, key=579078180 +server-->>213070643358498:-READY FOR QUERY type= +213070643358498->>server:+PARSE name='', num_params=0, params_type=, query=SET extra_float_digits = 3 +213070643358498->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358498->>server:+EXECUTE name='', nb_rows=1 +213070643358498->>server:+SYNC +server-->>213070643358498:-PARSE COMPLETE +server-->>213070643358498:-BIND COMPLETE +server-->>213070643358498:-COMMAND COMPLETE command='SET' +server-->>213070643358498:-READY FOR QUERY type= +213070643358498->>server:+PARSE name='', num_params=0, params_type=, query=SET application_name = 'PostgreSQL JDBC Driver' +213070643358498->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358498->>server:+EXECUTE name='', nb_rows=1 +213070643358498->>server:+SYNC +server-->>213070643358498:-PARSE COMPLETE +server-->>213070643358498:-BIND COMPLETE +server-->>213070643358498:-PARAMETER STATUS name='application_name', value='PostgreSQL JDBC Driver' +server-->>213070643358498:-COMMAND COMPLETE command='SET' +server-->>213070643358498:-READY FOR QUERY type= +213070643358498->>server:+PARSE name='', num_params=0, params_type=, query= +213070643358498->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358498->>server:+DESCRIBE kind='P', name='' +213070643358498->>server:+EXECUTE name='', nb_rows=1 +213070643358498->>server:+SYNC +server-->>213070643358498:-PARSE COMPLETE +server-->>213070643358498:-BIND COMPLETE +server-->>213070643358498:-NO DATA +server-->>213070643358498:-EMPTY QUERY RESPONSE +server-->>213070643358498:-READY FOR QUERY type= +213070643358498->>server:+PARSE name='', num_params=0, params_type=, query=SELECT 1 +213070643358498->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358498->>server:+DESCRIBE kind='P', name='' +213070643358498->>server:+EXECUTE name='', nb_rows=0 +213070643358498->>server:+SYNC +server-->>213070643358498:-PARSE COMPLETE +server-->>213070643358498:-BIND COMPLETE +server-->>213070643358498:-ROW DESCRIPTION: num_fields=1 ---[Field 01]--- name='?column?' type=23 type_len=4 type_mod=4294967295 relid=0 attnum=0 format=0 +server-->>213070643358498:-DATA ROW num_values=1 ---[Value 0001]--- length=1 value='1' +server-->>213070643358498:-COMMAND COMPLETE command='SELECT' +server-->>213070643358498:-READY FOR QUERY type= +213070643358498->>server:+DISCONNECT +213070643358500->>server:+SSL REQUEST +server-->>213070643358500:-SSL BACKEND ANSWER: N +213070643358500->>server:+STARTUP MESSAGE version: 3 database=trait_store extra_float_digits=2 TimeZone=GMT client_encoding=UTF8 user=docker DateStyle=ISO +server-->>213070643358500:-AUTHENTIFICATION REQUEST code=0 (SUCCESS) +server-->>213070643358500:-PARAMETER STATUS name='application_name', value='' +server-->>213070643358500:-PARAMETER STATUS name='client_encoding', value='UTF8' +server-->>213070643358500:-PARAMETER STATUS name='DateStyle', value='ISO, MDY' +server-->>213070643358500:-PARAMETER STATUS name='integer_datetimes', value='on' +server-->>213070643358500:-PARAMETER STATUS name='IntervalStyle', value='postgres' +server-->>213070643358500:-PARAMETER STATUS name='is_superuser', value='on' +server-->>213070643358500:-PARAMETER STATUS name='server_encoding', value='UTF8' +server-->>213070643358500:-PARAMETER STATUS name='server_version', value='13.0.0' +server-->>213070643358500:-PARAMETER STATUS name='session_authorization', value='docker' +server-->>213070643358500:-PARAMETER STATUS name='standard_conforming_strings', value='on' +server-->>213070643358500:-PARAMETER STATUS name='TimeZone', value='GMT' +server-->>213070643358500:-BACKEND KEY DATA pid=1632401438, key=1341645778 +server-->>213070643358500:-READY FOR QUERY type= +213070643358500->>server:+PARSE name='', num_params=0, params_type=, query=SET extra_float_digits = 3 +213070643358500->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358500->>server:+EXECUTE name='', nb_rows=1 +213070643358500->>server:+SYNC +server-->>213070643358500:-PARSE COMPLETE +server-->>213070643358500:-BIND COMPLETE +server-->>213070643358500:-COMMAND COMPLETE command='SET' +server-->>213070643358500:-READY FOR QUERY type= +213070643358500->>server:+PARSE name='', num_params=0, params_type=, query=SET application_name = 'PostgreSQL JDBC Driver' +213070643358500->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358500->>server:+EXECUTE name='', nb_rows=1 +213070643358500->>server:+SYNC +server-->>213070643358500:-PARSE COMPLETE +server-->>213070643358500:-BIND COMPLETE +server-->>213070643358500:-PARAMETER STATUS name='application_name', value='PostgreSQL JDBC Driver' +server-->>213070643358500:-COMMAND COMPLETE command='SET' +server-->>213070643358500:-READY FOR QUERY type= +213070643358500->>server:+PARSE name='', num_params=0, params_type=, query= +213070643358500->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358500->>server:+DESCRIBE kind='P', name='' +213070643358500->>server:+EXECUTE name='', nb_rows=1 +213070643358500->>server:+SYNC +server-->>213070643358500:-PARSE COMPLETE +server-->>213070643358500:-BIND COMPLETE +server-->>213070643358500:-NO DATA +server-->>213070643358500:-EMPTY QUERY RESPONSE +server-->>213070643358500:-READY FOR QUERY type= +213070643358500->>server:+DISCONNECT +213070643358502->>server:+SSL REQUEST +server-->>213070643358502:-SSL BACKEND ANSWER: N +213070643358502->>server:+STARTUP MESSAGE version: 3 database=trait_store extra_float_digits=2 TimeZone=GMT client_encoding=UTF8 user=docker DateStyle=ISO +server-->>213070643358502:-AUTHENTIFICATION REQUEST code=0 (SUCCESS) +server-->>213070643358502:-PARAMETER STATUS name='application_name', value='' +server-->>213070643358502:-PARAMETER STATUS name='client_encoding', value='UTF8' +server-->>213070643358502:-PARAMETER STATUS name='DateStyle', value='ISO, MDY' +server-->>213070643358502:-PARAMETER STATUS name='integer_datetimes', value='on' +server-->>213070643358502:-PARAMETER STATUS name='IntervalStyle', value='postgres' +server-->>213070643358502:-PARAMETER STATUS name='is_superuser', value='on' +server-->>213070643358502:-PARAMETER STATUS name='server_encoding', value='UTF8' +server-->>213070643358502:-PARAMETER STATUS name='server_version', value='13.0.0' +server-->>213070643358502:-PARAMETER STATUS name='session_authorization', value='docker' +server-->>213070643358502:-PARAMETER STATUS name='standard_conforming_strings', value='on' +server-->>213070643358502:-PARAMETER STATUS name='TimeZone', value='GMT' +server-->>213070643358502:-BACKEND KEY DATA pid=232586748, key=226557416 +server-->>213070643358502:-READY FOR QUERY type= +213070643358502->>server:+PARSE name='', num_params=0, params_type=, query=SET extra_float_digits = 3 +213070643358502->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358502->>server:+EXECUTE name='', nb_rows=1 +213070643358502->>server:+SYNC +server-->>213070643358502:-PARSE COMPLETE +server-->>213070643358502:-BIND COMPLETE +server-->>213070643358502:-COMMAND COMPLETE command='SET' +server-->>213070643358502:-READY FOR QUERY type= +213070643358502->>server:+PARSE name='', num_params=0, params_type=, query=SET application_name = 'PostgreSQL JDBC Driver' +213070643358502->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358502->>server:+EXECUTE name='', nb_rows=1 +213070643358502->>server:+SYNC +server-->>213070643358502:-PARSE COMPLETE +server-->>213070643358502:-BIND COMPLETE +server-->>213070643358502:-PARAMETER STATUS name='application_name', value='PostgreSQL JDBC Driver' +server-->>213070643358502:-COMMAND COMPLETE command='SET' +server-->>213070643358502:-READY FOR QUERY type= +213070643358502->>server:+PARSE name='', num_params=0, params_type=, query= +213070643358502->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358502->>server:+DESCRIBE kind='P', name='' +213070643358502->>server:+EXECUTE name='', nb_rows=1 +213070643358502->>server:+SYNC +server-->>213070643358502:-PARSE COMPLETE +server-->>213070643358502:-BIND COMPLETE +server-->>213070643358502:-NO DATA +server-->>213070643358502:-EMPTY QUERY RESPONSE +server-->>213070643358502:-READY FOR QUERY type= +213070643358502->>server:+PARSE name='', num_params=0, params_type=, query=SELECT VERSION() AS version +213070643358502->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643358502->>server:+DESCRIBE kind='P', name='' +213070643358502->>server:+EXECUTE name='', nb_rows=0 +213070643358502->>server:+SYNC +server-->>213070643358502:-PARSE COMPLETE +server-->>213070643358502:-BIND COMPLETE +server-->>213070643358502:-ROW DESCRIPTION: num_fields=1 ---[Field 01]--- name='version' type=25 type_len=65535 type_mod=4294967295 relid=0 attnum=0 format=0 +server-->>213070643358502:-DATA ROW num_values=1 ---[Value 0001]--- length=27 value='PostgresSQL 13.0 (molecula)' +server-->>213070643358502:-COMMAND COMPLETE command='SELECT' +server-->>213070643358502:-READY FOR QUERY type= +213070643358502->>server:+DISCONNECT +``` diff --git a/pg/lookerToPostgres.md b/pg/lookerToPostgres.md new file mode 100644 index 000000000..53ef945be --- /dev/null +++ b/pg/lookerToPostgres.md @@ -0,0 +1,677 @@ +```mermaid +sequenceDiagram + +participant 213070643360888 as c0 +participant 213070643360892 as c1 +participant 213070643360896 as c2 +participant 213070643360900 as c3 +participant 213070643360904 as c4 +participant 213070643360908 as c5 +participant 213070643360912 as c6 +participant 213070643360916 as c7 +participant 213070643360920 as c8 +participant 213070643360924 as c9 +participant 213070643360928 as c10 +participant 213070643360932 as c11 +213070643360888->>server:+SSL REQUEST +server-->>213070643360888:-SSL BACKEND ANSWER: N +213070643360888->>server:+STARTUP MESSAGE version: 3 database=trait_store extra_float_digits=2 TimeZone=GMT client_encoding=UTF8 user=docker DateStyle=ISO +server-->>213070643360888:-AUTHENTIFICATION REQUEST code=5 (MD5 salt='affbc4bf') +213070643360888->>server:+PASSWORD MESSAGE password=md5de1ae46649b137ee14e14d8fd5fc6cb6 +server-->>213070643360888:-AUTHENTIFICATION REQUEST code=0 (SUCCESS) +server-->>213070643360888:-PARAMETER STATUS name='application_name', value='' +server-->>213070643360888:-PARAMETER STATUS name='client_encoding', value='UTF8' +server-->>213070643360888:-PARAMETER STATUS name='DateStyle', value='ISO, MDY' +server-->>213070643360888:-PARAMETER STATUS name='integer_datetimes', value='on' +server-->>213070643360888:-PARAMETER STATUS name='IntervalStyle', value='postgres' +server-->>213070643360888:-PARAMETER STATUS name='is_superuser', value='on' +server-->>213070643360888:-PARAMETER STATUS name='server_encoding', value='UTF8' +server-->>213070643360888:-PARAMETER STATUS name='server_version', value='13.3 (Debian 13.3-1.pgdg100+1)' +server-->>213070643360888:-PARAMETER STATUS name='session_authorization', value='docker' +server-->>213070643360888:-PARAMETER STATUS name='standard_conforming_strings', value='on' +server-->>213070643360888:-PARAMETER STATUS name='TimeZone', value='GMT' +server-->>213070643360888:-BACKEND KEY DATA pid=97, key=2120775944 +server-->>213070643360888:-READY FOR QUERY type= +213070643360888->>server:+PARSE name='', num_params=0, params_type=, query=SET extra_float_digits = 3 +213070643360888->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360888->>server:+EXECUTE name='', nb_rows=1 +213070643360888->>server:+SYNC +server-->>213070643360888:-PARSE COMPLETE +server-->>213070643360888:-BIND COMPLETE +server-->>213070643360888:-COMMAND COMPLETE command='SET' +server-->>213070643360888:-READY FOR QUERY type= +213070643360888->>server:+PARSE name='', num_params=0, params_type=, query=SET application_name = 'PostgreSQL JDBC Driver' +213070643360888->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360888->>server:+EXECUTE name='', nb_rows=1 +213070643360888->>server:+SYNC +server-->>213070643360888:-PARSE COMPLETE +server-->>213070643360888:-BIND COMPLETE +server-->>213070643360888:-PARAMETER STATUS name='application_name', value='PostgreSQL JDBC Driver' +server-->>213070643360888:-COMMAND COMPLETE command='SET' +server-->>213070643360888:-READY FOR QUERY type= +213070643360888->>server:+PARSE name='', num_params=0, params_type=, query= +213070643360888->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360888->>server:+DESCRIBE kind='P', name='' +213070643360888->>server:+EXECUTE name='', nb_rows=1 +213070643360888->>server:+SYNC +server-->>213070643360888:-PARSE COMPLETE +server-->>213070643360888:-BIND COMPLETE +server-->>213070643360888:-NO DATA +server-->>213070643360888:-EMPTY QUERY RESPONSE +server-->>213070643360888:-READY FOR QUERY type= +213070643360888->>server:+DISCONNECT +213070643360892->>server:+SSL REQUEST +server-->>213070643360892:-SSL BACKEND ANSWER: N +213070643360892->>server:+STARTUP MESSAGE version: 3 database=trait_store extra_float_digits=2 TimeZone=GMT client_encoding=UTF8 user=docker DateStyle=ISO +server-->>213070643360892:-AUTHENTIFICATION REQUEST code=5 (MD5 salt='0b76ce86') +213070643360892->>server:+PASSWORD MESSAGE password=md5b82e4b6283fe5694c0199ca058378bb8 +server-->>213070643360892:-AUTHENTIFICATION REQUEST code=0 (SUCCESS) +server-->>213070643360892:-PARAMETER STATUS name='application_name', value='' +server-->>213070643360892:-PARAMETER STATUS name='client_encoding', value='UTF8' +server-->>213070643360892:-PARAMETER STATUS name='DateStyle', value='ISO, MDY' +server-->>213070643360892:-PARAMETER STATUS name='integer_datetimes', value='on' +server-->>213070643360892:-PARAMETER STATUS name='IntervalStyle', value='postgres' +server-->>213070643360892:-PARAMETER STATUS name='is_superuser', value='on' +server-->>213070643360892:-PARAMETER STATUS name='server_encoding', value='UTF8' +server-->>213070643360892:-PARAMETER STATUS name='server_version', value='13.3 (Debian 13.3-1.pgdg100+1)' +server-->>213070643360892:-PARAMETER STATUS name='session_authorization', value='docker' +server-->>213070643360892:-PARAMETER STATUS name='standard_conforming_strings', value='on' +server-->>213070643360892:-PARAMETER STATUS name='TimeZone', value='GMT' +server-->>213070643360892:-BACKEND KEY DATA pid=98, key=1329847468 +server-->>213070643360892:-READY FOR QUERY type= +213070643360892->>server:+PARSE name='', num_params=0, params_type=, query=SET extra_float_digits = 3 +213070643360892->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360892->>server:+EXECUTE name='', nb_rows=1 +213070643360892->>server:+SYNC +server-->>213070643360892:-PARSE COMPLETE +server-->>213070643360892:-BIND COMPLETE +server-->>213070643360892:-COMMAND COMPLETE command='SET' +server-->>213070643360892:-READY FOR QUERY type= +213070643360892->>server:+PARSE name='', num_params=0, params_type=, query=SET application_name = 'PostgreSQL JDBC Driver' +213070643360892->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360892->>server:+EXECUTE name='', nb_rows=1 +213070643360892->>server:+SYNC +server-->>213070643360892:-PARSE COMPLETE +server-->>213070643360892:-BIND COMPLETE +server-->>213070643360892:-PARAMETER STATUS name='application_name', value='PostgreSQL JDBC Driver' +server-->>213070643360892:-COMMAND COMPLETE command='SET' +server-->>213070643360892:-READY FOR QUERY type= +213070643360892->>server:+PARSE name='', num_params=0, params_type=, query= +213070643360892->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360892->>server:+DESCRIBE kind='P', name='' +213070643360892->>server:+EXECUTE name='', nb_rows=1 +213070643360892->>server:+SYNC +server-->>213070643360892:-PARSE COMPLETE +server-->>213070643360892:-BIND COMPLETE +server-->>213070643360892:-NO DATA +server-->>213070643360892:-EMPTY QUERY RESPONSE +server-->>213070643360892:-READY FOR QUERY type= +213070643360892->>server:+DISCONNECT +213070643360896->>server:+SSL REQUEST +server-->>213070643360896:-SSL BACKEND ANSWER: N +213070643360896->>server:+STARTUP MESSAGE version: 3 database=trait_store extra_float_digits=2 TimeZone=GMT client_encoding=UTF8 user=docker DateStyle=ISO +server-->>213070643360896:-AUTHENTIFICATION REQUEST code=5 (MD5 salt='80e88231') +213070643360896->>server:+PASSWORD MESSAGE password=md59023db05ad8c94976359641cf0ada45a +server-->>213070643360896:-AUTHENTIFICATION REQUEST code=0 (SUCCESS) +server-->>213070643360896:-PARAMETER STATUS name='application_name', value='' +server-->>213070643360896:-PARAMETER STATUS name='client_encoding', value='UTF8' +server-->>213070643360896:-PARAMETER STATUS name='DateStyle', value='ISO, MDY' +server-->>213070643360896:-PARAMETER STATUS name='integer_datetimes', value='on' +server-->>213070643360896:-PARAMETER STATUS name='IntervalStyle', value='postgres' +server-->>213070643360896:-PARAMETER STATUS name='is_superuser', value='on' +server-->>213070643360896:-PARAMETER STATUS name='server_encoding', value='UTF8' +server-->>213070643360896:-PARAMETER STATUS name='server_version', value='13.3 (Debian 13.3-1.pgdg100+1)' +server-->>213070643360896:-PARAMETER STATUS name='session_authorization', value='docker' +server-->>213070643360896:-PARAMETER STATUS name='standard_conforming_strings', value='on' +server-->>213070643360896:-PARAMETER STATUS name='TimeZone', value='GMT' +server-->>213070643360896:-BACKEND KEY DATA pid=99, key=1084480878 +server-->>213070643360896:-READY FOR QUERY type= +213070643360896->>server:+PARSE name='', num_params=0, params_type=, query=SET extra_float_digits = 3 +213070643360896->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360896->>server:+EXECUTE name='', nb_rows=1 +213070643360896->>server:+SYNC +server-->>213070643360896:-PARSE COMPLETE +server-->>213070643360896:-BIND COMPLETE +server-->>213070643360896:-COMMAND COMPLETE command='SET' +server-->>213070643360896:-READY FOR QUERY type= +213070643360896->>server:+PARSE name='', num_params=0, params_type=, query=SET application_name = 'PostgreSQL JDBC Driver' +213070643360896->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360896->>server:+EXECUTE name='', nb_rows=1 +213070643360896->>server:+SYNC +server-->>213070643360896:-PARSE COMPLETE +server-->>213070643360896:-BIND COMPLETE +server-->>213070643360896:-PARAMETER STATUS name='application_name', value='PostgreSQL JDBC Driver' +server-->>213070643360896:-COMMAND COMPLETE command='SET' +server-->>213070643360896:-READY FOR QUERY type= +213070643360896->>server:+PARSE name='', num_params=0, params_type=, query= +213070643360896->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360896->>server:+DESCRIBE kind='P', name='' +213070643360896->>server:+EXECUTE name='', nb_rows=1 +213070643360896->>server:+SYNC +server-->>213070643360896:-PARSE COMPLETE +server-->>213070643360896:-BIND COMPLETE +server-->>213070643360896:-NO DATA +server-->>213070643360896:-EMPTY QUERY RESPONSE +server-->>213070643360896:-READY FOR QUERY type= +213070643360896->>server:+DISCONNECT +213070643360900->>server:+SSL REQUEST +server-->>213070643360900:-SSL BACKEND ANSWER: N +213070643360900->>server:+STARTUP MESSAGE version: 3 database=trait_store extra_float_digits=2 TimeZone=GMT client_encoding=UTF8 user=docker DateStyle=ISO +server-->>213070643360900:-AUTHENTIFICATION REQUEST code=5 (MD5 salt='68a07783') +213070643360900->>server:+PASSWORD MESSAGE password=md5136c8b8ec47347f93827ec5d7023199c +server-->>213070643360900:-AUTHENTIFICATION REQUEST code=0 (SUCCESS) +server-->>213070643360900:-PARAMETER STATUS name='application_name', value='' +server-->>213070643360900:-PARAMETER STATUS name='client_encoding', value='UTF8' +server-->>213070643360900:-PARAMETER STATUS name='DateStyle', value='ISO, MDY' +server-->>213070643360900:-PARAMETER STATUS name='integer_datetimes', value='on' +server-->>213070643360900:-PARAMETER STATUS name='IntervalStyle', value='postgres' +server-->>213070643360900:-PARAMETER STATUS name='is_superuser', value='on' +server-->>213070643360900:-PARAMETER STATUS name='server_encoding', value='UTF8' +server-->>213070643360900:-PARAMETER STATUS name='server_version', value='13.3 (Debian 13.3-1.pgdg100+1)' +server-->>213070643360900:-PARAMETER STATUS name='session_authorization', value='docker' +server-->>213070643360900:-PARAMETER STATUS name='standard_conforming_strings', value='on' +server-->>213070643360900:-PARAMETER STATUS name='TimeZone', value='GMT' +server-->>213070643360900:-BACKEND KEY DATA pid=100, key=594556468 +server-->>213070643360900:-READY FOR QUERY type= +213070643360900->>server:+PARSE name='', num_params=0, params_type=, query=SET extra_float_digits = 3 +213070643360900->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360900->>server:+EXECUTE name='', nb_rows=1 +213070643360900->>server:+SYNC +server-->>213070643360900:-PARSE COMPLETE +server-->>213070643360900:-BIND COMPLETE +server-->>213070643360900:-COMMAND COMPLETE command='SET' +server-->>213070643360900:-READY FOR QUERY type= +213070643360900->>server:+PARSE name='', num_params=0, params_type=, query=SET application_name = 'PostgreSQL JDBC Driver' +213070643360900->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360900->>server:+EXECUTE name='', nb_rows=1 +213070643360900->>server:+SYNC +server-->>213070643360900:-PARSE COMPLETE +server-->>213070643360900:-BIND COMPLETE +server-->>213070643360900:-PARAMETER STATUS name='application_name', value='PostgreSQL JDBC Driver' +server-->>213070643360900:-COMMAND COMPLETE command='SET' +server-->>213070643360900:-READY FOR QUERY type= +213070643360900->>server:+PARSE name='', num_params=0, params_type=, query= +213070643360900->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360900->>server:+DESCRIBE kind='P', name='' +213070643360900->>server:+EXECUTE name='', nb_rows=1 +213070643360900->>server:+SYNC +server-->>213070643360900:-PARSE COMPLETE +server-->>213070643360900:-BIND COMPLETE +server-->>213070643360900:-NO DATA +server-->>213070643360900:-EMPTY QUERY RESPONSE +server-->>213070643360900:-READY FOR QUERY type= +213070643360900->>server:+PARSE name='', num_params=0, params_type=, query=SELECT pg_backend_pid() +213070643360900->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360900->>server:+DESCRIBE kind='P', name='' +213070643360900->>server:+EXECUTE name='', nb_rows=0 +213070643360900->>server:+SYNC +server-->>213070643360900:-PARSE COMPLETE +server-->>213070643360900:-BIND COMPLETE +server-->>213070643360900:-ROW DESCRIPTION: num_fields=1 ---[Field 01]--- name='pg_backend_pid' type=23 type_len=4 type_mod=4294967295 relid=0 attnum=0 format=0 +server-->>213070643360900:-DATA ROW num_values=1 ---[Value 0001]--- length=3 value='100' +server-->>213070643360900:-COMMAND COMPLETE command='SELECT 1' +server-->>213070643360900:-READY FOR QUERY type= +213070643360900->>server:+PARSE name='', num_params=0, params_type=, query=SELECT VERSION() AS version +213070643360900->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360900->>server:+DESCRIBE kind='P', name='' +213070643360900->>server:+EXECUTE name='', nb_rows=0 +213070643360900->>server:+SYNC +server-->>213070643360900:-PARSE COMPLETE +server-->>213070643360900:-BIND COMPLETE +server-->>213070643360900:-ROW DESCRIPTION: num_fields=1 ---[Field 01]--- name='version' type=25 type_len=65535 type_mod=4294967295 relid=0 attnum=0 format=0 +server-->>213070643360900:-DATA ROW num_values=1 ---[Value 0001]--- length=112 value='PostgreSQL 13.3 (Debian 13.3-1.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit' +server-->>213070643360900:-COMMAND COMPLETE command='SELECT 1' +server-->>213070643360900:-READY FOR QUERY type= +213070643360900->>server:+PARSE name='', num_params=0, params_type=, query= SELECT COUNT(*) FROM pg_type AS t0, pg_aggregate AS t1, pg_settings AS t2, pg_settings AS t3 +213070643360900->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360900->>server:+DESCRIBE kind='P', name='' +213070643360900->>server:+EXECUTE name='', nb_rows=0 +213070643360900->>server:+SYNC +213070643360904->>server:+SSL REQUEST +server-->>213070643360904:-SSL BACKEND ANSWER: N +213070643360904->>server:+STARTUP MESSAGE version: 3 database=trait_store extra_float_digits=2 TimeZone=GMT client_encoding=UTF8 user=docker DateStyle=ISO +server-->>213070643360904:-AUTHENTIFICATION REQUEST code=5 (MD5 salt='a03ee692') +213070643360904->>server:+PASSWORD MESSAGE password=md5cfedb52ae0cafa87a4f1066df3ba6802 +server-->>213070643360904:-AUTHENTIFICATION REQUEST code=0 (SUCCESS) +server-->>213070643360904:-PARAMETER STATUS name='application_name', value='' +server-->>213070643360904:-PARAMETER STATUS name='client_encoding', value='UTF8' +server-->>213070643360904:-PARAMETER STATUS name='DateStyle', value='ISO, MDY' +server-->>213070643360904:-PARAMETER STATUS name='integer_datetimes', value='on' +server-->>213070643360904:-PARAMETER STATUS name='IntervalStyle', value='postgres' +server-->>213070643360904:-PARAMETER STATUS name='is_superuser', value='on' +server-->>213070643360904:-PARAMETER STATUS name='server_encoding', value='UTF8' +server-->>213070643360904:-PARAMETER STATUS name='server_version', value='13.3 (Debian 13.3-1.pgdg100+1)' +server-->>213070643360904:-PARAMETER STATUS name='session_authorization', value='docker' +server-->>213070643360904:-PARAMETER STATUS name='standard_conforming_strings', value='on' +server-->>213070643360904:-PARAMETER STATUS name='TimeZone', value='GMT' +server-->>213070643360904:-BACKEND KEY DATA pid=101, key=2854304053 +server-->>213070643360904:-READY FOR QUERY type= +213070643360904->>server:+PARSE name='', num_params=0, params_type=, query=SET extra_float_digits = 3 +213070643360904->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360904->>server:+EXECUTE name='', nb_rows=1 +213070643360904->>server:+SYNC +server-->>213070643360904:-PARSE COMPLETE +server-->>213070643360904:-BIND COMPLETE +server-->>213070643360904:-COMMAND COMPLETE command='SET' +server-->>213070643360904:-READY FOR QUERY type= +213070643360904->>server:+PARSE name='', num_params=0, params_type=, query=SET application_name = 'PostgreSQL JDBC Driver' +213070643360904->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360904->>server:+EXECUTE name='', nb_rows=1 +213070643360904->>server:+SYNC +server-->>213070643360904:-PARSE COMPLETE +server-->>213070643360904:-BIND COMPLETE +server-->>213070643360904:-PARAMETER STATUS name='application_name', value='PostgreSQL JDBC Driver' +server-->>213070643360904:-COMMAND COMPLETE command='SET' +server-->>213070643360904:-READY FOR QUERY type= +213070643360904->>server:+PARSE name='', num_params=0, params_type=, query= +213070643360904->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360904->>server:+DESCRIBE kind='P', name='' +213070643360904->>server:+EXECUTE name='', nb_rows=1 +213070643360904->>server:+SYNC +server-->>213070643360904:-PARSE COMPLETE +server-->>213070643360904:-BIND COMPLETE +server-->>213070643360904:-NO DATA +server-->>213070643360904:-EMPTY QUERY RESPONSE +server-->>213070643360904:-READY FOR QUERY type= +213070643360904->>server:+DISCONNECT +213070643360908->>server:+SSL REQUEST +server-->>213070643360908:-SSL BACKEND ANSWER: N +213070643360908->>server:+STARTUP MESSAGE version: 3 database=trait_store extra_float_digits=2 TimeZone=GMT client_encoding=UTF8 user=docker DateStyle=ISO +server-->>213070643360908:-AUTHENTIFICATION REQUEST code=5 (MD5 salt='be3afb9d') +213070643360908->>server:+PASSWORD MESSAGE password=md57b5cfa30f89fc7733c814addcd548c03 +server-->>213070643360908:-AUTHENTIFICATION REQUEST code=0 (SUCCESS) +server-->>213070643360908:-PARAMETER STATUS name='application_name', value='' +server-->>213070643360908:-PARAMETER STATUS name='client_encoding', value='UTF8' +server-->>213070643360908:-PARAMETER STATUS name='DateStyle', value='ISO, MDY' +server-->>213070643360908:-PARAMETER STATUS name='integer_datetimes', value='on' +server-->>213070643360908:-PARAMETER STATUS name='IntervalStyle', value='postgres' +server-->>213070643360908:-PARAMETER STATUS name='is_superuser', value='on' +server-->>213070643360908:-PARAMETER STATUS name='server_encoding', value='UTF8' +server-->>213070643360908:-PARAMETER STATUS name='server_version', value='13.3 (Debian 13.3-1.pgdg100+1)' +server-->>213070643360908:-PARAMETER STATUS name='session_authorization', value='docker' +server-->>213070643360908:-PARAMETER STATUS name='standard_conforming_strings', value='on' +server-->>213070643360908:-PARAMETER STATUS name='TimeZone', value='GMT' +server-->>213070643360908:-BACKEND KEY DATA pid=102, key=3089396074 +server-->>213070643360908:-READY FOR QUERY type= +213070643360908->>server:+PARSE name='', num_params=0, params_type=, query=SET extra_float_digits = 3 +213070643360908->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360908->>server:+EXECUTE name='', nb_rows=1 +213070643360908->>server:+SYNC +server-->>213070643360908:-PARSE COMPLETE +server-->>213070643360908:-BIND COMPLETE +server-->>213070643360908:-COMMAND COMPLETE command='SET' +server-->>213070643360908:-READY FOR QUERY type= +213070643360908->>server:+PARSE name='', num_params=0, params_type=, query=SET application_name = 'PostgreSQL JDBC Driver' +213070643360908->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360908->>server:+EXECUTE name='', nb_rows=1 +213070643360908->>server:+SYNC +server-->>213070643360908:-PARSE COMPLETE +server-->>213070643360908:-BIND COMPLETE +server-->>213070643360908:-PARAMETER STATUS name='application_name', value='PostgreSQL JDBC Driver' +server-->>213070643360908:-COMMAND COMPLETE command='SET' +server-->>213070643360908:-READY FOR QUERY type= +213070643360908->>server:+PARSE name='', num_params=0, params_type=, query= +213070643360908->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360908->>server:+DESCRIBE kind='P', name='' +213070643360908->>server:+EXECUTE name='', nb_rows=1 +213070643360908->>server:+SYNC +server-->>213070643360908:-PARSE COMPLETE +server-->>213070643360908:-BIND COMPLETE +server-->>213070643360908:-NO DATA +server-->>213070643360908:-EMPTY QUERY RESPONSE +server-->>213070643360908:-READY FOR QUERY type= +213070643360908->>server:+PARSE name='', num_params=0, params_type=, query=SELECT VERSION() AS version +213070643360908->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360908->>server:+DESCRIBE kind='P', name='' +213070643360908->>server:+EXECUTE name='', nb_rows=0 +213070643360908->>server:+SYNC +server-->>213070643360908:-PARSE COMPLETE +server-->>213070643360908:-BIND COMPLETE +server-->>213070643360908:-ROW DESCRIPTION: num_fields=1 ---[Field 01]--- name='version' type=25 type_len=65535 type_mod=4294967295 relid=0 attnum=0 format=0 +server-->>213070643360908:-DATA ROW num_values=1 ---[Value 0001]--- length=112 value='PostgreSQL 13.3 (Debian 13.3-1.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit' +server-->>213070643360908:-COMMAND COMPLETE command='SELECT 1' +server-->>213070643360908:-READY FOR QUERY type= +213070643360908->>server:+PARSE name='', num_params=0, params_type=, query= +213070643360908->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360908->>server:+DESCRIBE kind='P', name='' +213070643360908->>server:+EXECUTE name='', nb_rows=1 +213070643360908->>server:+SYNC +server-->>213070643360908:-PARSE COMPLETE +server-->>213070643360908:-BIND COMPLETE +server-->>213070643360908:-NO DATA +server-->>213070643360908:-EMPTY QUERY RESPONSE +server-->>213070643360908:-READY FOR QUERY type= +213070643360908->>server:+PARSE name='', num_params=0, params_type=, query= SELECT pid as id, query as stmt, EXTRACT(seconds from query_start - NOW()) as elapsed_time FROM pg_stat_activity WHERE usename='docker' +213070643360908->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360908->>server:+DESCRIBE kind='P', name='' +213070643360908->>server:+EXECUTE name='', nb_rows=0 +213070643360908->>server:+SYNC +server-->>213070643360908:-PARSE COMPLETE +server-->>213070643360908:-BIND COMPLETE +server-->>213070643360908:-ROW DESCRIPTION: num_fields=3 ---[Field 01]--- name='id' type=23 type_len=4 type_mod=4294967295 relid=12250 attnum=3 format=0 ---[Field 02]--- name='stmt' type=25 type_len=65535 type_mod=4294967295 relid=12250 attnum=20 format=0 ---[Field 03]--- name='elapsed_time' type=701 type_len=8 type_mod=4294967295 relid=0 attnum=0 format=0 +server-->>213070643360908:-DATA ROW num_values=3 ---[Value 0001]--- length=2 value='81' ---[Value 0002]--- length=0 value='' ---[Value 0003]--- length=-1 value=NULL +server-->>213070643360908:-DATA ROW num_values=3 ---[Value 0001]--- length=3 value='100' ---[Value 0002]--- length=148 value=' SELECT COUNT(*). FROM pg_type AS t0,. pg_aggregate AS t1,. pg_settings AS t2,. pg_settings AS t3.' ---[Value 0003]--- length=9 value='-1.155449' +server-->>213070643360908:-DATA ROW num_values=3 ---[Value 0001]--- length=3 value='102' ---[Value 0002]--- length=190 value=' SELECT pid as id,. query as stmt,. EXTRACT(seconds from query_start - NOW()) as elapsed_time. FROM pg_stat_activity. WHERE usename='docker'.' ---[Value 0003]--- length=8 value='0.002903' +server-->>213070643360908:-COMMAND COMPLETE command='SELECT 3' +server-->>213070643360908:-READY FOR QUERY type= +213070643360912->>server:+SSL REQUEST +server-->>213070643360912:-SSL BACKEND ANSWER: N +213070643360912->>server:+STARTUP MESSAGE version: 3 database=trait_store extra_float_digits=2 TimeZone=GMT client_encoding=UTF8 user=docker DateStyle=ISO +server-->>213070643360912:-AUTHENTIFICATION REQUEST code=5 (MD5 salt='14444412') +213070643360912->>server:+PASSWORD MESSAGE password=md59cef18c88b7988d7ac2f215fc1569c62 +server-->>213070643360912:-AUTHENTIFICATION REQUEST code=0 (SUCCESS) +server-->>213070643360912:-PARAMETER STATUS name='application_name', value='' +server-->>213070643360912:-PARAMETER STATUS name='client_encoding', value='UTF8' +server-->>213070643360912:-PARAMETER STATUS name='DateStyle', value='ISO, MDY' +server-->>213070643360912:-PARAMETER STATUS name='integer_datetimes', value='on' +server-->>213070643360912:-PARAMETER STATUS name='IntervalStyle', value='postgres' +server-->>213070643360912:-PARAMETER STATUS name='is_superuser', value='on' +server-->>213070643360912:-PARAMETER STATUS name='server_encoding', value='UTF8' +server-->>213070643360912:-PARAMETER STATUS name='server_version', value='13.3 (Debian 13.3-1.pgdg100+1)' +server-->>213070643360912:-PARAMETER STATUS name='session_authorization', value='docker' +server-->>213070643360912:-PARAMETER STATUS name='standard_conforming_strings', value='on' +server-->>213070643360912:-PARAMETER STATUS name='TimeZone', value='GMT' +server-->>213070643360912:-BACKEND KEY DATA pid=103, key=1911102642 +server-->>213070643360912:-READY FOR QUERY type= +213070643360912->>server:+PARSE name='', num_params=0, params_type=, query=SET extra_float_digits = 3 +213070643360912->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360912->>server:+EXECUTE name='', nb_rows=1 +213070643360912->>server:+SYNC +server-->>213070643360912:-PARSE COMPLETE +server-->>213070643360912:-BIND COMPLETE +server-->>213070643360912:-COMMAND COMPLETE command='SET' +server-->>213070643360912:-READY FOR QUERY type= +213070643360912->>server:+PARSE name='', num_params=0, params_type=, query=SET application_name = 'PostgreSQL JDBC Driver' +213070643360912->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360912->>server:+EXECUTE name='', nb_rows=1 +213070643360912->>server:+SYNC +server-->>213070643360912:-PARSE COMPLETE +server-->>213070643360912:-BIND COMPLETE +server-->>213070643360912:-PARAMETER STATUS name='application_name', value='PostgreSQL JDBC Driver' +server-->>213070643360912:-COMMAND COMPLETE command='SET' +server-->>213070643360912:-READY FOR QUERY type= +213070643360912->>server:+PARSE name='', num_params=0, params_type=, query= +213070643360912->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360912->>server:+DESCRIBE kind='P', name='' +213070643360912->>server:+EXECUTE name='', nb_rows=1 +213070643360912->>server:+SYNC +server-->>213070643360912:-PARSE COMPLETE +server-->>213070643360912:-BIND COMPLETE +server-->>213070643360912:-NO DATA +server-->>213070643360912:-EMPTY QUERY RESPONSE +server-->>213070643360912:-READY FOR QUERY type= +213070643360912->>server:+DISCONNECT +213070643360916->>server:+SSL REQUEST +server-->>213070643360916:-SSL BACKEND ANSWER: N +213070643360916->>server:+STARTUP MESSAGE version: 3 database=trait_store extra_float_digits=2 TimeZone=GMT client_encoding=UTF8 user=docker DateStyle=ISO +server-->>213070643360916:-AUTHENTIFICATION REQUEST code=5 (MD5 salt='9eb7546f') +213070643360916->>server:+PASSWORD MESSAGE password=md5c7655226306ab14fa17e44dba876a348 +server-->>213070643360916:-AUTHENTIFICATION REQUEST code=0 (SUCCESS) +server-->>213070643360916:-PARAMETER STATUS name='application_name', value='' +server-->>213070643360916:-PARAMETER STATUS name='client_encoding', value='UTF8' +server-->>213070643360916:-PARAMETER STATUS name='DateStyle', value='ISO, MDY' +server-->>213070643360916:-PARAMETER STATUS name='integer_datetimes', value='on' +server-->>213070643360916:-PARAMETER STATUS name='IntervalStyle', value='postgres' +server-->>213070643360916:-PARAMETER STATUS name='is_superuser', value='on' +server-->>213070643360916:-PARAMETER STATUS name='server_encoding', value='UTF8' +server-->>213070643360916:-PARAMETER STATUS name='server_version', value='13.3 (Debian 13.3-1.pgdg100+1)' +server-->>213070643360916:-PARAMETER STATUS name='session_authorization', value='docker' +server-->>213070643360916:-PARAMETER STATUS name='standard_conforming_strings', value='on' +server-->>213070643360916:-PARAMETER STATUS name='TimeZone', value='GMT' +server-->>213070643360916:-BACKEND KEY DATA pid=104, key=927987783 +server-->>213070643360916:-READY FOR QUERY type= +213070643360916->>server:+PARSE name='', num_params=0, params_type=, query=SET extra_float_digits = 3 +213070643360916->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360916->>server:+EXECUTE name='', nb_rows=1 +213070643360916->>server:+SYNC +server-->>213070643360916:-PARSE COMPLETE +server-->>213070643360916:-BIND COMPLETE +server-->>213070643360916:-COMMAND COMPLETE command='SET' +server-->>213070643360916:-READY FOR QUERY type= +213070643360916->>server:+PARSE name='', num_params=0, params_type=, query=SET application_name = 'PostgreSQL JDBC Driver' +213070643360916->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360916->>server:+EXECUTE name='', nb_rows=1 +213070643360916->>server:+SYNC +server-->>213070643360916:-PARSE COMPLETE +server-->>213070643360916:-BIND COMPLETE +server-->>213070643360916:-PARAMETER STATUS name='application_name', value='PostgreSQL JDBC Driver' +server-->>213070643360916:-COMMAND COMPLETE command='SET' +server-->>213070643360916:-READY FOR QUERY type= +213070643360916->>server:+PARSE name='', num_params=0, params_type=, query= +213070643360916->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360916->>server:+DESCRIBE kind='P', name='' +213070643360916->>server:+EXECUTE name='', nb_rows=1 +213070643360916->>server:+SYNC +server-->>213070643360916:-PARSE COMPLETE +server-->>213070643360916:-BIND COMPLETE +server-->>213070643360916:-NO DATA +server-->>213070643360916:-EMPTY QUERY RESPONSE +server-->>213070643360916:-READY FOR QUERY type= +213070643360916->>server:+PARSE name='', num_params=0, params_type=, query=select pg_terminate_backend(100) +213070643360916->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360916->>server:+DESCRIBE kind='P', name='' +213070643360916->>server:+EXECUTE name='', nb_rows=0 +213070643360916->>server:+SYNC +server-->>213070643360916:-PARSE COMPLETE +server-->>213070643360916:-BIND COMPLETE +server-->>213070643360916:-ROW DESCRIPTION: num_fields=1 ---[Field 01]--- name='pg_terminate_backend' type=16 type_len=1 type_mod=4294967295 relid=0 attnum=0 format=0 +server-->>213070643360916:-DATA ROW num_values=1 ---[Value 0001]--- length=1 value='t' +server-->>213070643360916:-COMMAND COMPLETE command='SELECT 1' +server-->>213070643360916:-READY FOR QUERY type= +server-->>213070643360900:-PARSE COMPLETE +server-->>213070643360900:-BIND COMPLETE +server-->>213070643360900:-ROW DESCRIPTION: num_fields=1 ---[Field 01]--- name='count' type=20 type_len=8 type_mod=4294967295 relid=0 attnum=0 format=0 +server-->>213070643360900:-ERROR RESPONSE File: 'postgres.c' Severity: 'FATAL' Message: 'terminating connection due to administrator command' Code: '57P01' Routine: 'ProcessInterrupts' Line: '3090' +213070643360908->>server:+DISCONNECT +213070643360916->>server:+DISCONNECT +213070643360920->>server:+SSL REQUEST +server-->>213070643360920:-SSL BACKEND ANSWER: N +213070643360920->>server:+STARTUP MESSAGE version: 3 database=trait_store extra_float_digits=2 TimeZone=GMT client_encoding=UTF8 user=docker DateStyle=ISO +server-->>213070643360920:-AUTHENTIFICATION REQUEST code=5 (MD5 salt='1ad4dcf7') +213070643360920->>server:+PASSWORD MESSAGE password=md554de511c5219f67a8bbe92da445fa5a2 +server-->>213070643360920:-AUTHENTIFICATION REQUEST code=0 (SUCCESS) +server-->>213070643360920:-PARAMETER STATUS name='application_name', value='' +server-->>213070643360920:-PARAMETER STATUS name='client_encoding', value='UTF8' +server-->>213070643360920:-PARAMETER STATUS name='DateStyle', value='ISO, MDY' +server-->>213070643360920:-PARAMETER STATUS name='integer_datetimes', value='on' +server-->>213070643360920:-PARAMETER STATUS name='IntervalStyle', value='postgres' +server-->>213070643360920:-PARAMETER STATUS name='is_superuser', value='on' +server-->>213070643360920:-PARAMETER STATUS name='server_encoding', value='UTF8' +server-->>213070643360920:-PARAMETER STATUS name='server_version', value='13.3 (Debian 13.3-1.pgdg100+1)' +server-->>213070643360920:-PARAMETER STATUS name='session_authorization', value='docker' +server-->>213070643360920:-PARAMETER STATUS name='standard_conforming_strings', value='on' +server-->>213070643360920:-PARAMETER STATUS name='TimeZone', value='GMT' +server-->>213070643360920:-BACKEND KEY DATA pid=105, key=3630332440 +server-->>213070643360920:-READY FOR QUERY type= +213070643360920->>server:+PARSE name='', num_params=0, params_type=, query=SET extra_float_digits = 3 +213070643360920->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360920->>server:+EXECUTE name='', nb_rows=1 +213070643360920->>server:+SYNC +server-->>213070643360920:-PARSE COMPLETE +server-->>213070643360920:-BIND COMPLETE +server-->>213070643360920:-COMMAND COMPLETE command='SET' +server-->>213070643360920:-READY FOR QUERY type= +213070643360920->>server:+PARSE name='', num_params=0, params_type=, query=SET application_name = 'PostgreSQL JDBC Driver' +213070643360920->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360920->>server:+EXECUTE name='', nb_rows=1 +213070643360920->>server:+SYNC +server-->>213070643360920:-PARSE COMPLETE +server-->>213070643360920:-BIND COMPLETE +server-->>213070643360920:-PARAMETER STATUS name='application_name', value='PostgreSQL JDBC Driver' +server-->>213070643360920:-COMMAND COMPLETE command='SET' +server-->>213070643360920:-READY FOR QUERY type= +213070643360920->>server:+PARSE name='', num_params=0, params_type=, query= +213070643360920->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360920->>server:+DESCRIBE kind='P', name='' +213070643360920->>server:+EXECUTE name='', nb_rows=1 +213070643360920->>server:+SYNC +server-->>213070643360920:-PARSE COMPLETE +server-->>213070643360920:-BIND COMPLETE +server-->>213070643360920:-NO DATA +server-->>213070643360920:-EMPTY QUERY RESPONSE +server-->>213070643360920:-READY FOR QUERY type= +213070643360920->>server:+DISCONNECT +213070643360924->>server:+SSL REQUEST +server-->>213070643360924:-SSL BACKEND ANSWER: N +213070643360924->>server:+STARTUP MESSAGE version: 3 database=trait_store extra_float_digits=2 TimeZone=GMT client_encoding=UTF8 user=docker DateStyle=ISO +server-->>213070643360924:-AUTHENTIFICATION REQUEST code=5 (MD5 salt='494c352f') +213070643360924->>server:+PASSWORD MESSAGE password=md5919fc9ed056904fa0d8e1dd00625a556 +server-->>213070643360924:-AUTHENTIFICATION REQUEST code=0 (SUCCESS) +server-->>213070643360924:-PARAMETER STATUS name='application_name', value='' +server-->>213070643360924:-PARAMETER STATUS name='client_encoding', value='UTF8' +server-->>213070643360924:-PARAMETER STATUS name='DateStyle', value='ISO, MDY' +server-->>213070643360924:-PARAMETER STATUS name='integer_datetimes', value='on' +server-->>213070643360924:-PARAMETER STATUS name='IntervalStyle', value='postgres' +server-->>213070643360924:-PARAMETER STATUS name='is_superuser', value='on' +server-->>213070643360924:-PARAMETER STATUS name='server_encoding', value='UTF8' +server-->>213070643360924:-PARAMETER STATUS name='server_version', value='13.3 (Debian 13.3-1.pgdg100+1)' +server-->>213070643360924:-PARAMETER STATUS name='session_authorization', value='docker' +server-->>213070643360924:-PARAMETER STATUS name='standard_conforming_strings', value='on' +server-->>213070643360924:-PARAMETER STATUS name='TimeZone', value='GMT' +server-->>213070643360924:-BACKEND KEY DATA pid=106, key=3364308023 +server-->>213070643360924:-READY FOR QUERY type= +213070643360924->>server:+PARSE name='', num_params=0, params_type=, query=SET extra_float_digits = 3 +213070643360924->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360924->>server:+EXECUTE name='', nb_rows=1 +213070643360924->>server:+SYNC +server-->>213070643360924:-PARSE COMPLETE +server-->>213070643360924:-BIND COMPLETE +server-->>213070643360924:-COMMAND COMPLETE command='SET' +server-->>213070643360924:-READY FOR QUERY type= +213070643360924->>server:+PARSE name='', num_params=0, params_type=, query=SET application_name = 'PostgreSQL JDBC Driver' +213070643360924->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360924->>server:+EXECUTE name='', nb_rows=1 +213070643360924->>server:+SYNC +server-->>213070643360924:-PARSE COMPLETE +server-->>213070643360924:-BIND COMPLETE +server-->>213070643360924:-PARAMETER STATUS name='application_name', value='PostgreSQL JDBC Driver' +server-->>213070643360924:-COMMAND COMPLETE command='SET' +server-->>213070643360924:-READY FOR QUERY type= +213070643360924->>server:+PARSE name='', num_params=0, params_type=, query= +213070643360924->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360924->>server:+DESCRIBE kind='P', name='' +213070643360924->>server:+EXECUTE name='', nb_rows=1 +213070643360924->>server:+SYNC +server-->>213070643360924:-PARSE COMPLETE +server-->>213070643360924:-BIND COMPLETE +server-->>213070643360924:-NO DATA +server-->>213070643360924:-EMPTY QUERY RESPONSE +server-->>213070643360924:-READY FOR QUERY type= +213070643360924->>server:+PARSE name='', num_params=0, params_type=, query=SELECT 1 +213070643360924->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360924->>server:+DESCRIBE kind='P', name='' +213070643360924->>server:+EXECUTE name='', nb_rows=0 +213070643360924->>server:+SYNC +server-->>213070643360924:-PARSE COMPLETE +server-->>213070643360924:-BIND COMPLETE +server-->>213070643360924:-ROW DESCRIPTION: num_fields=1 ---[Field 01]--- name='?column?' type=23 type_len=4 type_mod=4294967295 relid=0 attnum=0 format=0 +server-->>213070643360924:-DATA ROW num_values=1 ---[Value 0001]--- length=1 value='1' +server-->>213070643360924:-COMMAND COMPLETE command='SELECT 1' +server-->>213070643360924:-READY FOR QUERY type= +213070643360924->>server:+DISCONNECT +213070643360928->>server:+SSL REQUEST +server-->>213070643360928:-SSL BACKEND ANSWER: N +213070643360928->>server:+STARTUP MESSAGE version: 3 database=trait_store extra_float_digits=2 TimeZone=GMT client_encoding=UTF8 user=docker DateStyle=ISO +server-->>213070643360928:-AUTHENTIFICATION REQUEST code=5 (MD5 salt='4b2173db') +213070643360928->>server:+PASSWORD MESSAGE password=md53977c39c5c7cdef7f80e74b256a8ce25 +server-->>213070643360928:-AUTHENTIFICATION REQUEST code=0 (SUCCESS) +server-->>213070643360928:-PARAMETER STATUS name='application_name', value='' +server-->>213070643360928:-PARAMETER STATUS name='client_encoding', value='UTF8' +server-->>213070643360928:-PARAMETER STATUS name='DateStyle', value='ISO, MDY' +server-->>213070643360928:-PARAMETER STATUS name='integer_datetimes', value='on' +server-->>213070643360928:-PARAMETER STATUS name='IntervalStyle', value='postgres' +server-->>213070643360928:-PARAMETER STATUS name='is_superuser', value='on' +server-->>213070643360928:-PARAMETER STATUS name='server_encoding', value='UTF8' +server-->>213070643360928:-PARAMETER STATUS name='server_version', value='13.3 (Debian 13.3-1.pgdg100+1)' +server-->>213070643360928:-PARAMETER STATUS name='session_authorization', value='docker' +server-->>213070643360928:-PARAMETER STATUS name='standard_conforming_strings', value='on' +server-->>213070643360928:-PARAMETER STATUS name='TimeZone', value='GMT' +server-->>213070643360928:-BACKEND KEY DATA pid=107, key=1988416582 +server-->>213070643360928:-READY FOR QUERY type= +213070643360928->>server:+PARSE name='', num_params=0, params_type=, query=SET extra_float_digits = 3 +213070643360928->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360928->>server:+EXECUTE name='', nb_rows=1 +213070643360928->>server:+SYNC +server-->>213070643360928:-PARSE COMPLETE +server-->>213070643360928:-BIND COMPLETE +server-->>213070643360928:-COMMAND COMPLETE command='SET' +server-->>213070643360928:-READY FOR QUERY type= +213070643360928->>server:+PARSE name='', num_params=0, params_type=, query=SET application_name = 'PostgreSQL JDBC Driver' +213070643360928->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360928->>server:+EXECUTE name='', nb_rows=1 +213070643360928->>server:+SYNC +server-->>213070643360928:-PARSE COMPLETE +server-->>213070643360928:-BIND COMPLETE +server-->>213070643360928:-PARAMETER STATUS name='application_name', value='PostgreSQL JDBC Driver' +server-->>213070643360928:-COMMAND COMPLETE command='SET' +server-->>213070643360928:-READY FOR QUERY type= +213070643360928->>server:+PARSE name='', num_params=0, params_type=, query= +213070643360928->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360928->>server:+DESCRIBE kind='P', name='' +213070643360928->>server:+EXECUTE name='', nb_rows=1 +213070643360928->>server:+SYNC +server-->>213070643360928:-PARSE COMPLETE +server-->>213070643360928:-BIND COMPLETE +server-->>213070643360928:-NO DATA +server-->>213070643360928:-EMPTY QUERY RESPONSE +server-->>213070643360928:-READY FOR QUERY type= +213070643360928->>server:+DISCONNECT +213070643360932->>server:+SSL REQUEST +server-->>213070643360932:-SSL BACKEND ANSWER: N +213070643360932->>server:+STARTUP MESSAGE version: 3 database=trait_store extra_float_digits=2 TimeZone=GMT client_encoding=UTF8 user=docker DateStyle=ISO +server-->>213070643360932:-AUTHENTIFICATION REQUEST code=5 (MD5 salt='f6d0f51d') +213070643360932->>server:+PASSWORD MESSAGE password=md5b5b322fe9bcc7c242c6b44cc8a7898e8 +server-->>213070643360932:-AUTHENTIFICATION REQUEST code=0 (SUCCESS) +server-->>213070643360932:-PARAMETER STATUS name='application_name', value='' +server-->>213070643360932:-PARAMETER STATUS name='client_encoding', value='UTF8' +server-->>213070643360932:-PARAMETER STATUS name='DateStyle', value='ISO, MDY' +server-->>213070643360932:-PARAMETER STATUS name='integer_datetimes', value='on' +server-->>213070643360932:-PARAMETER STATUS name='IntervalStyle', value='postgres' +server-->>213070643360932:-PARAMETER STATUS name='is_superuser', value='on' +server-->>213070643360932:-PARAMETER STATUS name='server_encoding', value='UTF8' +server-->>213070643360932:-PARAMETER STATUS name='server_version', value='13.3 (Debian 13.3-1.pgdg100+1)' +server-->>213070643360932:-PARAMETER STATUS name='session_authorization', value='docker' +server-->>213070643360932:-PARAMETER STATUS name='standard_conforming_strings', value='on' +server-->>213070643360932:-PARAMETER STATUS name='TimeZone', value='GMT' +server-->>213070643360932:-BACKEND KEY DATA pid=108, key=997991029 +server-->>213070643360932:-READY FOR QUERY type= +213070643360932->>server:+PARSE name='', num_params=0, params_type=, query=SET extra_float_digits = 3 +213070643360932->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360932->>server:+EXECUTE name='', nb_rows=1 +213070643360932->>server:+SYNC +server-->>213070643360932:-PARSE COMPLETE +server-->>213070643360932:-BIND COMPLETE +server-->>213070643360932:-COMMAND COMPLETE command='SET' +server-->>213070643360932:-READY FOR QUERY type= +213070643360932->>server:+PARSE name='', num_params=0, params_type=, query=SET application_name = 'PostgreSQL JDBC Driver' +213070643360932->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360932->>server:+EXECUTE name='', nb_rows=1 +213070643360932->>server:+SYNC +server-->>213070643360932:-PARSE COMPLETE +server-->>213070643360932:-BIND COMPLETE +server-->>213070643360932:-PARAMETER STATUS name='application_name', value='PostgreSQL JDBC Driver' +server-->>213070643360932:-COMMAND COMPLETE command='SET' +server-->>213070643360932:-READY FOR QUERY type= +213070643360932->>server:+PARSE name='', num_params=0, params_type=, query= +213070643360932->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360932->>server:+DESCRIBE kind='P', name='' +213070643360932->>server:+EXECUTE name='', nb_rows=1 +213070643360932->>server:+SYNC +server-->>213070643360932:-PARSE COMPLETE +server-->>213070643360932:-BIND COMPLETE +server-->>213070643360932:-NO DATA +server-->>213070643360932:-EMPTY QUERY RESPONSE +server-->>213070643360932:-READY FOR QUERY type= +213070643360932->>server:+PARSE name='', num_params=0, params_type=, query=SELECT VERSION() AS version +213070643360932->>server:+BIND portal='', name='', num_formats=0, formats=, num_params=0, params= +213070643360932->>server:+DESCRIBE kind='P', name='' +213070643360932->>server:+EXECUTE name='', nb_rows=0 +213070643360932->>server:+SYNC +server-->>213070643360932:-PARSE COMPLETE +server-->>213070643360932:-BIND COMPLETE +server-->>213070643360932:-ROW DESCRIPTION: num_fields=1 ---[Field 01]--- name='version' type=25 type_len=65535 type_mod=4294967295 relid=0 attnum=0 format=0 +server-->>213070643360932:-DATA ROW num_values=1 ---[Value 0001]--- length=112 value='PostgreSQL 13.3 (Debian 13.3-1.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit' +server-->>213070643360932:-COMMAND COMPLETE command='SELECT 1' +server-->>213070643360932:-READY FOR QUERY type= +213070643360932->>server:+DISCONNECT +``` diff --git a/pg/message/io.go b/pg/message/io.go index e09150b9d..ec2321675 100644 --- a/pg/message/io.go +++ b/pg/message/io.go @@ -18,6 +18,7 @@ import ( "bufio" "encoding/binary" "errors" + "fmt" "io" ) @@ -92,6 +93,7 @@ type WireWriter struct { // WriteMessage writes a message onto the wire. func (w *WireWriter) WriteMessage(message Message) error { + fmt.Printf("SendToClient %c (%d)\n", message.Type, len(message.Data)) if uint(len(message.Data))+4 >= 1<<31 { return ErrMessageTooBig } diff --git a/pg/message/message.go b/pg/message/message.go index caf8214d3..5d6f67014 100644 --- a/pg/message/message.go +++ b/pg/message/message.go @@ -17,6 +17,7 @@ package message import ( "bytes" "encoding/binary" + "fmt" ) // Type is a byte indicating the type of a Postgres message. @@ -29,11 +30,11 @@ const ( // TypeReadyForQuery is a message used to indicate that the server is ready for another query. TypeReadyForQuery Type = 'Z' - // TypeCommandComplete is a message used to indicate that a query has completed. + // TypeCommandComplete is a message used to indicate that a query has completed. Backend TypeCommandComplete Type = 'C' - // TypeError is an error message. - TypeError Type = 'E' + // TypeClos is a message used to indicate that a query has completed. Frontend + TypeClose Type = 'C' // TypeRowDescription is a message indicating the column types of the result rows from a query. TypeRowDescription Type = 'T' @@ -52,6 +53,20 @@ const ( // TypeBackendKeyData contains a cancellation key for the client to use later. TypeBackendKeyData Type = 'K' + + TypeParse Type = 'P' + TypeParseComplete Type = '1' + + TypeBind Type = 'B' + TypeBindComplete Type = '2' + + TypeExecute Type = 'E' // Frontend TODO(TWG) + TypeError Type = 'E' // Backend SOMETHING NOT RIGHT HERE + TypeSync Type = 'S' // Frontend + TypeParameterStatus Type = 'S' // Backend + TypeDescribe Type = 'D' // Frontend + TypeNoData Type = 'n' // backend + TypeEmptyQueryResponse Type = 'I' // backend ) // AuthenticationOK is a message indicating that authentication has completed. @@ -59,6 +74,22 @@ var AuthenticationOK = Message{ Type: TypeAuthentication, Data: []byte{0, 0, 0, 0}, } +var ParseOK = Message{ + Type: TypeParseComplete, + Data: []byte{}, +} +var BindComplete = Message{ + Type: TypeBindComplete, + Data: []byte{}, +} +var NoData = Message{ + Type: TypeNoData, + Data: []byte{}, +} +var EmptyQueryResponse = Message{ + Type: TypeEmptyQueryResponse, + Data: []byte{}, +} // Message is a Postgres message value. type Message struct { @@ -66,6 +97,49 @@ type Message struct { Data []byte } +//debug tools +func viewString(b []byte) string { + r := []rune(string(b)) + for i := range r { + if r[i] < 32 || r[i] > 126 { + r[i] = '.' + } + } + return string(r) +} +func min(a, b int) int { + if a < b { + return a + } + return b +} +func (m *Message) Dump(prefix string) { + n := len(m.Data) + rowcount := 0 + stop := (n / 8) * 8 + k := 0 + fmt.Printf("\n %s type: '%c'\n", prefix, m.Type) + for i := 0; i <= stop; i += 8 { + k++ + if i+8 < n { + rowcount = 8 + } else { + rowcount = min(k*8, n) % 8 + } + + fmt.Printf("pos %02d hex: ", i) + for j := 0; j < rowcount; j++ { + fmt.Printf("%02x ", m.Data[i+j]) + } + for j := rowcount; j < 8; j++ { + fmt.Printf(" ") + } + fmt.Printf(" '%s'\n", viewString(m.Data[i:(i+rowcount)])) + } +} + +//endTools + // TransactionStatus is the current transaction state. type TransactionStatus byte @@ -98,6 +172,12 @@ func (e *Encoder) i32(i int32) error { return err } +func (e *Encoder) u32(i uint32) error { + binary.BigEndian.PutUint32(e.scratch[:], i) + _, err := e.buf.Write(e.scratch[:]) + return err +} + // ReadyForQuery encodes a "ready for query" message. func (e *Encoder) ReadyForQuery(status TransactionStatus) (Message, error) { e.buf.Reset() @@ -149,6 +229,9 @@ const ( // NoticeFieldHint is a suggestion of how to address the issue. NoticeFieldHint NoticeFieldType = 'H' + + // NoticeFieldHint the SQLSTATE code for the error (see Appendix A). Not localizable. Always present. + NoticeFieldCode NoticeFieldType = 'C' ) // NoticeField is a field in an error or notice. @@ -365,3 +448,95 @@ func (e *Encoder) BackendKeyData(pid, key int32) (Message, error) { Data: e.buf.Bytes(), }, nil } + +func (e *Encoder) ParameterStatus(param, value string) (Message, error) { + e.buf.Reset() + //param + NULL + value+ NULL + _, err := e.buf.WriteString(param) + if err != nil { + return Message{}, err + } + err = e.buf.WriteByte(0) + if err != nil { + return Message{}, err + } + _, err = e.buf.WriteString(value) + if err != nil { + return Message{}, err + } + err = e.buf.WriteByte(0) + if err != nil { + return Message{}, err + } + return Message{ + Type: TypeParameterStatus, + Data: e.buf.Bytes(), + }, nil +} + +type SimpleColumn struct { + Name string + Typeid int32 + Typelen int16 +} + +func (e *Encoder) EncodeColumn(name string, typeid int32, typelen int16) (Message, error) { + return e.EncodeColumns(SimpleColumn{ + Name: name, + Typeid: typeid, + Typelen: typelen, + }) +} +func (e *Encoder) EncodeColumns(cols ...SimpleColumn) (Message, error) { + + e.buf.Reset() + err := e.i16(int16(len(cols))) // number of columns in result + if err != nil { + return Message{}, nil + } + for _, col := range cols { + + _, err = e.buf.WriteString(col.Name) // column name + if err != nil { + return Message{}, err + } + err = e.buf.WriteByte(0) //null terminate + if err != nil { + return Message{}, err + } + + err = e.i32(0) //tabel id + if err != nil { + return Message{}, err + } + + err = e.i16(0) //field id(attnum) + if err != nil { + return Message{}, err + } + + err = e.i32(col.Typeid) //type_id + if err != nil { + return Message{}, err + } + + err = e.i16(col.Typelen) //type_len + if err != nil { + return Message{}, err + } + + err = e.i32(-1) //type_mod + if err != nil { + return Message{}, err + } + + err = e.i16(0) //format 0 text 1 binary + if err != nil { + return Message{}, err + } + } + return Message{ + Type: TypeRowDescription, + Data: e.buf.Bytes(), + }, nil +} diff --git a/pg/protocol.go b/pg/protocol.go index 222a9055f..754e128e3 100644 --- a/pg/protocol.go +++ b/pg/protocol.go @@ -30,7 +30,10 @@ import ( "time" "github.com/molecula/featurebase/v2/pg/message" + "github.com/molecula/featurebase/v2/sql" + "github.com/molecula/featurebase/v2/vprint" "github.com/pkg/errors" + "vitess.io/vitess/go/vt/sqlparser" ) // Protocol is a Postgres protocol version. @@ -48,6 +51,9 @@ const ( // ProtocolSupported is the main protocol version supported by this package. ProtocolSupported Protocol = ProtocolPostgres30 + + // PgServerVersion is the latest version of postgres that we claim to support. + PgServerVersion = "13.0.0" ) // Major returns the major revision of the protocol. @@ -170,6 +176,7 @@ startup: // Reject the unsecured connection. return errors.Errorf("client at %s attempted to initiate an unsecured postgres conenction", conn.RemoteAddr()) } + vprint.VV("TProcotcol: %v", proto) switch proto { case ProtocolCancel: @@ -209,6 +216,7 @@ func parseParams(data []byte) (map[string]string, error) { // handleCancel handles cancel request connections. func (s *Server) handleCancel(ctx context.Context, conn net.Conn, data []byte) error { + vprint.VV("handle cancel") if len(data) != 8 { return errors.New("malformed cancellation packet") } @@ -220,6 +228,7 @@ func (s *Server) handleCancel(ctx context.Context, conn net.Conn, data []byte) e pid := int32(binary.BigEndian.Uint32(data[:4])) key := int32(binary.BigEndian.Uint32(data[4:])) + vprint.VV("cancel pid:%v key:%v", pid, key) err := s.CancellationManager.Cancel(CancellationToken{PID: pid, Key: key}) switch err { case nil: @@ -233,6 +242,370 @@ func (s *Server) handleCancel(ctx context.Context, conn net.Conn, data []byte) e return nil } +func (s *Server) SendParameterStatus(w *message.WireWriter, param, value string, encoder *message.Encoder) error { + msg, err := encoder.ParameterStatus(param, value) + if err != nil { + return err + } + err = w.WriteMessage(msg) + if err != nil { + return errors.Wrap(err, "sending parameter status") + } + return nil +} + +type Result struct { +} +type PgType byte + +const ( + pgNotPg PgType = 'x' + pgBackendPid PgType = 'a' + pgVersion PgType = 'b' + pgCountType PgType = 'c' + pgQueryTime PgType = 'd' + pgTerminate PgType = 'e' + pgEmpty PgType = 'f' + pgSetApplication PgType = 'g' + pgSelect1 PgType = 'h' + pgSchema PgType = 'i' + pgBegin PgType = 'j' +) + +type Portal struct { + Name string + Writer *message.WireWriter + commands []message.Message + Encoder *message.Encoder + mapper *sql.Mapper + results []Result + sql string + pgspecial PgType + pid int32 + queryStart time.Time + server *Server + cancelNotify <-chan struct{} +} + +func (p *Portal) Reset() { + vprint.VV("Portal Reset") + p.Name = "" + p.sql = "" + p.pgspecial = pgNotPg + p.commands = p.commands[:0] +} + +func (p *Portal) Bind() { + p.Add(message.BindComplete) +} +func (p *Portal) Parse(data []byte) { + p.queryStart = time.Now() + b := bytes.Trim(data, "\x00") + vprint.VV("PARSE RAW: (%v) (%d)", string(b), len(b)) + if strings.Contains(string(b), "EXTRACT") { + // had to add this hack because the vitis parser doesn't handle... + /* + SELECT pid as id, + query as stmt, + EXTRACT(seconds from query_start - NOW()) as elapsed_time + FROM pg_stat_activity + WHERE usename='docker'` + */ + p.pgspecial = pgQueryTime + p.Name = "SELECT" + p.sql = string(b) + p.Add(message.ParseOK) + return + } + + if len(b) > 2 { + + query, err := p.mapper.MapSQL(string(b)) + if err != nil { + vprint.VV("Parse Err: '%v'", err) + } else { + + vprint.VV("TODD Query: %#v", query.SQL) + if strings.Contains(strings.ToLower(query.SQL), "select 1") { + vprint.VV("SQL1") + p.pgspecial = pgSelect1 + p.Name = "SELECT" + } else { + switch query.SQLType { + case sql.SQLTypeSet: + p.Name = "SET" + set := query.Statement.(*sqlparser.Set) + for _, item := range set.Exprs { + vprint.VV("SET name=(%v) ", item.Name) + if item.Name.String() == "application_name" { + vprint.VV("SET expr=(%#v) ", item.Expr) + switch val := item.Expr.(type) { + case *sqlparser.SQLVal: + vprint.VV("getting %v (%v)", val.Type, string(val.Val)) + p.pgspecial = pgSetApplication + } + } + } + case sql.SQLTypeSelect: + p.Name = "SELECT" + p.pgspecial = pgNotPg + stmt := query.Statement.(*sqlparser.Select) + for _, item := range stmt.SelectExprs { + switch expr := item.(type) { + case *sqlparser.AliasedExpr: + switch colExpr := expr.Expr.(type) { + case *sqlparser.FuncExpr: + funcName := strings.ToLower(colExpr.Name.String()) + switch funcName { + case "pg_backend_pid": + //SELECT pg_backend_pid() + p.pgspecial = pgBackendPid + //p.encoder.RowDescription() //TODO(twg) move to the right spt + case "pg_terminate_backend": + //need the arg 100 + //select pg_terminate_backend(100) + vprint.VV("terminate %#v", colExpr.Exprs) + //colExpr.Exprs[0] + p.pgspecial = pgTerminate + case "version": + //SELECT VERSION() AS version + p.pgspecial = pgVersion + } + //need to return the pid from the cancelation object + //add row description object + //add data row for item + } + } + + } + for _, item := range stmt.From { + switch from := item.(type) { + case *sqlparser.AliasedTableExpr: + tableName := from.Expr.(sqlparser.TableName).ToViewName().Name.String() + vprint.VV("looking at (%v)", tableName) + switch tableName { + case "pg_type": + p.pgspecial = pgCountType + case "pg_stat_activity": + p.pgspecial = pgQueryTime + case "tables": + p.pgspecial = pgSchema + } + } + } + p.sql = string(b) + case sql.SQLTypeBegin: + p.pgspecial = pgBegin + // panic("TODO") + // ingnore for now + case sql.SQLTypeShow: + p.Name = "SHOW" + p.pgspecial = pgNotPg + p.sql = string(b) + } + } + } + // TODO (twg) hack parsing for short term + // parts := strings.Split(strings.TrimSuffix(string(data), "\x00"), " ") + // p.Name = parts[0][1:] //TODO (twg) major hack + vprint.VV("PG SET:(%v)", p.pgspecial) + } else { + vprint.VV("SETTING EMPTY") + p.pgspecial = pgEmpty + } + p.Add(message.ParseOK) +} +func (p *Portal) Describe() { + /* + if p.pgspecial != pgNotPg { + //do custom handling for setup + } + if len(p.results) == 0 { + p.Add(&message.NoData) + p.Add(&message.EmptyQueryResponse) + return + } + */ + +} +func (p *Portal) Execute() (shouldTerminate bool, queryReady bool) { + queryReady = true + vprint.VV("port.Execute: (%v) q=(%v)", p.pgspecial, p.sql) + switch p.pgspecial { + case pgBackendPid: + rowDescription, err := p.Encoder.EncodeColumn("pg_backend_pid", int32(23), 4) + if err != nil { + panic(err) + } + p.Add(rowDescription) + pid := fmt.Sprintf("%v", p.pid) + dataRow, _ := p.Encoder.TextRow(pid) + p.Add(dataRow) + //needs data row with cancel token + case pgVersion: + rowDescription, err := p.Encoder.EncodeColumn("version", int32(25), -1) + if err != nil { + panic(err) + } + p.Add(rowDescription) + dataRow, _ := p.Encoder.TextRow("PostgresSQL 13.0 (molecula)") + p.Add(dataRow) + case pgSelect1: + rowDescription, err := p.Encoder.EncodeColumn("?column?", int32(23), 4) + if err != nil { + panic(err) + } + p.Add(rowDescription) + dataRow, _ := p.Encoder.TextRow("1") + p.Add(dataRow) + case pgCountType: + //need to block + vprint.VV("blocking til terminated") + <-p.server.lookerChannel + vprint.VV("Released") + //now need to send ParseComplete,BindComplete,RowDescription,Error(Terminate) + //TODO(twg) handle the error + rowDescription, err := p.Encoder.EncodeColumn("count", int32(20), 8) + if err != nil { + panic(err) + } + p.Add(rowDescription) + errorResponse, _ := p.Encoder.Error( + message.NoticeField{ + Type: message.NoticeFieldSeverity, + Data: "FATAL", + }, + message.NoticeField{ + Type: message.NoticeFieldMessage, + Data: "terminating connection due to administrator command", + }, + message.NoticeField{ + Type: message.NoticeFieldCode, + Data: "57P01", + }, + ) + p.Add(errorResponse) + p.Sync() //send and Reset + return true, queryReady + case pgQueryTime: + // need to return something so that the id can be queried + //need to return SELECT pid as id, query as stmt, EXTRACT(seconds from query_start - NOW()) as elapsed_time FROM pg_stat_activity + //seems like we need a map of pids to querys + p.server.dumpPortalsTo(p) + case pgTerminate: + //note just have 1 lock that blocks all who try to count the activities + vprint.VV("removing the block ") + //TODO (twg) lock this + close(p.server.lookerChannel) //release all the other blockers and allow them to terminate + p.server.lookerChannel = make(chan struct{}) //create a new one just in case + // i think it needs to return boolean true + rowDescription, err := p.Encoder.EncodeColumn("pg_terminate_backend", int32(16), 1) + if err != nil { + panic(err) + } + p.Add(rowDescription) + dataRow, _ := p.Encoder.TextRow("t") + p.Add(dataRow) + commandComplete, _ := p.Encoder.CommandComplete("SELECT 1") + p.Add(commandComplete) + p.Sync() + return false, queryReady + case pgEmpty: + p.Add(message.NoData) + p.Add(message.EmptyQueryResponse) + p.Sync() + queryReady = true + return false, queryReady + case pgSetApplication: + //needs to add/send status + msg, err := p.Encoder.ParameterStatus("application_name", "PostgreSQL JDBC Driver") //TODO (twg) should be saved from parse + if err != nil { + return + } + p.Add(msg) + case pgSchema: + //need to add the descrition for the 3 fields + // ---[Field 01]--- name='table_schema' type=19 type_len=64 type_mod=4294967295 relid=13276 attnum=2 format=0 + // ---[Field 02]--- name='table_name' type=19 type_len=64 type_mod=4294967295 relid=13276 attnum=3 format=0 + parts := []message.SimpleColumn{ + { + Name: "table_schema", + Typeid: int32(19), + Typelen: 64, + }, + { + Name: "table_name", + Typeid: int32(19), + Typelen: 64, + }, + } + rowDescription, err := p.Encoder.EncodeColumns(parts...) + if err != nil { //TODO (twg) shadowing err + return + } + p.Add(rowDescription) + err = p.HandleSchema() + if err != nil { + return + } + vprint.VV("SHOULd make schema") + + case pgNotPg: + vprint.VV("GOOOO>(%v)", p.sql) + query := SimpleQuery(p.sql) + err := p.server.handleQuery(p, query, p.cancelNotify) + if err != nil { + return + } + + case pgBegin: + vprint.VV("BEGIN") + p.Name = "BEGIN" + } + + //maybe add in the number of items in select clause + if len(p.Name) > 0 { //only send command complete for those that have names + vprint.VV("EXECING NAME: '%v'", p.Name) + message, _ := p.Encoder.CommandComplete(p.Name) + vprint.VV("AFTER") + p.Add(message) + } + return +} + +// handleStandard handles a connection in the standard postgres wire protocol. +func (p *Portal) Sync() { + for _, m := range p.commands { + vprint.VV("Sending: '%v'", m.Type) + p.Writer.WriteMessage(m) + } + p.Writer.Flush() + p.Reset() +} +func (p *Portal) Add(m message.Message) { + cp := message.Message{Type: m.Type, Data: make([]byte, len(m.Data))} + copy(cp.Data, m.Data) + p.commands = append(p.commands, cp) +} + +func (p *Portal) DumpComands() { + + for _, m := range p.commands { + m.Dump("DUMPING:") + } +} +func (p *Portal) HandleSchema() error { + return p.server.QueryHandler.HandleSchema(context.Background(), p) +} + +//implement the QueryResultWriterqueryResultR +func (p *Portal) WriteMessage(m message.Message) error { + p.Add(m) + return nil +} +func (p *Portal) Flush() error { + return nil +} // handleStandard handles a connection in the standard postgres wire protocol. // The client is responsible for closing the connection when this finishes. @@ -255,7 +628,7 @@ func (s *Server) handleStandard(ctx context.Context, proto Protocol, conn net.Co if err != nil { return errors.Wrap(err, "parsing parameters") } - + fmt.Printf("postgres connection params\n%#v\n", params) //TODO (twg) remove if user, ok := params["user"]; ok { // Log the connection. s.Logger.Debugf("new postgres connection from user %q at %v", user, conn.RemoteAddr()) @@ -322,8 +695,57 @@ func (s *Server) handleStandard(ctx context.Context, proto Protocol, conn net.Co if err != nil { return errors.Wrap(err, "sending authentication confirmation") } + err = s.SendParameterStatus(w, "application_name", "", &encoder) + if err != nil { + return errors.Wrap(err, "sending parameter status server version") + } + err = s.SendParameterStatus(w, "client_encoding", "UTF8", &encoder) + if err != nil { + return errors.Wrap(err, "sending parameter status server version") + } + err = s.SendParameterStatus(w, "DateStyle", "ISO, MDY", &encoder) + if err != nil { + return errors.Wrap(err, "sending parameter status server version") + } + err = s.SendParameterStatus(w, "integer_datetimes", "on", &encoder) + if err != nil { + return errors.Wrap(err, "sending parameter status server version") + } + err = s.SendParameterStatus(w, "IntervalStyle", "postgres", &encoder) + if err != nil { + return errors.Wrap(err, "sending parameter status server version") + } + err = s.SendParameterStatus(w, "is_superuser", "on", &encoder) + if err != nil { + return errors.Wrap(err, "sending parameter status server version") + } + err = s.SendParameterStatus(w, "server_encoding", "UTF8", &encoder) + if err != nil { + return errors.Wrap(err, "sending parameter status server version") + } + err = s.SendParameterStatus(w, "server_version", PgServerVersion, &encoder) + if err != nil { + return errors.Wrap(err, "sending parameter status server version") + } + /* + -PARAMETER STATUS name='TimeZone', value='GMT' + */ + err = s.SendParameterStatus(w, "session_authorization", "docker", &encoder) //TODO(twg) figure out valid values here + if err != nil { + return errors.Wrap(err, "sending parameter status server version") + } + err = s.SendParameterStatus(w, "standard_conforming_strings", "on", &encoder) //TODO(twg) figure out valid values here + if err != nil { + return errors.Wrap(err, "sending parameter status server version") + } + err = s.SendParameterStatus(w, "TimeZone", "GMT", &encoder) //TODO(twg) figure out valid values here + if err != nil { + return errors.Wrap(err, "sending parameter status server version") + } + vprint.VV("CancellationManger: %v", s.CancellationManager) var cancelNotify <-chan struct{} + var pid int32 if s.CancellationManager != nil { notify, cancel, token, err := s.CancellationManager.Token() if err != nil { @@ -332,6 +754,7 @@ func (s *Server) handleStandard(ctx context.Context, proto Protocol, conn net.Co defer cancel() msg, err := encoder.BackendKeyData(token.PID, token.Key) + pid = token.PID if err != nil { return errors.Wrap(err, "encoding cancellation key data") } @@ -343,11 +766,25 @@ func (s *Server) handleStandard(ctx context.Context, proto Protocol, conn net.Co } var queryReady bool + portal := &Portal{ + Writer: w, + Encoder: &encoder, + commands: make([]message.Message, 0), + mapper: sql.NewMapper(), + pid: pid, + server: s, + cancelNotify: cancelNotify, + } + s.addPortal(portal) + defer s.removePortal(portal) + //mapper.Logger = logger for { if !queryReady { // Indicate that we are ready for a query. // TODO: provide a valid transaction state. - msg, err := encoder.ReadyForQuery(message.TransactionStatusActive) + //msg, err := encoder.ReadyForQuery(message.TransactionStatusActive) + portal.sql = "" + msg, err := encoder.ReadyForQuery(message.TransactionStatusIdle) if err != nil { return errors.Wrap(err, "sending query ready status") } @@ -373,10 +810,12 @@ func (s *Server) handleStandard(ctx context.Context, proto Protocol, conn net.Co // However, it seems that no clients completely follow the spec, so we shouldn't rely on anything that isn't entirely straightforward. s.Logger.Debugf("postgres client sent additional data without waiting for completion") } + queryReady = true } // Read the next packet. msg, err := r.ReadMessage() + msg.Dump("start-") // TODO(twg) remove if err != nil { if err == errPreempted { // The server is shutting down. @@ -406,6 +845,26 @@ func (s *Server) handleStandard(ctx context.Context, proto Protocol, conn net.Co // We are done. return w.Flush() + case message.TypeParse: + fmt.Println("Type Parse", strings.Trim(string(msg.Data), "\x00")) + portal.Parse(msg.Data) + case message.TypeBind: + fmt.Println("Type Bind", strings.Trim(string(msg.Data), "\x00")) + //TODO(twg) apply values to bindings in the future + // Parse the query message (a null-terminated string). + portal.Bind() + case message.TypeExecute: + fmt.Println("Type Execute", strings.Trim(string(msg.Data), "\x00")) + //term, qr := portal.Execute() + term, qr := portal.Execute() + if term { + return w.Flush() + } + queryReady = qr + case message.TypeSync: + fmt.Println("Type Sync", strings.Trim(string(msg.Data), "\x00")) + portal.Sync() + queryReady = false case message.TypeSimpleQuery: // Execute a simple query. @@ -419,10 +878,23 @@ func (s *Server) handleStandard(ctx context.Context, proto Protocol, conn net.Co if err != nil { return err } - + label := "N/A" + switch msg.Data[0] { + case 'S': //prepared statement + label = "prepared statement" + case 'P': //portal + label = "portal" + } + vprint.VV("describe %v:'%v'", label, msg.Data[1:]) + case message.TypeDescribe: + //TODO (twg) major hack alet + portal.Describe() + case message.TypeClose: + return w.Flush() default: // The message is not supported yet. // Send an error. + vprint.VV("unrecognized postgres packet %v", msg) s.Logger.Errorf("unrecognized postgres packet %v", msg) msg, err = encoder.Error( message.NoticeField{ @@ -452,6 +924,71 @@ func (s *Server) handleStandard(ctx context.Context, proto Protocol, conn net.Co } } } +func (s *Server) addPortal(p *Portal) { + s.mu.Lock() + defer s.mu.Unlock() + s.portals = append(s.portals, p) +} +func (s *Server) removePortal(p *Portal) { + s.mu.Lock() + defer s.mu.Unlock() + for i, portal := range s.portals { + if portal.pid == p.pid { + //remove i + s.portals = append(s.portals[:i], s.portals[i+1:]...) + return + } + + } + +} +func (s *Server) dumpPortalsTo(p *Portal) error { + s.mu.Lock() + defer s.mu.Unlock() + //need to add the descrition for the 3 fields + // <-:-ROW DESCRIPTION: num_fields=3 + //---[Field 01]--- name='id' type=23 type_len=4 type_mod=4294967295 relid=12250 attnum=3 format=0 + //---[Field 02]--- name='stmt' type=25 type_len=65535 type_mod=4294967295 relid=12250 attnum=20 format=0 - + //--[Field 03]--- name='elapsed_time' type=701 type_len=8 type_mod=4294967295 relid=0 attnum=0 format=0 + parts := []message.SimpleColumn{ + { + Name: "id", + Typeid: int32(23), + Typelen: 4, + }, + { + Name: "stmt", + Typeid: int32(25), + Typelen: -1, + }, + { + Name: "elapsed_time", + Typeid: int32(701), + Typelen: 8, + }, + } + rowDescription, err := p.Encoder.EncodeColumns(parts...) + if err != nil { + return err + } + p.Add(rowDescription) + + for _, portal := range s.portals { + vprint.VV("port: %v (%v) %v", portal.pid, portal.sql, time.Since(portal.queryStart)) + dataRow, err := p.Encoder.TextRow( + fmt.Sprintf("%v", portal.pid), + portal.sql, + fmt.Sprintf("%v", time.Since(portal.queryStart).Seconds())) + if err != nil { + return err + } + //if sql == "" need to put in a null record + //need to add the dararow + //also need to figure out null types + p.Add(dataRow) + } + return nil +} // handleQuery processes a single query on a connection. func (s *Server) handleQuery(w message.Writer, query Query, cancelNotify <-chan struct{}) error { diff --git a/pg/query.go b/pg/query.go index cc81d490f..7aa231670 100644 --- a/pg/query.go +++ b/pg/query.go @@ -60,6 +60,7 @@ type QueryResultWriter interface { type QueryHandler interface { // HandleQuery executes a query and writes the results back. HandleQuery(context.Context, QueryResultWriter, Query) error + HandleSchema(context.Context, *Portal) error } // queryResultWriter implements QueryResultWrtiter over postgres wire protocol. diff --git a/pg/server.go b/pg/server.go index 071024385..28aa6ca24 100644 --- a/pg/server.go +++ b/pg/server.go @@ -59,6 +59,9 @@ type Server struct { // CancellationManager is the cancellation manager to use. // If this is not set, no cancellations will be applied. CancellationManager CancellationManager + lookerChannel chan struct{} + mu sync.Mutex + portals []*Portal } // ServeConn serves a single connection. @@ -79,6 +82,8 @@ func (s *Server) Serve(ctx context.Context, l net.Listener) (err error) { err = cerr } }(ctx) + // TODO (twg) added for looker + s.lookerChannel = make(chan struct{}) // Wait for the listener to be closed and all connections to shut down. var wg sync.WaitGroup diff --git a/server/pg.go b/server/pg.go index 0f03e7dfb..dc61e6262 100644 --- a/server/pg.go +++ b/server/pg.go @@ -25,7 +25,7 @@ import ( "strings" "time" - "github.com/molecula/featurebase/v2" + pilosa "github.com/molecula/featurebase/v2" "github.com/molecula/featurebase/v2/logger" "github.com/molecula/featurebase/v2/pg" "github.com/molecula/featurebase/v2/pql" @@ -67,9 +67,9 @@ func NewPostgresServer(api *pilosa.API, logger logger.Logger, tls *tls.Config) * // NewPostgresHandler creates a postgres query handler wrapping the pilosa API. func NewPostgresHandler(api *pilosa.API, logger logger.Logger) pg.QueryHandler { - return &queryDecodeHandler{ - child: &pilosaQueryHandler{ - api: api, + return &QueryDecodeHandler{ + Child: &PilosaQueryHandler{ + Api: api, logger: logger, }, } @@ -107,6 +107,10 @@ func (s *PostgresServer) Close() error { return s.eg.Wait() } +func (s *PostgresServer) GetAPI() *pilosa.API { + return s.api +} + type pgPQLQuery struct { index string query string @@ -135,8 +139,8 @@ func pgDecodePQL(str string) (q pg.Query, err error) { }, nil } -type pilosaQueryHandler struct { - api *pilosa.API +type PilosaQueryHandler struct { + Api *pilosa.API logger logger.Logger } @@ -449,10 +453,10 @@ func pgWriteResult(w pg.QueryResultWriter, result interface{}) error { } } -func (pqh *pilosaQueryHandler) HandleQuery(ctx context.Context, w pg.QueryResultWriter, q pg.Query) error { +func (pqh *PilosaQueryHandler) HandleQuery(ctx context.Context, w pg.QueryResultWriter, q pg.Query) error { switch q := q.(type) { case pgPQLQuery: - resp, err := pqh.api.Query(ctx, &pilosa.QueryRequest{ + resp, err := pqh.Api.Query(ctx, &pilosa.QueryRequest{ Index: q.index, Query: q.query, }) @@ -465,7 +469,7 @@ func (pqh *pilosaQueryHandler) HandleQuery(ctx context.Context, w pg.QueryResult return errors.Wrap(pgWriteResult(w, resp.Results[0]), "writing query result") case pg.SimpleQuery: - resp, err := execSQL(ctx, pqh.api, pqh.logger, string(q)) + resp, err := execSQL(ctx, pqh.Api, pqh.logger, string(q)) if err != nil { return errors.Wrap(err, "executing query") } @@ -476,11 +480,11 @@ func (pqh *pilosaQueryHandler) HandleQuery(ctx context.Context, w pg.QueryResult } } -type queryDecodeHandler struct { - child pg.QueryHandler +type QueryDecodeHandler struct { + Child pg.QueryHandler } -func (qdh *queryDecodeHandler) HandleQuery(ctx context.Context, w pg.QueryResultWriter, q pg.Query) error { +func (qdh *QueryDecodeHandler) HandleQuery(ctx context.Context, w pg.QueryResultWriter, q pg.Query) error { switch qv := q.(type) { case pg.SimpleQuery: if strings.HasPrefix(string(qv), "[") { @@ -492,5 +496,24 @@ func (qdh *queryDecodeHandler) HandleQuery(ctx context.Context, w pg.QueryResult } } - return qdh.child.HandleQuery(ctx, w, q) + return qdh.Child.HandleQuery(ctx, w, q) +} + +func (pqh *PilosaQueryHandler) HandleSchema(ctx context.Context, portal *pg.Portal) error { + schema, err := pqh.Api.Schema(context.Background(), false) + if err != nil { + return err + } + for _, ii := range schema { + dataRow, err := portal.Encoder.TextRow("featurebase", ii.Name) + if err != nil { + return err + } + portal.Add(dataRow) + } + return nil +} + +func (qdh *QueryDecodeHandler) HandleSchema(ctx context.Context, portal *pg.Portal) error { + return qdh.Child.HandleSchema(ctx, portal) } diff --git a/sql/mapper.go b/sql/mapper.go index 3ff500d8f..80ce64b6c 100644 --- a/sql/mapper.go +++ b/sql/mapper.go @@ -25,6 +25,8 @@ import ( const ( SQLTypeSelect = "select" SQLTypeShow = "show" + SQLTypeSet = "set" + SQLTypeBegin = "begin" SQLTypeEmpty = "" ) @@ -101,6 +103,10 @@ func (m *Mapper) MapSQL(sql string) (*MappedSQL, error) { } case *sqlparser.Show: sqlType = SQLTypeShow + case *sqlparser.Set: + sqlType = SQLTypeSet + case *sqlparser.Begin: + sqlType = SQLTypeBegin } return &MappedSQL{ From 419d1ed05dbf7ac802a36ff1cc677b04e19b13fb Mon Sep 17 00:00:00 2001 From: Todd Gruben Date: Mon, 13 Sep 2021 14:16:20 -0500 Subject: [PATCH 02/15] linter cleanup --- pg/message/message.go | 2 ++ pg/pgtest/handler.go | 3 +++ pg/protocol.go | 25 +++++++++++++++++-------- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/pg/message/message.go b/pg/message/message.go index 5d6f67014..757053297 100644 --- a/pg/message/message.go +++ b/pg/message/message.go @@ -172,11 +172,13 @@ func (e *Encoder) i32(i int32) error { return err } +/* removed for linter now func (e *Encoder) u32(i uint32) error { binary.BigEndian.PutUint32(e.scratch[:], i) _, err := e.buf.Write(e.scratch[:]) return err } +*/ // ReadyForQuery encodes a "ready for query" message. func (e *Encoder) ReadyForQuery(status TransactionStatus) (Message, error) { diff --git a/pg/pgtest/handler.go b/pg/pgtest/handler.go index b146359d8..02b1361e2 100644 --- a/pg/pgtest/handler.go +++ b/pg/pgtest/handler.go @@ -30,6 +30,9 @@ type HandlerFunc func(context.Context, pg.QueryResultWriter, pg.Query) error func (h HandlerFunc) HandleQuery(ctx context.Context, w pg.QueryResultWriter, q pg.Query) error { return h(ctx, w, q) } +func (h HandlerFunc) HandleSchema(ctx context.Context, portal *pg.Portal) error { + return nil +} var _ pg.QueryHandler = HandlerFunc(nil) diff --git a/pg/protocol.go b/pg/protocol.go index 754e128e3..377e2ac16 100644 --- a/pg/protocol.go +++ b/pg/protocol.go @@ -273,12 +273,12 @@ const ( ) type Portal struct { - Name string - Writer *message.WireWriter - commands []message.Message - Encoder *message.Encoder - mapper *sql.Mapper - results []Result + Name string + Writer *message.WireWriter + commands []message.Message + Encoder *message.Encoder + mapper *sql.Mapper + //results []Result sql string pgspecial PgType pid int32 @@ -491,7 +491,11 @@ func (p *Portal) Execute() (shouldTerminate bool, queryReady bool) { // need to return something so that the id can be queried //need to return SELECT pid as id, query as stmt, EXTRACT(seconds from query_start - NOW()) as elapsed_time FROM pg_stat_activity //seems like we need a map of pids to querys - p.server.dumpPortalsTo(p) + err := p.server.dumpPortalsTo(p) + if err != nil { + return + } + case pgTerminate: //note just have 1 lock that blocks all who try to count the activities vprint.VV("removing the block ") @@ -577,7 +581,12 @@ func (p *Portal) Execute() (shouldTerminate bool, queryReady bool) { func (p *Portal) Sync() { for _, m := range p.commands { vprint.VV("Sending: '%v'", m.Type) - p.Writer.WriteMessage(m) + err := p.Writer.WriteMessage(m) + if err != nil { + //TODO (twg) need to change signature to return error + vprint.VV("error %v", err) + return + } } p.Writer.Flush() p.Reset() From c56fd339247c2d8f43b7b213a8029951d6e72052 Mon Sep 17 00:00:00 2001 From: Todd Gruben Date: Fri, 17 Sep 2021 09:52:57 -0500 Subject: [PATCH 03/15] wip --- api.go | 5 +++ server/pg.go | 90 +++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 91 insertions(+), 4 deletions(-) diff --git a/api.go b/api.go index 8e7fa7b2b..ce8ffda33 100644 --- a/api.go +++ b/api.go @@ -36,6 +36,8 @@ import ( "github.com/molecula/featurebase/v2/disco" "github.com/molecula/featurebase/v2/ingest" + + //"github.com/molecula/featurebase/v2/pg" "github.com/molecula/featurebase/v2/pql" "github.com/molecula/featurebase/v2/roaring" "github.com/molecula/featurebase/v2/stats" @@ -3024,6 +3026,9 @@ processing: } return result, ctx.Err() } +func (api *API) Plan(ctx context.Context, q string) (*Stmt, error) { + return api.server.PlanSQL(ctx, q) +} type serverInfo struct { ShardWidth uint64 `json:"shardWidth"` diff --git a/server/pg.go b/server/pg.go index dc61e6262..a6395adff 100644 --- a/server/pg.go +++ b/server/pg.go @@ -28,6 +28,8 @@ import ( pilosa "github.com/molecula/featurebase/v2" "github.com/molecula/featurebase/v2/logger" "github.com/molecula/featurebase/v2/pg" + + //"github.com/molecula/featurebase/v2/pg" "github.com/molecula/featurebase/v2/pql" pb "github.com/molecula/featurebase/v2/proto" @@ -326,6 +328,69 @@ func pgWriteGroupCount(w pg.QueryResultWriter, counts *pilosa.GroupCounts) error return nil } +func pgWriteStmtRows(w pg.QueryResultWriter, rows *pilosa.StmtRows) error { + //TODO(twg) writeHeader + columns := rows.Columns() + //TODO (twg) types:=rows.Types() + headers := make([]pg.ColumnInfo, len(columns)) + for i, column := range columns { + headers[i] = pg.ColumnInfo{ + Name: column, + Type: pg.TypeCharoid, //TODO(twg) types[i] + } + } + err := w.WriteHeader(headers...) + if err != nil { + return err + } + //TODO(twg) writeColumns + data := make([]string, len(headers)) + for rows.Next() { + result := make([]interface{}, len(rows.Columns())) + // Create list of scan destination pointers. + dsts := make([]interface{}, len(result)) + for i := range result { + dsts[i] = &result[i] + } + + if err := rows.Scan(dsts...); err != nil { + return err + } + //TODO(twg) conversion should be happening in Scan as described in https://pkg.go.dev/database/sql + // .... + // Scan also converts between string and numeric types, as long as no information + // would be lost. While Scan stringifies all numbers scanned from numeric database columns into *string, + // scans into numeric types are checked for overflow. For example, a float64 with value 300 or a string + // with value "300" can scan into a uint16, but not into a uint8, though float64(255) or "255" can scan + // into a uint8. One exception is that scans of some float64 numbers to strings may lose information when stringifying. + // In general, scan floating point columns into *float64. + // ... + for i, col := range dsts { + var v string + switch col := col.(type) { + case nil: + v = "null" + // + //v = strconv.FormatUint(col.Uint64Val, 10) + default: + return errors.Errorf("unable to process value of type %T", col) + } + + data[i] = v + } + + err = w.WriteRowText(data...) + if err != nil { + return err + } + + } + if err := rows.Err(); err != nil { + return err + } + return nil +} + func pgWriteRowser(w pg.QueryResultWriter, result pb.ToRowser) error { var data []string return result.ToRows(func(row *pb.RowResponse) error { @@ -399,6 +464,8 @@ func pgWriteResult(w pg.QueryResultWriter, result interface{}) error { return pgWriteGroupCount(w, result) case pb.ToRowser: // we should avoid protobuf where we can... return pgWriteRowser(w, result) + case *pilosa.StmtRows: // we should avoid protobuf where we can... + return pgWriteStmtRows(w, result) case uint64: err := w.WriteHeader(pg.ColumnInfo{ Name: "count", @@ -469,11 +536,26 @@ func (pqh *PilosaQueryHandler) HandleQuery(ctx context.Context, w pg.QueryResult return errors.Wrap(pgWriteResult(w, resp.Results[0]), "writing query result") case pg.SimpleQuery: - resp, err := execSQL(ctx, pqh.Api, pqh.logger, string(q)) - if err != nil { - return errors.Wrap(err, "executing query") + sql2 := false + if sql2 { + stmt, err := pqh.Api.Plan(ctx, string(q)) + if err != nil { + return err + } + resp, err := stmt.QueryContext(ctx) + if err != nil { + return err + } + return errors.Wrap(pgWriteResult(w, resp), "writing sql2 query result") + //version 2.0 + } else { + //version 1.0 + resp, err := execSQL(ctx, pqh.Api, pqh.logger, string(q)) + if err != nil { + return errors.Wrap(err, "executing query") + } + return errors.Wrap(pgWriteResult(w, resp), "writing query result") } - return errors.Wrap(pgWriteResult(w, resp), "writing query result") default: return errors.Errorf("query type %T not yet supported (query: %s)", q, q) From 9c8538ec5adc37a72839ac401328ff17ede4426c Mon Sep 17 00:00:00 2001 From: Todd Gruben Date: Fri, 17 Sep 2021 14:46:30 -0500 Subject: [PATCH 04/15] docker fix not really related to anything --- planner.go | 5 +++++ server.go | 2 ++ server/pg.go | 43 ++++++++++++++++++++++++++++--------------- 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/planner.go b/planner.go index ce89deebe..e60d628ef 100644 --- a/planner.go +++ b/planner.go @@ -23,6 +23,7 @@ import ( "github.com/molecula/featurebase/v2/pql" "github.com/molecula/featurebase/v2/sql2" + "github.com/molecula/featurebase/v2/vprint" ) type Planner struct { @@ -645,6 +646,10 @@ func (rs *StmtRows) Columns() []*StmtColumn { return rs.node.Columns() } +func (rs *StmtRows) Row() int64 { + return rs.node.Row()[0].(int64) +} + func (rs *StmtRows) Next() bool { if rs.err != nil { return false diff --git a/server.go b/server.go index 93d9947a0..2e75045d4 100644 --- a/server.go +++ b/server.go @@ -39,6 +39,7 @@ import ( "github.com/molecula/featurebase/v2/stats" "github.com/molecula/featurebase/v2/storage" "github.com/molecula/featurebase/v2/topology" + "github.com/molecula/featurebase/v2/vprint" "github.com/pkg/errors" "golang.org/x/sync/errgroup" @@ -1354,6 +1355,7 @@ func (s *Server) PlanSQL(ctx context.Context, q string) (*Stmt, error) { if err != nil { return nil, err } + vprint.VV("PLanning SQL: (%v)", q) return NewPlanner(s.executor).PlanStatement(ctx, st) } diff --git a/server/pg.go b/server/pg.go index a6395adff..7b8f39ad7 100644 --- a/server/pg.go +++ b/server/pg.go @@ -28,6 +28,7 @@ import ( pilosa "github.com/molecula/featurebase/v2" "github.com/molecula/featurebase/v2/logger" "github.com/molecula/featurebase/v2/pg" + "github.com/molecula/featurebase/v2/vprint" //"github.com/molecula/featurebase/v2/pg" "github.com/molecula/featurebase/v2/pql" @@ -330,22 +331,32 @@ func pgWriteGroupCount(w pg.QueryResultWriter, counts *pilosa.GroupCounts) error func pgWriteStmtRows(w pg.QueryResultWriter, rows *pilosa.StmtRows) error { //TODO(twg) writeHeader - columns := rows.Columns() - //TODO (twg) types:=rows.Types() - headers := make([]pg.ColumnInfo, len(columns)) - for i, column := range columns { - headers[i] = pg.ColumnInfo{ - Name: column, - Type: pg.TypeCharoid, //TODO(twg) types[i] - } - } - err := w.WriteHeader(headers...) - if err != nil { - return err - } //TODO(twg) writeColumns - data := make([]string, len(headers)) + first := true + var data []string + var err error for rows.Next() { + if first { + columns := rows.Columns() + vprint.VV("ROW=> %#v", rows.Row()) + //TODO (twg) types:=rows.Types() + headers := make([]pg.ColumnInfo, len(columns)) + vprint.VV("got columns %v", columns) + for i, column := range columns { + headers[i] = pg.ColumnInfo{ + Name: column, + Type: pg.TypeCharoid, //TODO(twg) types[i] + } + } + err := w.WriteHeader(headers...) + if err != nil { + return err + } + + data = make([]string, len(headers)) + first = false + } + vprint.VV("got row") result := make([]interface{}, len(rows.Columns())) // Create list of scan destination pointers. dsts := make([]interface{}, len(result)) @@ -372,6 +383,8 @@ func pgWriteStmtRows(w pg.QueryResultWriter, rows *pilosa.StmtRows) error { v = "null" // //v = strconv.FormatUint(col.Uint64Val, 10) + case *interface{}: + v = fmt.Sprintf("%v", *col) default: return errors.Errorf("unable to process value of type %T", col) } @@ -536,7 +549,7 @@ func (pqh *PilosaQueryHandler) HandleQuery(ctx context.Context, w pg.QueryResult return errors.Wrap(pgWriteResult(w, resp.Results[0]), "writing query result") case pg.SimpleQuery: - sql2 := false + sql2 := true if sql2 { stmt, err := pqh.Api.Plan(ctx, string(q)) if err != nil { From 2ca7b107d2a0d21a052f49f5bf87d3f2ced2ba2d Mon Sep 17 00:00:00 2001 From: Todd Gruben Date: Fri, 17 Sep 2021 14:56:43 -0500 Subject: [PATCH 05/15] removed client1 from clustertests --- go.mod | 3 ++- go.sum | 26 ++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index d64a32730..875729f63 100644 --- a/go.mod +++ b/go.mod @@ -29,6 +29,7 @@ require ( github.com/molecula/apophenia v0.0.0-20190827192002-68b7a14a478b github.com/opentracing/opentracing-go v1.1.0 github.com/pelletier/go-toml v1.4.0 + github.com/pilosa/pilosa/v2 v2.0.0-alpha.1 github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.0.0 github.com/prometheus/client_model v0.1.0 @@ -54,7 +55,7 @@ require ( golang.org/x/sys v0.0.0-20210510120138-977fb7262007 // indirect golang.org/x/text v0.3.5 // indirect google.golang.org/grpc v1.28.0 - gopkg.in/yaml.v2 v2.3.0 + gopkg.in/yaml.v2 v2.3.0 // indirect modernc.org/mathutil v1.0.0 modernc.org/strutil v1.0.0 sigs.k8s.io/yaml v1.2.0 // indirect diff --git a/go.sum b/go.sum index 5f4d1be61..a415da534 100644 --- a/go.sum +++ b/go.sum @@ -16,12 +16,14 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/CAFxX/gcnotifier v0.0.0-20190112062741-224a280d589d h1:n0G4ckjMEj7bWuGYUX0i8YlBeBBJuZ+HEHvHfyBDZtI= github.com/CAFxX/gcnotifier v0.0.0-20190112062741-224a280d589d/go.mod h1:Rn2zM2MnHze07LwkneP48TWt6UiZhzQTwCvw6djVGfE= +github.com/DataDog/datadog-go v0.0.0-20180822151419-281ae9f2d895/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/datadog-go v2.2.0+incompatible h1:V5BKkxACZLjzHjSgBbr2gvLA2Ae49yhc6CSY7MLy5k4= github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/HdrHistogram/hdrhistogram-go v1.1.0 h1:6dpdDPTRoo78HxAJ6T1HfMiKSnqhgRRqzCuPshRkQ7I= github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/StackExchange/wmi v0.0.0-20181212234831-e0a55b97c705/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d h1:G0m3OIz70MZUWq3EgK3CesDbo8upS2Vm9/P3FtgI+Jk= github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= @@ -31,6 +33,7 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/beevik/ntp v0.3.0 h1:xzVrPrE4ziasFXgBVBZJDP0Wg/KpMwk2KHJ4Ba8GrDw= @@ -42,6 +45,7 @@ github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -51,8 +55,11 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa h1:OaNxuTZr7kxeODyLWsRMC+OD03aFUH+mW6r2d+MWa5Y= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -102,6 +109,7 @@ github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/me github.com/go-test/deep v1.0.7 h1:/VSMRlnY/JSyqxQUzQLKVMAskpY/NZKFA5j2P+0pP2M= github.com/go-test/deep v1.0.7/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= @@ -204,6 +212,7 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/lib/pq v1.8.0 h1:9xohqzkUwzR4Ga4ivdTcawVS89YSDVxXMa3xJX3cGzg= github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -244,6 +253,8 @@ github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FI github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.4.0 h1:u3Z1r+oOXJIkxqw34zVhyPgjBsm6X2wn21NWs/HfSeg= github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= +github.com/pilosa/pilosa/v2 v2.0.0-alpha.1 h1:dkKXzEtEvTHiJ7paskW6yqPBaUchOMj2VeXiM1QyEeQ= +github.com/pilosa/pilosa/v2 v2.0.0-alpha.1/go.mod h1:CHRsL8ZpARQmEqiknUHFJSuEw9964DWCAdJQeT8vRK8= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -274,6 +285,7 @@ github.com/prometheus/prom2json v1.3.0/go.mod h1:rMN7m0ApCowcoDlypBHlkNbp5eJQf/+ github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= +github.com/remyoudompheng/bigfft v0.0.0-20190321074620-2f0d2b0e0001/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20190728182440-6a916e37a237 h1:HQagqIiBmr8YXawX/le3+O26N+vPPC1PtjaF3mwnook= github.com/remyoudompheng/bigfft v0.0.0-20190728182440-6a916e37a237/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= @@ -285,8 +297,11 @@ github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/shirou/gopsutil v2.18.12+incompatible h1:1eaJvGomDnH74/5cF4CTmTbLHAriGFsTZppLXDX93OM= +github.com/shirou/gopsutil v2.18.12+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shirou/gopsutil/v3 v3.20.11 h1:NeVf1K0cgxsWz+N3671ojRptdgzvp7BXL3KV21R0JnA= github.com/shirou/gopsutil/v3 v3.20.11/go.mod h1:igHnfak0qnw1biGeI2qKQvu0ZkwvEkUcCLlYhZzdr/4= +github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= @@ -312,6 +327,7 @@ github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.3.1/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk= github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= @@ -329,13 +345,18 @@ github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69 github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 h1:LnC5Kc/wtumK+WB441p7ynQJzVuNRJiqddSIE3IlSEQ= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/uber-go/atomic v1.4.0/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g= +github.com/uber/jaeger-client-go v2.16.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-client-go v2.25.0+incompatible h1:IxcNZ7WRY1Y3G4poYlx24szfsn/3LvK9QHCq9oQw8+U= github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/uber/jaeger-lib v2.0.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/uber/jaeger-lib v2.4.0+incompatible h1:fY7QsGQWiCt8pajv4r7JEvmATdCVaWxXbjwyYwsNaLQ= github.com/uber/jaeger-lib v2.4.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/zeebo/assert v1.1.0 h1:hU1L1vLTHsnO8x8c9KAR5GmM5QscxHg5RNU5z5qbUWY= @@ -358,7 +379,9 @@ go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -404,6 +427,7 @@ golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190424112056-4829fb13d2c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= @@ -432,10 +456,12 @@ golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190429190828-d89cdac9e872/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= From 5176b7ff03e91e7486a792b277848dc8fa2d593c Mon Sep 17 00:00:00 2001 From: Todd Gruben Date: Tue, 21 Sep 2021 09:59:57 -0500 Subject: [PATCH 06/15] added sqlversion config option --- ctl/server.go | 1 + go.mod | 4 ++-- pg/protocol.go | 2 +- server/config.go | 3 +++ server/pg.go | 26 +++++++++++++++++--------- server/server.go | 4 ++-- 6 files changed, 26 insertions(+), 14 deletions(-) diff --git a/ctl/server.go b/ctl/server.go index 2aa617295..6c4405135 100644 --- a/ctl/server.go +++ b/ctl/server.go @@ -111,6 +111,7 @@ func BuildServerFlags(cmd *cobra.Command, srv *server.Command) { flags.DurationVar((*time.Duration)(&srv.Config.Postgres.WriteTimeout), "postgres.write-timeout", time.Duration(srv.Config.Postgres.WriteTimeout), "Timeout for writes on a postgres connection. (set 0 to disable)") flags.Uint32Var(&srv.Config.Postgres.MaxStartupSize, "postgres.max-startup-size", srv.Config.Postgres.MaxStartupSize, "Maximum acceptable size of a postgres startup packet, in bytes. (set 0 to disable)") flags.Uint16Var(&srv.Config.Postgres.ConnectionLimit, "postgres.connection-limit", srv.Config.Postgres.ConnectionLimit, "Maximum number of simultaneous postgres connections to allow. (set 0 to disable)") + flags.Uint16Var(&srv.Config.Postgres.SqlVersion, "postgres.sql-version", srv.Config.Postgres.SqlVersion, "Molecula Sql Handling Version (default 1)") // Disk and Memory usage cache for ui/usage endpoint flags.Float64Var(&srv.Config.UsageDutyCycle, "usage-duty-cycle", srv.Config.UsageDutyCycle, "Sets the percentage of time that is spent recalculating the disk and memory usage cache. 100.0 for always-running, 0 disables the cache and the /ui/usage endpoint.") diff --git a/go.mod b/go.mod index 875729f63..c99edd34d 100644 --- a/go.mod +++ b/go.mod @@ -29,7 +29,7 @@ require ( github.com/molecula/apophenia v0.0.0-20190827192002-68b7a14a478b github.com/opentracing/opentracing-go v1.1.0 github.com/pelletier/go-toml v1.4.0 - github.com/pilosa/pilosa/v2 v2.0.0-alpha.1 + github.com/pilosa/pilosa/v2 v2.0.0-alpha.1 // indirect github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.0.0 github.com/prometheus/client_model v0.1.0 @@ -55,7 +55,7 @@ require ( golang.org/x/sys v0.0.0-20210510120138-977fb7262007 // indirect golang.org/x/text v0.3.5 // indirect google.golang.org/grpc v1.28.0 - gopkg.in/yaml.v2 v2.3.0 // indirect + gopkg.in/yaml.v2 v2.3.0 modernc.org/mathutil v1.0.0 modernc.org/strutil v1.0.0 sigs.k8s.io/yaml v1.2.0 // indirect diff --git a/pg/protocol.go b/pg/protocol.go index 377e2ac16..041c331a4 100644 --- a/pg/protocol.go +++ b/pg/protocol.go @@ -1043,7 +1043,7 @@ func (s *Server) handleQuery(w message.Writer, query Query, cancelNotify <-chan te: s.TypeEngine, tag: "SELECT", } - + vprint.VV("handle Query: (%v)", query) // Dispatch the query handler. qerr := s.QueryHandler.HandleQuery(ctx, qwriter, query) if qerr != nil { diff --git a/server/config.go b/server/config.go index b96a5be1f..dc6ae08ae 100644 --- a/server/config.go +++ b/server/config.go @@ -200,6 +200,9 @@ type Config struct { // Setting this to 0 disables the limit. // This mostly exists because other DBs seem to have it. ConnectionLimit uint16 `toml:"max-connections"` + // SqlVersion is which type of sqlhandling to be applied. + // The constant SqlV2 can be used to try the new experimental Molecula SQL handling + SqlVersion uint16 `toml:"sql-version"` } `toml:"postgres"` // Storage.Backend determines which Tx implementation the holder/Index will diff --git a/server/pg.go b/server/pg.go index 7b8f39ad7..4f59caaad 100644 --- a/server/pg.go +++ b/server/pg.go @@ -46,14 +46,20 @@ type PostgresServer struct { s pg.Server stop context.CancelFunc } +type SqlVersion uint16 + +const ( + SqlV1 SqlVersion = 0 + SqlV2 SqlVersion = 2 +) // NewPostgresServer creates a postgres server. -func NewPostgresServer(api *pilosa.API, logger logger.Logger, tls *tls.Config) *PostgresServer { +func NewPostgresServer(api *pilosa.API, logger logger.Logger, tls *tls.Config, sqlVersion SqlVersion) *PostgresServer { return &PostgresServer{ api: api, logger: logger, s: pg.Server{ - QueryHandler: NewPostgresHandler(api, logger), + QueryHandler: NewPostgresHandler(api, logger, sqlVersion), TypeEngine: pg.PrimitiveTypeEngine{}, StartupTimeout: 5 * time.Second, ReadTimeout: 10 * time.Second, @@ -69,11 +75,12 @@ func NewPostgresServer(api *pilosa.API, logger logger.Logger, tls *tls.Config) * } // NewPostgresHandler creates a postgres query handler wrapping the pilosa API. -func NewPostgresHandler(api *pilosa.API, logger logger.Logger) pg.QueryHandler { +func NewPostgresHandler(api *pilosa.API, logger logger.Logger, sqlVersion SqlVersion) pg.QueryHandler { return &QueryDecodeHandler{ Child: &PilosaQueryHandler{ - Api: api, - logger: logger, + Api: api, + logger: logger, + sqlVersion: sqlVersion, }, } } @@ -143,8 +150,9 @@ func pgDecodePQL(str string) (q pg.Query, err error) { } type PilosaQueryHandler struct { - Api *pilosa.API - logger logger.Logger + Api *pilosa.API + logger logger.Logger + sqlVersion SqlVersion } func pgWriteRow(w pg.QueryResultWriter, row *pilosa.Row) error { @@ -549,9 +557,9 @@ func (pqh *PilosaQueryHandler) HandleQuery(ctx context.Context, w pg.QueryResult return errors.Wrap(pgWriteResult(w, resp.Results[0]), "writing query result") case pg.SimpleQuery: - sql2 := true - if sql2 { + if pqh.sqlVersion == SqlV2 { stmt, err := pqh.Api.Plan(ctx, string(q)) + vprint.VV("SQL2Plan: (%v) (%v)", string(q), err) if err != nil { return err } diff --git a/server/server.go b/server/server.go index 5a8478513..8d227ade7 100644 --- a/server/server.go +++ b/server/server.go @@ -40,7 +40,7 @@ import ( "golang.org/x/sync/errgroup" - "github.com/molecula/featurebase/v2" + pilosa "github.com/molecula/featurebase/v2" "github.com/molecula/featurebase/v2/boltdb" "github.com/molecula/featurebase/v2/encoding/proto" petcd "github.com/molecula/featurebase/v2/etcd" @@ -265,7 +265,7 @@ func (m *Command) Start() (err error) { } tlsConf = conf } - m.pgserver = NewPostgresServer(m.API, m.logger, tlsConf) + m.pgserver = NewPostgresServer(m.API, m.logger, tlsConf, SqlVersion(m.Config.Postgres.SqlVersion)) m.pgserver.s.StartupTimeout = time.Duration(m.Config.Postgres.StartupTimeout) m.pgserver.s.ReadTimeout = time.Duration(m.Config.Postgres.ReadTimeout) m.pgserver.s.WriteTimeout = time.Duration(m.Config.Postgres.WriteTimeout) From d6dd1e025bbef1663c81220c1940d9a080da0fb4 Mon Sep 17 00:00:00 2001 From: Todd Gruben Date: Wed, 22 Sep 2021 09:28:59 -0500 Subject: [PATCH 07/15] removed extra command complete message cleanup --- go.mod | 3 +- go.sum | 26 ------- pg/protocol.go | 174 ++++++++++++++++++++++------------------------ server/pg_test.go | 4 +- 4 files changed, 88 insertions(+), 119 deletions(-) diff --git a/go.mod b/go.mod index c99edd34d..e590bdd1b 100644 --- a/go.mod +++ b/go.mod @@ -29,7 +29,6 @@ require ( github.com/molecula/apophenia v0.0.0-20190827192002-68b7a14a478b github.com/opentracing/opentracing-go v1.1.0 github.com/pelletier/go-toml v1.4.0 - github.com/pilosa/pilosa/v2 v2.0.0-alpha.1 // indirect github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.0.0 github.com/prometheus/client_model v0.1.0 @@ -55,7 +54,7 @@ require ( golang.org/x/sys v0.0.0-20210510120138-977fb7262007 // indirect golang.org/x/text v0.3.5 // indirect google.golang.org/grpc v1.28.0 - gopkg.in/yaml.v2 v2.3.0 + gopkg.in/yaml.v2 v2.3.0 // indirect modernc.org/mathutil v1.0.0 modernc.org/strutil v1.0.0 sigs.k8s.io/yaml v1.2.0 // indirect diff --git a/go.sum b/go.sum index a415da534..5f4d1be61 100644 --- a/go.sum +++ b/go.sum @@ -16,14 +16,12 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/CAFxX/gcnotifier v0.0.0-20190112062741-224a280d589d h1:n0G4ckjMEj7bWuGYUX0i8YlBeBBJuZ+HEHvHfyBDZtI= github.com/CAFxX/gcnotifier v0.0.0-20190112062741-224a280d589d/go.mod h1:Rn2zM2MnHze07LwkneP48TWt6UiZhzQTwCvw6djVGfE= -github.com/DataDog/datadog-go v0.0.0-20180822151419-281ae9f2d895/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/datadog-go v2.2.0+incompatible h1:V5BKkxACZLjzHjSgBbr2gvLA2Ae49yhc6CSY7MLy5k4= github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/HdrHistogram/hdrhistogram-go v1.1.0 h1:6dpdDPTRoo78HxAJ6T1HfMiKSnqhgRRqzCuPshRkQ7I= github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/StackExchange/wmi v0.0.0-20181212234831-e0a55b97c705/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d h1:G0m3OIz70MZUWq3EgK3CesDbo8upS2Vm9/P3FtgI+Jk= github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= @@ -33,7 +31,6 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/beevik/ntp v0.3.0 h1:xzVrPrE4ziasFXgBVBZJDP0Wg/KpMwk2KHJ4Ba8GrDw= @@ -45,7 +42,6 @@ github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -55,11 +51,8 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa h1:OaNxuTZr7kxeODyLWsRMC+OD03aFUH+mW6r2d+MWa5Y= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -109,7 +102,6 @@ github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/me github.com/go-test/deep v1.0.7 h1:/VSMRlnY/JSyqxQUzQLKVMAskpY/NZKFA5j2P+0pP2M= github.com/go-test/deep v1.0.7/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= @@ -212,7 +204,6 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/lib/pq v1.8.0 h1:9xohqzkUwzR4Ga4ivdTcawVS89YSDVxXMa3xJX3cGzg= github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -253,8 +244,6 @@ github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FI github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.4.0 h1:u3Z1r+oOXJIkxqw34zVhyPgjBsm6X2wn21NWs/HfSeg= github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= -github.com/pilosa/pilosa/v2 v2.0.0-alpha.1 h1:dkKXzEtEvTHiJ7paskW6yqPBaUchOMj2VeXiM1QyEeQ= -github.com/pilosa/pilosa/v2 v2.0.0-alpha.1/go.mod h1:CHRsL8ZpARQmEqiknUHFJSuEw9964DWCAdJQeT8vRK8= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -285,7 +274,6 @@ github.com/prometheus/prom2json v1.3.0/go.mod h1:rMN7m0ApCowcoDlypBHlkNbp5eJQf/+ github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= -github.com/remyoudompheng/bigfft v0.0.0-20190321074620-2f0d2b0e0001/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20190728182440-6a916e37a237 h1:HQagqIiBmr8YXawX/le3+O26N+vPPC1PtjaF3mwnook= github.com/remyoudompheng/bigfft v0.0.0-20190728182440-6a916e37a237/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= @@ -297,11 +285,8 @@ github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shirou/gopsutil v2.18.12+incompatible h1:1eaJvGomDnH74/5cF4CTmTbLHAriGFsTZppLXDX93OM= -github.com/shirou/gopsutil v2.18.12+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shirou/gopsutil/v3 v3.20.11 h1:NeVf1K0cgxsWz+N3671ojRptdgzvp7BXL3KV21R0JnA= github.com/shirou/gopsutil/v3 v3.20.11/go.mod h1:igHnfak0qnw1biGeI2qKQvu0ZkwvEkUcCLlYhZzdr/4= -github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= @@ -327,7 +312,6 @@ github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.3.1/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk= github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= @@ -345,18 +329,13 @@ github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69 github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 h1:LnC5Kc/wtumK+WB441p7ynQJzVuNRJiqddSIE3IlSEQ= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/uber-go/atomic v1.4.0/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g= -github.com/uber/jaeger-client-go v2.16.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-client-go v2.25.0+incompatible h1:IxcNZ7WRY1Y3G4poYlx24szfsn/3LvK9QHCq9oQw8+U= github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= -github.com/uber/jaeger-lib v2.0.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/uber/jaeger-lib v2.4.0+incompatible h1:fY7QsGQWiCt8pajv4r7JEvmATdCVaWxXbjwyYwsNaLQ= github.com/uber/jaeger-lib v2.4.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/zeebo/assert v1.1.0 h1:hU1L1vLTHsnO8x8c9KAR5GmM5QscxHg5RNU5z5qbUWY= @@ -379,9 +358,7 @@ go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -427,7 +404,6 @@ golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190424112056-4829fb13d2c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= @@ -456,12 +432,10 @@ golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190429190828-d89cdac9e872/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/pg/protocol.go b/pg/protocol.go index 041c331a4..29dd62638 100644 --- a/pg/protocol.go +++ b/pg/protocol.go @@ -258,8 +258,10 @@ type Result struct { } type PgType byte +// Constants used to indicated query interception +// Only pgPassOn is allowed to be processed in Featurebase query handling const ( - pgNotPg PgType = 'x' + pgPassOn PgType = 'x' pgBackendPid PgType = 'a' pgVersion PgType = 'b' pgCountType PgType = 'c' @@ -291,7 +293,7 @@ func (p *Portal) Reset() { vprint.VV("Portal Reset") p.Name = "" p.sql = "" - p.pgspecial = pgNotPg + p.pgspecial = pgPassOn p.commands = p.commands[:0] } @@ -335,6 +337,7 @@ func (p *Portal) Parse(data []byte) { case sql.SQLTypeSet: p.Name = "SET" set := query.Statement.(*sqlparser.Set) + p.pgspecial = 0 for _, item := range set.Exprs { vprint.VV("SET name=(%v) ", item.Name) if item.Name.String() == "application_name" { @@ -348,7 +351,7 @@ func (p *Portal) Parse(data []byte) { } case sql.SQLTypeSelect: p.Name = "SELECT" - p.pgspecial = pgNotPg + p.pgspecial = pgPassOn stmt := query.Statement.(*sqlparser.Select) for _, item := range stmt.SelectExprs { switch expr := item.(type) { @@ -360,12 +363,9 @@ func (p *Portal) Parse(data []byte) { case "pg_backend_pid": //SELECT pg_backend_pid() p.pgspecial = pgBackendPid - //p.encoder.RowDescription() //TODO(twg) move to the right spt case "pg_terminate_backend": - //need the arg 100 //select pg_terminate_backend(100) vprint.VV("terminate %#v", colExpr.Exprs) - //colExpr.Exprs[0] p.pgspecial = pgTerminate case "version": //SELECT VERSION() AS version @@ -395,20 +395,15 @@ func (p *Portal) Parse(data []byte) { } p.sql = string(b) case sql.SQLTypeBegin: + // Ignore BEGIN p.pgspecial = pgBegin - // panic("TODO") - // ingnore for now case sql.SQLTypeShow: p.Name = "SHOW" - p.pgspecial = pgNotPg + p.pgspecial = pgPassOn p.sql = string(b) } } } - // TODO (twg) hack parsing for short term - // parts := strings.Split(strings.TrimSuffix(string(data), "\x00"), " ") - // p.Name = parts[0][1:] //TODO (twg) major hack - vprint.VV("PG SET:(%v)", p.pgspecial) } else { vprint.VV("SETTING EMPTY") p.pgspecial = pgEmpty @@ -428,14 +423,15 @@ func (p *Portal) Describe() { */ } -func (p *Portal) Execute() (shouldTerminate bool, queryReady bool) { +func (p *Portal) Execute() (shouldTerminate bool, queryReady bool, err error) { queryReady = true vprint.VV("port.Execute: (%v) q=(%v)", p.pgspecial, p.sql) switch p.pgspecial { case pgBackendPid: - rowDescription, err := p.Encoder.EncodeColumn("pg_backend_pid", int32(23), 4) - if err != nil { - panic(err) + rowDescription, e := p.Encoder.EncodeColumn("pg_backend_pid", int32(23), 4) + if e != nil { + err = e + return } p.Add(rowDescription) pid := fmt.Sprintf("%v", p.pid) @@ -443,31 +439,30 @@ func (p *Portal) Execute() (shouldTerminate bool, queryReady bool) { p.Add(dataRow) //needs data row with cancel token case pgVersion: - rowDescription, err := p.Encoder.EncodeColumn("version", int32(25), -1) - if err != nil { - panic(err) + rowDescription, e := p.Encoder.EncodeColumn("version", int32(25), -1) + if e != nil { + err = e + return } p.Add(rowDescription) dataRow, _ := p.Encoder.TextRow("PostgresSQL 13.0 (molecula)") p.Add(dataRow) case pgSelect1: - rowDescription, err := p.Encoder.EncodeColumn("?column?", int32(23), 4) - if err != nil { - panic(err) + rowDescription, e := p.Encoder.EncodeColumn("?column?", int32(23), 4) + if e != nil { + err = e + return } p.Add(rowDescription) dataRow, _ := p.Encoder.TextRow("1") p.Add(dataRow) case pgCountType: //need to block - vprint.VV("blocking til terminated") <-p.server.lookerChannel - vprint.VV("Released") - //now need to send ParseComplete,BindComplete,RowDescription,Error(Terminate) - //TODO(twg) handle the error - rowDescription, err := p.Encoder.EncodeColumn("count", int32(20), 8) + rowDescription, e := p.Encoder.EncodeColumn("count", int32(20), 8) if err != nil { - panic(err) + err = e + return } p.Add(rowDescription) errorResponse, _ := p.Encoder.Error( @@ -485,52 +480,68 @@ func (p *Portal) Execute() (shouldTerminate bool, queryReady bool) { }, ) p.Add(errorResponse) - p.Sync() //send and Reset - return true, queryReady + e = p.Sync() //send and Reset + + if e != nil { + err = e + return + } + return true, queryReady, nil case pgQueryTime: // need to return something so that the id can be queried //need to return SELECT pid as id, query as stmt, EXTRACT(seconds from query_start - NOW()) as elapsed_time FROM pg_stat_activity //seems like we need a map of pids to querys - err := p.server.dumpPortalsTo(p) - if err != nil { + e := p.server.dumpPortalsTo(p) + if e != nil { + err = e return } case pgTerminate: //note just have 1 lock that blocks all who try to count the activities - vprint.VV("removing the block ") //TODO (twg) lock this close(p.server.lookerChannel) //release all the other blockers and allow them to terminate p.server.lookerChannel = make(chan struct{}) //create a new one just in case // i think it needs to return boolean true - rowDescription, err := p.Encoder.EncodeColumn("pg_terminate_backend", int32(16), 1) - if err != nil { - panic(err) + rowDescription, e := p.Encoder.EncodeColumn("pg_terminate_backend", int32(16), 1) + if e != nil { + err = e + return } p.Add(rowDescription) dataRow, _ := p.Encoder.TextRow("t") p.Add(dataRow) - commandComplete, _ := p.Encoder.CommandComplete("SELECT 1") + commandComplete, e := p.Encoder.CommandComplete("SELECT 1") + if e != nil { + err = e + return + } p.Add(commandComplete) - p.Sync() - return false, queryReady + e = p.Sync() + if e != nil { + err = e + return + } + return false, queryReady, nil case pgEmpty: p.Add(message.NoData) p.Add(message.EmptyQueryResponse) - p.Sync() + e := p.Sync() + if e != nil { + err = e + return + } queryReady = true - return false, queryReady + return false, queryReady, nil case pgSetApplication: //needs to add/send status - msg, err := p.Encoder.ParameterStatus("application_name", "PostgreSQL JDBC Driver") //TODO (twg) should be saved from parse - if err != nil { + msg, e := p.Encoder.ParameterStatus("application_name", "PostgreSQL JDBC Driver") + if e != nil { + err = e return } p.Add(msg) case pgSchema: - //need to add the descrition for the 3 fields - // ---[Field 01]--- name='table_schema' type=19 type_len=64 type_mod=4294967295 relid=13276 attnum=2 format=0 - // ---[Field 02]--- name='table_name' type=19 type_len=64 type_mod=4294967295 relid=13276 attnum=3 format=0 parts := []message.SimpleColumn{ { Name: "table_schema", @@ -543,27 +554,28 @@ func (p *Portal) Execute() (shouldTerminate bool, queryReady bool) { Typelen: 64, }, } - rowDescription, err := p.Encoder.EncodeColumns(parts...) - if err != nil { //TODO (twg) shadowing err + rowDescription, e := p.Encoder.EncodeColumns(parts...) + if e != nil { + err = e return } p.Add(rowDescription) - err = p.HandleSchema() - if err != nil { + e = p.HandleSchema() + if e != nil { + err = e return } - vprint.VV("SHOULd make schema") - case pgNotPg: - vprint.VV("GOOOO>(%v)", p.sql) + case pgPassOn: query := SimpleQuery(p.sql) - err := p.server.handleQuery(p, query, p.cancelNotify) - if err != nil { + e := p.server.handleQuery(p, query, p.cancelNotify) + if e != nil { + err = e return } + return case pgBegin: - vprint.VV("BEGIN") p.Name = "BEGIN" } @@ -571,25 +583,23 @@ func (p *Portal) Execute() (shouldTerminate bool, queryReady bool) { if len(p.Name) > 0 { //only send command complete for those that have names vprint.VV("EXECING NAME: '%v'", p.Name) message, _ := p.Encoder.CommandComplete(p.Name) - vprint.VV("AFTER") p.Add(message) } return } // handleStandard handles a connection in the standard postgres wire protocol. -func (p *Portal) Sync() { +func (p *Portal) Sync() error { for _, m := range p.commands { vprint.VV("Sending: '%v'", m.Type) err := p.Writer.WriteMessage(m) if err != nil { - //TODO (twg) need to change signature to return error - vprint.VV("error %v", err) - return + return err } } p.Writer.Flush() p.Reset() + return nil } func (p *Portal) Add(m message.Message) { cp := message.Message{Type: m.Type, Data: make([]byte, len(m.Data))} @@ -607,7 +617,6 @@ func (p *Portal) HandleSchema() error { return p.server.QueryHandler.HandleSchema(context.Background(), p) } -//implement the QueryResultWriterqueryResultR func (p *Portal) WriteMessage(m message.Message) error { p.Add(m) return nil @@ -637,7 +646,7 @@ func (s *Server) handleStandard(ctx context.Context, proto Protocol, conn net.Co if err != nil { return errors.Wrap(err, "parsing parameters") } - fmt.Printf("postgres connection params\n%#v\n", params) //TODO (twg) remove + vprint.VV("postgres connection params\n%#v\n", params) //TODO (twg) remove if user, ok := params["user"]; ok { // Log the connection. s.Logger.Debugf("new postgres connection from user %q at %v", user, conn.RemoteAddr()) @@ -647,7 +656,6 @@ func (s *Server) handleStandard(ctx context.Context, proto Protocol, conn net.Co } // Set up message input and output. - // Set up a reader that will preempt the connection when the context is canceled. ir := idleReader{ conn: conn, @@ -790,8 +798,6 @@ func (s *Server) handleStandard(ctx context.Context, proto Protocol, conn net.Co for { if !queryReady { // Indicate that we are ready for a query. - // TODO: provide a valid transaction state. - //msg, err := encoder.ReadyForQuery(message.TransactionStatusActive) portal.sql = "" msg, err := encoder.ReadyForQuery(message.TransactionStatusIdle) if err != nil { @@ -855,31 +861,30 @@ func (s *Server) handleStandard(ctx context.Context, proto Protocol, conn net.Co return w.Flush() case message.TypeParse: - fmt.Println("Type Parse", strings.Trim(string(msg.Data), "\x00")) + vprint.VV("Type Parse (%v)", strings.Trim(string(msg.Data), "\x00")) portal.Parse(msg.Data) case message.TypeBind: - fmt.Println("Type Bind", strings.Trim(string(msg.Data), "\x00")) - //TODO(twg) apply values to bindings in the future - // Parse the query message (a null-terminated string). + vprint.VV("Type Bind (%v)", strings.Trim(string(msg.Data), "\x00")) portal.Bind() case message.TypeExecute: - fmt.Println("Type Execute", strings.Trim(string(msg.Data), "\x00")) - //term, qr := portal.Execute() - term, qr := portal.Execute() + vprint.VV("Type Execute (%v)", strings.Trim(string(msg.Data), "\x00")) + term, qr, err := portal.Execute() + if err != nil { + return err + } if term { return w.Flush() } queryReady = qr case message.TypeSync: - fmt.Println("Type Sync", strings.Trim(string(msg.Data), "\x00")) - portal.Sync() + vprint.VV("Type Sync", strings.Trim(string(msg.Data), "\x00")) + err := portal.Sync() + if err != nil { + return err + } queryReady = false case message.TypeSimpleQuery: - // Execute a simple query. - queryReady = false - - // Parse the query message (a null-terminated string). query := SimpleQuery(strings.TrimSuffix(string(msg.Data), "\x00")) // Execute the query. @@ -887,16 +892,7 @@ func (s *Server) handleStandard(ctx context.Context, proto Protocol, conn net.Co if err != nil { return err } - label := "N/A" - switch msg.Data[0] { - case 'S': //prepared statement - label = "prepared statement" - case 'P': //portal - label = "portal" - } - vprint.VV("describe %v:'%v'", label, msg.Data[1:]) case message.TypeDescribe: - //TODO (twg) major hack alet portal.Describe() case message.TypeClose: return w.Flush() diff --git a/server/pg_test.go b/server/pg_test.go index 012986afc..bd8a88521 100644 --- a/server/pg_test.go +++ b/server/pg_test.go @@ -21,7 +21,7 @@ import ( "testing" "time" - "github.com/molecula/featurebase/v2" + pilosa "github.com/molecula/featurebase/v2" "github.com/molecula/featurebase/v2/logger" "github.com/molecula/featurebase/v2/pg" "github.com/molecula/featurebase/v2/pg/pgtest" @@ -33,7 +33,7 @@ func TestPostgresHandler(t *testing.T) { m := test.RunCommand(t) defer m.Close() - pgh := server.NewPostgresHandler(m.API, logger.NewLogfLogger(t)) + pgh := server.NewPostgresHandler(m.API, logger.NewLogfLogger(t), server.SqlV1) m.MustCreateIndex(t, "i", pilosa.IndexOptions{TrackExistence: true}) m.MustCreateField(t, "i", "set") From 5bc1364cdb42eb6af97cb3a362760111ad91be75 Mon Sep 17 00:00:00 2001 From: Todd Gruben Date: Thu, 23 Sep 2021 11:05:05 -0500 Subject: [PATCH 08/15] wip --- pg/protocol.go | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/pg/protocol.go b/pg/protocol.go index 29dd62638..3ea85ec1f 100644 --- a/pg/protocol.go +++ b/pg/protocol.go @@ -302,9 +302,16 @@ func (p *Portal) Bind() { } func (p *Portal) Parse(data []byte) { p.queryStart = time.Now() - b := bytes.Trim(data, "\x00") - vprint.VV("PARSE RAW: (%v) (%d)", string(b), len(b)) - if strings.Contains(string(b), "EXTRACT") { + queryStr := string(bytes.Trim(data, "\x00")) + vprint.VV("PARSE RAW: (%v) (%d)", queryStr, len(queryStr)) + if strings.HasPrefix(queryStr, "[") { + p.sql = queryStr + p.Name = "PQL" + p.pgspecial = pgPassOn + p.Add(message.ParseOK) + return + } + if strings.Contains(queryStr, "EXTRACT") { // had to add this hack because the vitis parser doesn't handle... /* SELECT pid as id, @@ -315,14 +322,14 @@ func (p *Portal) Parse(data []byte) { */ p.pgspecial = pgQueryTime p.Name = "SELECT" - p.sql = string(b) + p.sql = queryStr p.Add(message.ParseOK) return } - if len(b) > 2 { + if len(queryStr) > 2 { - query, err := p.mapper.MapSQL(string(b)) + query, err := p.mapper.MapSQL(queryStr) if err != nil { vprint.VV("Parse Err: '%v'", err) } else { @@ -393,14 +400,14 @@ func (p *Portal) Parse(data []byte) { } } } - p.sql = string(b) + p.sql = queryStr case sql.SQLTypeBegin: // Ignore BEGIN p.pgspecial = pgBegin case sql.SQLTypeShow: p.Name = "SHOW" p.pgspecial = pgPassOn - p.sql = string(b) + p.sql = queryStr } } } From fc339b9a62b26ef0e6068d631163f1ac0010cb2f Mon Sep 17 00:00:00 2001 From: Todd Gruben Date: Thu, 23 Sep 2021 12:02:29 -0500 Subject: [PATCH 09/15] skipp looker comments on PQL --- pg/protocol.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/pg/protocol.go b/pg/protocol.go index 3ea85ec1f..248ea6e77 100644 --- a/pg/protocol.go +++ b/pg/protocol.go @@ -25,6 +25,7 @@ import ( "io" "io/ioutil" "net" + "regexp" "strings" "sync" "time" @@ -304,8 +305,11 @@ func (p *Portal) Parse(data []byte) { p.queryStart = time.Now() queryStr := string(bytes.Trim(data, "\x00")) vprint.VV("PARSE RAW: (%v) (%d)", queryStr, len(queryStr)) - if strings.HasPrefix(queryStr, "[") { - p.sql = queryStr + lookPQL := regexp.MustCompile("\\[.*\\].*\\)\\z") + foundPQL := lookPQL.FindStringSubmatch(queryStr) + if len(foundPQL) > 0 { + + p.sql = foundPQL[0] p.Name = "PQL" p.pgspecial = pgPassOn p.Add(message.ParseOK) From 3baf15226ee7b983962cb7f53fffac64a34c154a Mon Sep 17 00:00:00 2001 From: Todd Gruben Date: Thu, 23 Sep 2021 12:09:42 -0500 Subject: [PATCH 10/15] make lookPQL a package var --- pg/protocol.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pg/protocol.go b/pg/protocol.go index 248ea6e77..d0e896975 100644 --- a/pg/protocol.go +++ b/pg/protocol.go @@ -301,11 +301,13 @@ func (p *Portal) Reset() { func (p *Portal) Bind() { p.Add(message.BindComplete) } + +var lookPQL = regexp.MustCompile(`\[.*\].*\)\z`) + func (p *Portal) Parse(data []byte) { p.queryStart = time.Now() queryStr := string(bytes.Trim(data, "\x00")) vprint.VV("PARSE RAW: (%v) (%d)", queryStr, len(queryStr)) - lookPQL := regexp.MustCompile("\\[.*\\].*\\)\\z") foundPQL := lookPQL.FindStringSubmatch(queryStr) if len(foundPQL) > 0 { From 2053319db0b17a065c3e80c3532a13129a539f01 Mon Sep 17 00:00:00 2001 From: Todd Gruben Date: Sat, 25 Sep 2021 13:50:10 -0500 Subject: [PATCH 11/15] silence reporting --- pg/protocol.go | 30 ++---------------------------- 1 file changed, 2 insertions(+), 28 deletions(-) diff --git a/pg/protocol.go b/pg/protocol.go index d0e896975..fdfce083e 100644 --- a/pg/protocol.go +++ b/pg/protocol.go @@ -32,7 +32,6 @@ import ( "github.com/molecula/featurebase/v2/pg/message" "github.com/molecula/featurebase/v2/sql" - "github.com/molecula/featurebase/v2/vprint" "github.com/pkg/errors" "vitess.io/vitess/go/vt/sqlparser" ) @@ -177,7 +176,6 @@ startup: // Reject the unsecured connection. return errors.Errorf("client at %s attempted to initiate an unsecured postgres conenction", conn.RemoteAddr()) } - vprint.VV("TProcotcol: %v", proto) switch proto { case ProtocolCancel: @@ -217,7 +215,6 @@ func parseParams(data []byte) (map[string]string, error) { // handleCancel handles cancel request connections. func (s *Server) handleCancel(ctx context.Context, conn net.Conn, data []byte) error { - vprint.VV("handle cancel") if len(data) != 8 { return errors.New("malformed cancellation packet") } @@ -229,7 +226,6 @@ func (s *Server) handleCancel(ctx context.Context, conn net.Conn, data []byte) e pid := int32(binary.BigEndian.Uint32(data[:4])) key := int32(binary.BigEndian.Uint32(data[4:])) - vprint.VV("cancel pid:%v key:%v", pid, key) err := s.CancellationManager.Cancel(CancellationToken{PID: pid, Key: key}) switch err { case nil: @@ -291,7 +287,6 @@ type Portal struct { } func (p *Portal) Reset() { - vprint.VV("Portal Reset") p.Name = "" p.sql = "" p.pgspecial = pgPassOn @@ -307,7 +302,6 @@ var lookPQL = regexp.MustCompile(`\[.*\].*\)\z`) func (p *Portal) Parse(data []byte) { p.queryStart = time.Now() queryStr := string(bytes.Trim(data, "\x00")) - vprint.VV("PARSE RAW: (%v) (%d)", queryStr, len(queryStr)) foundPQL := lookPQL.FindStringSubmatch(queryStr) if len(foundPQL) > 0 { @@ -337,12 +331,10 @@ func (p *Portal) Parse(data []byte) { query, err := p.mapper.MapSQL(queryStr) if err != nil { - vprint.VV("Parse Err: '%v'", err) + return } else { - vprint.VV("TODD Query: %#v", query.SQL) if strings.Contains(strings.ToLower(query.SQL), "select 1") { - vprint.VV("SQL1") p.pgspecial = pgSelect1 p.Name = "SELECT" } else { @@ -352,12 +344,9 @@ func (p *Portal) Parse(data []byte) { set := query.Statement.(*sqlparser.Set) p.pgspecial = 0 for _, item := range set.Exprs { - vprint.VV("SET name=(%v) ", item.Name) if item.Name.String() == "application_name" { - vprint.VV("SET expr=(%#v) ", item.Expr) - switch val := item.Expr.(type) { + switch item.Expr.(type) { case *sqlparser.SQLVal: - vprint.VV("getting %v (%v)", val.Type, string(val.Val)) p.pgspecial = pgSetApplication } } @@ -378,7 +367,6 @@ func (p *Portal) Parse(data []byte) { p.pgspecial = pgBackendPid case "pg_terminate_backend": //select pg_terminate_backend(100) - vprint.VV("terminate %#v", colExpr.Exprs) p.pgspecial = pgTerminate case "version": //SELECT VERSION() AS version @@ -395,7 +383,6 @@ func (p *Portal) Parse(data []byte) { switch from := item.(type) { case *sqlparser.AliasedTableExpr: tableName := from.Expr.(sqlparser.TableName).ToViewName().Name.String() - vprint.VV("looking at (%v)", tableName) switch tableName { case "pg_type": p.pgspecial = pgCountType @@ -418,7 +405,6 @@ func (p *Portal) Parse(data []byte) { } } } else { - vprint.VV("SETTING EMPTY") p.pgspecial = pgEmpty } p.Add(message.ParseOK) @@ -438,7 +424,6 @@ func (p *Portal) Describe() { } func (p *Portal) Execute() (shouldTerminate bool, queryReady bool, err error) { queryReady = true - vprint.VV("port.Execute: (%v) q=(%v)", p.pgspecial, p.sql) switch p.pgspecial { case pgBackendPid: rowDescription, e := p.Encoder.EncodeColumn("pg_backend_pid", int32(23), 4) @@ -594,7 +579,6 @@ func (p *Portal) Execute() (shouldTerminate bool, queryReady bool, err error) { //maybe add in the number of items in select clause if len(p.Name) > 0 { //only send command complete for those that have names - vprint.VV("EXECING NAME: '%v'", p.Name) message, _ := p.Encoder.CommandComplete(p.Name) p.Add(message) } @@ -604,7 +588,6 @@ func (p *Portal) Execute() (shouldTerminate bool, queryReady bool, err error) { // handleStandard handles a connection in the standard postgres wire protocol. func (p *Portal) Sync() error { for _, m := range p.commands { - vprint.VV("Sending: '%v'", m.Type) err := p.Writer.WriteMessage(m) if err != nil { return err @@ -659,7 +642,6 @@ func (s *Server) handleStandard(ctx context.Context, proto Protocol, conn net.Co if err != nil { return errors.Wrap(err, "parsing parameters") } - vprint.VV("postgres connection params\n%#v\n", params) //TODO (twg) remove if user, ok := params["user"]; ok { // Log the connection. s.Logger.Debugf("new postgres connection from user %q at %v", user, conn.RemoteAddr()) @@ -773,7 +755,6 @@ func (s *Server) handleStandard(ctx context.Context, proto Protocol, conn net.Co return errors.Wrap(err, "sending parameter status server version") } - vprint.VV("CancellationManger: %v", s.CancellationManager) var cancelNotify <-chan struct{} var pid int32 if s.CancellationManager != nil { @@ -874,13 +855,10 @@ func (s *Server) handleStandard(ctx context.Context, proto Protocol, conn net.Co return w.Flush() case message.TypeParse: - vprint.VV("Type Parse (%v)", strings.Trim(string(msg.Data), "\x00")) portal.Parse(msg.Data) case message.TypeBind: - vprint.VV("Type Bind (%v)", strings.Trim(string(msg.Data), "\x00")) portal.Bind() case message.TypeExecute: - vprint.VV("Type Execute (%v)", strings.Trim(string(msg.Data), "\x00")) term, qr, err := portal.Execute() if err != nil { return err @@ -890,7 +868,6 @@ func (s *Server) handleStandard(ctx context.Context, proto Protocol, conn net.Co } queryReady = qr case message.TypeSync: - vprint.VV("Type Sync", strings.Trim(string(msg.Data), "\x00")) err := portal.Sync() if err != nil { return err @@ -912,7 +889,6 @@ func (s *Server) handleStandard(ctx context.Context, proto Protocol, conn net.Co default: // The message is not supported yet. // Send an error. - vprint.VV("unrecognized postgres packet %v", msg) s.Logger.Errorf("unrecognized postgres packet %v", msg) msg, err = encoder.Error( message.NoticeField{ @@ -992,7 +968,6 @@ func (s *Server) dumpPortalsTo(p *Portal) error { p.Add(rowDescription) for _, portal := range s.portals { - vprint.VV("port: %v (%v) %v", portal.pid, portal.sql, time.Since(portal.queryStart)) dataRow, err := p.Encoder.TextRow( fmt.Sprintf("%v", portal.pid), portal.sql, @@ -1052,7 +1027,6 @@ func (s *Server) handleQuery(w message.Writer, query Query, cancelNotify <-chan te: s.TypeEngine, tag: "SELECT", } - vprint.VV("handle Query: (%v)", query) // Dispatch the query handler. qerr := s.QueryHandler.HandleQuery(ctx, qwriter, query) if qerr != nil { From c4e64528e035b68ab9e957b501c5c24eab7ea8df Mon Sep 17 00:00:00 2001 From: Todd Gruben Date: Sat, 25 Sep 2021 13:56:36 -0500 Subject: [PATCH 12/15] fix --- planner.go | 1 - 1 file changed, 1 deletion(-) diff --git a/planner.go b/planner.go index e60d628ef..985a92001 100644 --- a/planner.go +++ b/planner.go @@ -23,7 +23,6 @@ import ( "github.com/molecula/featurebase/v2/pql" "github.com/molecula/featurebase/v2/sql2" - "github.com/molecula/featurebase/v2/vprint" ) type Planner struct { From 0920c4c029acde5c96b3e966a8df922242a10ce1 Mon Sep 17 00:00:00 2001 From: Todd Gruben Date: Sat, 25 Sep 2021 14:06:55 -0500 Subject: [PATCH 13/15] silence and rebase --- server/pg.go | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/server/pg.go b/server/pg.go index 4f59caaad..8b7d6478f 100644 --- a/server/pg.go +++ b/server/pg.go @@ -28,7 +28,6 @@ import ( pilosa "github.com/molecula/featurebase/v2" "github.com/molecula/featurebase/v2/logger" "github.com/molecula/featurebase/v2/pg" - "github.com/molecula/featurebase/v2/vprint" //"github.com/molecula/featurebase/v2/pg" "github.com/molecula/featurebase/v2/pql" @@ -346,13 +345,11 @@ func pgWriteStmtRows(w pg.QueryResultWriter, rows *pilosa.StmtRows) error { for rows.Next() { if first { columns := rows.Columns() - vprint.VV("ROW=> %#v", rows.Row()) //TODO (twg) types:=rows.Types() headers := make([]pg.ColumnInfo, len(columns)) - vprint.VV("got columns %v", columns) for i, column := range columns { headers[i] = pg.ColumnInfo{ - Name: column, + Name: column.Name, Type: pg.TypeCharoid, //TODO(twg) types[i] } } @@ -364,7 +361,6 @@ func pgWriteStmtRows(w pg.QueryResultWriter, rows *pilosa.StmtRows) error { data = make([]string, len(headers)) first = false } - vprint.VV("got row") result := make([]interface{}, len(rows.Columns())) // Create list of scan destination pointers. dsts := make([]interface{}, len(result)) @@ -559,7 +555,6 @@ func (pqh *PilosaQueryHandler) HandleQuery(ctx context.Context, w pg.QueryResult case pg.SimpleQuery: if pqh.sqlVersion == SqlV2 { stmt, err := pqh.Api.Plan(ctx, string(q)) - vprint.VV("SQL2Plan: (%v) (%v)", string(q), err) if err != nil { return err } From ed1cf7ffef85d92afb8aebd6f9efad2375a1ce4d Mon Sep 17 00:00:00 2001 From: Todd Gruben Date: Mon, 27 Sep 2021 07:05:08 -0500 Subject: [PATCH 14/15] cleanup and applied review suggestions --- go.mod | 2 +- pg/message/io.go | 2 - pg/message/message.go | 6 +- pg/protocol.go | 156 +++++++++++++++++++----------------------- planner.go | 3 +- 5 files changed, 78 insertions(+), 91 deletions(-) diff --git a/go.mod b/go.mod index e590bdd1b..d64a32730 100644 --- a/go.mod +++ b/go.mod @@ -54,7 +54,7 @@ require ( golang.org/x/sys v0.0.0-20210510120138-977fb7262007 // indirect golang.org/x/text v0.3.5 // indirect google.golang.org/grpc v1.28.0 - gopkg.in/yaml.v2 v2.3.0 // indirect + gopkg.in/yaml.v2 v2.3.0 modernc.org/mathutil v1.0.0 modernc.org/strutil v1.0.0 sigs.k8s.io/yaml v1.2.0 // indirect diff --git a/pg/message/io.go b/pg/message/io.go index ec2321675..e09150b9d 100644 --- a/pg/message/io.go +++ b/pg/message/io.go @@ -18,7 +18,6 @@ import ( "bufio" "encoding/binary" "errors" - "fmt" "io" ) @@ -93,7 +92,6 @@ type WireWriter struct { // WriteMessage writes a message onto the wire. func (w *WireWriter) WriteMessage(message Message) error { - fmt.Printf("SendToClient %c (%d)\n", message.Type, len(message.Data)) if uint(len(message.Data))+4 >= 1<<31 { return ErrMessageTooBig } diff --git a/pg/message/message.go b/pg/message/message.go index 757053297..9fb6871ee 100644 --- a/pg/message/message.go +++ b/pg/message/message.go @@ -30,7 +30,7 @@ const ( // TypeReadyForQuery is a message used to indicate that the server is ready for another query. TypeReadyForQuery Type = 'Z' - // TypeCommandComplete is a message used to indicate that a query has completed. Backend + // TypeCommandComplete is a Backend message used to indicate that a query has completed. TypeCommandComplete Type = 'C' // TypeClos is a message used to indicate that a query has completed. Frontend @@ -60,8 +60,8 @@ const ( TypeBind Type = 'B' TypeBindComplete Type = '2' - TypeExecute Type = 'E' // Frontend TODO(TWG) - TypeError Type = 'E' // Backend SOMETHING NOT RIGHT HERE + TypeExecute Type = 'E' // Frontend + TypeError Type = 'E' // Backend TypeSync Type = 'S' // Frontend TypeParameterStatus Type = 'S' // Backend TypeDescribe Type = 'D' // Frontend diff --git a/pg/protocol.go b/pg/protocol.go index fdfce083e..0fa52a5e9 100644 --- a/pg/protocol.go +++ b/pg/protocol.go @@ -272,12 +272,11 @@ const ( ) type Portal struct { - Name string - Writer *message.WireWriter - commands []message.Message - Encoder *message.Encoder - mapper *sql.Mapper - //results []Result + Name string + Writer *message.WireWriter + commands []message.Message + Encoder *message.Encoder + mapper *sql.Mapper sql string pgspecial PgType pid int32 @@ -332,76 +331,75 @@ func (p *Portal) Parse(data []byte) { query, err := p.mapper.MapSQL(queryStr) if err != nil { return + } + + if strings.Contains(strings.ToLower(query.SQL), "select 1") { + p.pgspecial = pgSelect1 + p.Name = "SELECT" } else { - - if strings.Contains(strings.ToLower(query.SQL), "select 1") { - p.pgspecial = pgSelect1 - p.Name = "SELECT" - } else { - switch query.SQLType { - case sql.SQLTypeSet: - p.Name = "SET" - set := query.Statement.(*sqlparser.Set) - p.pgspecial = 0 - for _, item := range set.Exprs { - if item.Name.String() == "application_name" { - switch item.Expr.(type) { - case *sqlparser.SQLVal: - p.pgspecial = pgSetApplication - } + switch query.SQLType { + case sql.SQLTypeSet: + p.Name = "SET" + set := query.Statement.(*sqlparser.Set) + p.pgspecial = 0 + for _, item := range set.Exprs { + if item.Name.String() == "application_name" { + switch item.Expr.(type) { + case *sqlparser.SQLVal: + p.pgspecial = pgSetApplication } } - case sql.SQLTypeSelect: - p.Name = "SELECT" - p.pgspecial = pgPassOn - stmt := query.Statement.(*sqlparser.Select) - for _, item := range stmt.SelectExprs { - switch expr := item.(type) { - case *sqlparser.AliasedExpr: - switch colExpr := expr.Expr.(type) { - case *sqlparser.FuncExpr: - funcName := strings.ToLower(colExpr.Name.String()) - switch funcName { - case "pg_backend_pid": - //SELECT pg_backend_pid() - p.pgspecial = pgBackendPid - case "pg_terminate_backend": - //select pg_terminate_backend(100) - p.pgspecial = pgTerminate - case "version": - //SELECT VERSION() AS version - p.pgspecial = pgVersion - } - //need to return the pid from the cancelation object - //add row description object - //add data row for item - } - } - - } - for _, item := range stmt.From { - switch from := item.(type) { - case *sqlparser.AliasedTableExpr: - tableName := from.Expr.(sqlparser.TableName).ToViewName().Name.String() - switch tableName { - case "pg_type": - p.pgspecial = pgCountType - case "pg_stat_activity": - p.pgspecial = pgQueryTime - case "tables": - p.pgspecial = pgSchema - } - } - } - p.sql = queryStr - case sql.SQLTypeBegin: - // Ignore BEGIN - p.pgspecial = pgBegin - case sql.SQLTypeShow: - p.Name = "SHOW" - p.pgspecial = pgPassOn - p.sql = queryStr } + case sql.SQLTypeSelect: + p.Name = "SELECT" + p.pgspecial = pgPassOn + stmt := query.Statement.(*sqlparser.Select) + for _, item := range stmt.SelectExprs { + switch expr := item.(type) { + case *sqlparser.AliasedExpr: + switch colExpr := expr.Expr.(type) { + case *sqlparser.FuncExpr: + funcName := strings.ToLower(colExpr.Name.String()) + switch funcName { + case "pg_backend_pid": + //SELECT pg_backend_pid() + p.pgspecial = pgBackendPid + case "pg_terminate_backend": + //select pg_terminate_backend(100) + p.pgspecial = pgTerminate + case "version": + //SELECT VERSION() AS version + p.pgspecial = pgVersion + } + //need to return the pid from the cancelation object + //add row description object + //add data row for item + } + } + + } + for _, item := range stmt.From { + switch from := item.(type) { + case *sqlparser.AliasedTableExpr: + tableName := from.Expr.(sqlparser.TableName).ToViewName().Name.String() + switch tableName { + case "pg_type": + p.pgspecial = pgCountType + case "pg_stat_activity": + p.pgspecial = pgQueryTime + case "tables": + p.pgspecial = pgSchema + } + } + } + p.sql = queryStr + case sql.SQLTypeBegin: + // Ignore BEGIN + p.pgspecial = pgBegin + case sql.SQLTypeShow: + p.Name = "SHOW" + p.pgspecial = pgPassOn + p.sql = queryStr } } } else { @@ -410,18 +408,9 @@ func (p *Portal) Parse(data []byte) { p.Add(message.ParseOK) } func (p *Portal) Describe() { - /* - if p.pgspecial != pgNotPg { - //do custom handling for setup - } - if len(p.results) == 0 { - p.Add(&message.NoData) - p.Add(&message.EmptyQueryResponse) - return - } - */ - + // Placeholder should we need to handle the Decribe request } + func (p *Portal) Execute() (shouldTerminate bool, queryReady bool, err error) { queryReady = true switch p.pgspecial { @@ -824,7 +813,6 @@ func (s *Server) handleStandard(ctx context.Context, proto Protocol, conn net.Co // Read the next packet. msg, err := r.ReadMessage() - msg.Dump("start-") // TODO(twg) remove if err != nil { if err == errPreempted { // The server is shutting down. diff --git a/planner.go b/planner.go index 985a92001..196bfa817 100644 --- a/planner.go +++ b/planner.go @@ -645,10 +645,11 @@ func (rs *StmtRows) Columns() []*StmtColumn { return rs.node.Columns() } + /* func (rs *StmtRows) Row() int64 { return rs.node.Row()[0].(int64) } - + */ func (rs *StmtRows) Next() bool { if rs.err != nil { return false From c2caa6397899eb60f844baf10dd3be2809e14a64 Mon Sep 17 00:00:00 2001 From: Todd Gruben Date: Mon, 27 Sep 2021 08:20:03 -0500 Subject: [PATCH 15/15] tidy --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index d64a32730..e590bdd1b 100644 --- a/go.mod +++ b/go.mod @@ -54,7 +54,7 @@ require ( golang.org/x/sys v0.0.0-20210510120138-977fb7262007 // indirect golang.org/x/text v0.3.5 // indirect google.golang.org/grpc v1.28.0 - gopkg.in/yaml.v2 v2.3.0 + gopkg.in/yaml.v2 v2.3.0 // indirect modernc.org/mathutil v1.0.0 modernc.org/strutil v1.0.0 sigs.k8s.io/yaml v1.2.0 // indirect