Skip to content

fix initialization of pgspHashKey structure #40

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

SeleznevPavel
Copy link

The size of the key used in the hash table is sizeof(pgspHashKey) = 24.

The hash is calculated for 24 bytes, but the key consists of Oid + Oid + queryid_t + uint32 = 4 + 4 + 8 + 4 = 20 bytes. Memory in pgsp_store is allocated on the stack, uninitialized and filled for 20 bytes, respectively, garbage remains in the remaining 4 bytes.

This leads to the fact that different hashes were obtained from the same key, so there was no query aggregation - each time a new entry was added to the hash table.

@SeleznevPavel
Copy link
Author

@rjuju can i ask you to do a review?

@rjuju rjuju self-assigned this Jan 17, 2025
@rjuju rjuju self-requested a review January 17, 2025 19:27
Copy link
Collaborator

@rjuju rjuju left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the PR. I agree with the bugfix, just a couple of minor modifications for consistency.

@@ -1216,6 +1216,8 @@ pgsp_store(char *plan, queryid_t queryId,

Assert(plan != NULL && queryId != PGSP_NO_QUERYID);

memset(&key, 0, sizeof(pgspHashKey));
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should be ifdef'd for pg11+ as until pg10 it was still a uint32, since the rest of the code correctly handle the version change.

@@ -1292,7 +1294,7 @@ pgsp_store(char *plan, queryid_t queryId,
/* shorten_plan is terminated by NUL */
if (plan_storage == PLAN_STORAGE_SHMEM)
memcpy(SHMEM_PLAN_PTR(entry), shorten_plan, plan_len + 1);

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: you could just remove this line as there is another newline just after.

@rjuju rjuju added the bug label Feb 5, 2025
@rjuju rjuju removed their assignment Feb 28, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants