PG-150: Logging CMD Type like SELECT, UPDATE, INSERT, DELETE.

pull/66/head
Ibrar Ahmed 2020-12-06 16:38:48 +00:00
parent 379fcdefd5
commit 47ad105011
4 changed files with 30 additions and 33 deletions

View File

@ -341,23 +341,20 @@ SELECT relations::oid[]::regclass[], query FROM pg_stat_monitor;
**`cmd_type`**: List the command type of the query.
```sql
SELECT substr(query,0, 50) AS query, cmd_type FROM pg_stat_monitor WHERE elevel = 0;
                       query                       |    cmd_type    
---------------------------------------------------+-----------------
 BEGIN                                             | {INSERT}
 vacuum pgbench_branches                           | {}
 UPDATE pgbench_branches SET bbalance = bbalance + | {UPDATE,SELECT}
 select substr(query,$1, $2) as query, cmd_type fr | {SELECT}
 select count(*) from pgbench_branches             | {SELECT}
 select substr(query,$1, $2) as query, cmd_type fr | {}
 UPDATE pgbench_accounts SET abalance = abalance + | {UPDATE,SELECT}
 update test SET a = $1                            | {UPDATE}
 END                                               | {INSERT}
 INSERT INTO pgbench_history (tid, bid, aid, delta | {INSERT}
 vacuum pgbench_tellers                            | {}
 SELECT a from test for update                     | {UPDATE,SELECT}
 SELECT abalance FROM pgbench_accounts WHERE aid = | {SELECT}
 UPDATE pgbench_tellers SET tbalance = tbalance +  | {UPDATE,SELECT}
 truncate pgbench_history                          | {}
(15 rows)
postgres=# SELECT bucket, substr(query,0, 50) AS query, cmd_type FROM pg_stat_monitor WHERE elevel = 0;
bucket | query | cmd_type
--------+---------------------------------------------------+----------
1 | vacuum analyze pgbench_history |
1 | alter table pgbench_tellers add primary key (tid) |
1 | insert into pgbench_tellers(tid,bid,tbalance) val | INSERT
1 | select * from tt for update | UPDATE
1 | update tt set a = $1 | UPDATE
1 | delete from tt | DELETE
1 | insert into pgbench_branches(bid,bbalance) values | INSERT
1 | begin |
1 | drop table if exists pgbench_accounts, pgbench_br |
1 | copy pgbench_accounts from stdin | INSERT
1 | create table pgbench_history(tid int,bid int,aid |
1 | SELECT bucket, substr(query,$1, $2) AS query, cmd | SELECT
(12 rows)
```

View File

@ -176,14 +176,12 @@ hash_query_entry_dealloc(int bucket)
HASH_SEQ_STATUS hash_seq;
pgssQueryEntry *entry;
printf ("--%d--", hash_get_num_entries(pgss_hash));
hash_seq_init(&hash_seq, pgss_query_hash);
while ((entry = hash_seq_search(&hash_seq)) != NULL)
{
if (entry->key.bucket_id == bucket)
entry = hash_search(pgss_query_hash, &entry->key, HASH_REMOVE, NULL);
}
printf ("--%d", hash_get_num_entries(pgss_hash));
}
/*

View File

@ -99,8 +99,12 @@ CREATE VIEW pg_stat_monitor AS SELECT
queryid,
query,
application_name,
(string_to_array(relations, ',')) relations,
(string_to_array(cmd_type, ',')) cmd_type,
(string_to_array(relations, ',')) AS relations,
CASE
WHEN query like 'BEGIN' THEN ''
WHEN query like 'END' THEN ''
ELSE (string_to_array(cmd_type, ','))[1]
END AS cmd_type,
elevel,
sqlcode,
message,

View File

@ -465,14 +465,14 @@ pgss_ExecutorCheckPerms(List *rt, bool abort)
pgss->relations[i++] = rte->relid;
}
if (rte->requiredPerms & ACL_INSERT) snprintf(pgss->cmdTag[0],CMD_LEN,"%s", "INSERT");
if (rte->requiredPerms & ACL_UPDATE) snprintf(pgss->cmdTag[1],CMD_LEN,"%s", "UPDATE");
if (rte->requiredPerms & ACL_DELETE) snprintf(pgss->cmdTag[2],CMD_LEN,"%s", "DELETE");
if (rte->requiredPerms & ACL_SELECT) snprintf(pgss->cmdTag[3],CMD_LEN,"%s", "SELECT");
if (rte->requiredPerms & ACL_TRUNCATE) snprintf(pgss->cmdTag[4],CMD_LEN,"%s", "TRUNCATE");
if (rte->requiredPerms & ACL_REFERENCES) snprintf(pgss->cmdTag[5],CMD_LEN,"%s", "REFERENCES");
if (rte->requiredPerms & ACL_TRIGGER) snprintf(pgss->cmdTag[6],CMD_LEN,"%s", "TRIGGER");
if (rte->requiredPerms & ACL_EXECUTE) snprintf(pgss->cmdTag[7],CMD_LEN,"%s", "EXECUTE");
if (rte->requiredPerms & ACL_CREATE) snprintf(pgss->cmdTag[8],CMD_LEN,"%s", "CREATE");
else if (rte->requiredPerms & ACL_UPDATE) snprintf(pgss->cmdTag[1],CMD_LEN,"%s", "UPDATE");
else if (rte->requiredPerms & ACL_DELETE) snprintf(pgss->cmdTag[2],CMD_LEN,"%s", "DELETE");
else if (rte->requiredPerms & ACL_SELECT) snprintf(pgss->cmdTag[3],CMD_LEN,"%s", "SELECT");
else if (rte->requiredPerms & ACL_TRUNCATE) snprintf(pgss->cmdTag[4],CMD_LEN,"%s", "TRUNCATE");
else if (rte->requiredPerms & ACL_REFERENCES) snprintf(pgss->cmdTag[5],CMD_LEN,"%s", "REFERENCES");
else if (rte->requiredPerms & ACL_TRIGGER) snprintf(pgss->cmdTag[6],CMD_LEN,"%s", "TRIGGER");
else if (rte->requiredPerms & ACL_EXECUTE) snprintf(pgss->cmdTag[7],CMD_LEN,"%s", "EXECUTE");
else if (rte->requiredPerms & ACL_CREATE) snprintf(pgss->cmdTag[8],CMD_LEN,"%s", "CREATE");
}
LWLockRelease(pgss->lock);
@ -1255,7 +1255,6 @@ get_next_wbucket(pgssSharedState *pgss)
hash_query_entry_dealloc(bucket_id);
sprintf(file_name, "%s.%d", PGSM_TEXT_FILE, (int)bucket_id);
unlink(file_name);
printf("\nRemove file %s\n", file_name);
/* reset the query buffer */
memset(buf, 0, sizeof (uint64));
@ -2530,7 +2529,6 @@ dump_queries_buffer(int bucket_id, unsigned char *buf, int buf_len)
char file_name[1024];
sprintf(file_name, "%s.%d", PGSM_TEXT_FILE, bucket_id);
printf("\nWriting to %s\n", file_name);
fd = OpenTransientFile(file_name, O_RDWR | O_CREAT | O_APPEND | PG_BINARY);
if (fd < 0)
ereport(LOG,