Skip to content
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

Improve the processing of portal in the extend query. #32

Open
leeraya opened this issue Aug 12, 2021 · 1 comment
Open

Improve the processing of portal in the extend query. #32

leeraya opened this issue Aug 12, 2021 · 1 comment

Comments

@leeraya
Copy link
Contributor

leeraya commented Aug 12, 2021

Function Description

This is an enhanced feature. TIDB originally had the concept of portal and related processing. The definition of portal is in sessionctx/variable/session.go. The portal will save the name and its corresponding sentence ID.

In the process of rewriting TiDB for PostgreSQL, it is simplified in order to quickly read the running extension protocol.

TiDB for PostgreSQL's processing is mainly in server/conn_stmt.go. It can be seen that the processing is very simple, and the portal processing needs to be improved.

Task list

  1. Improve portal processing, the code is concentrated in server/conn_stmt.go.

Expected Results

Portal's functions are more complete, and it can face complex expanded query situations

@pupillord
Copy link
Collaborator

Definition and use of ‘protal’ could reference documents: https://www.postgresql.org/docs/current/protocol-flow.html#PROTOCOL-FLOW-EXT-QUERY.

Query planning typically occurs when the Bind message is processed. If the prepared statement has no parameters, or is executed repeatedly, the server might save the created plan and re-use it during subsequent Bind messages for the same prepared statement. However, it will do so only if it finds that a generic plan can be created that is not much less efficient than a plan that depends on the specific parameter values supplied. This happens transparently so far as the protocol is concerned.

If successfully created, a named portal object lasts till the end of the current transaction, unless explicitly destroyed. An unnamed portal is destroyed at the end of the transaction, or as soon as the next Bind statement specifying the unnamed portal as destination is issued. (Note that a simple Query message also destroys the unnamed portal.) Named portals must be explicitly closed before they can be redefined by another Bind message, but this is not required for the unnamed portal. Named portals can also be created and accessed at the SQL command level, using DECLARE CURSOR and FETCH.

Once a portal exists, it can be executed using an Execute message. The Execute message specifies the portal name (empty string denotes the unnamed portal) and a maximum result-row count (zero meaning “fetch all rows”). The result-row count is only meaningful for portals containing commands that return row sets; in other cases the command is always executed to completion, and the row count is ignored. The possible responses to Execute are the same as those described above for queries issued via simple query protocol, except that Execute doesn't cause ReadyForQuery or RowDescription to be issued.

If Execute terminates before completing the execution of a portal (due to reaching a nonzero result-row count), it will send a PortalSuspended message; the appearance of this message tells the frontend that another Execute should be issued against the same portal to complete the operation. The CommandComplete message indicating completion of the source SQL command is not sent until the portal's execution is completed. Therefore, an Execute phase is always terminated by the appearance of exactly one of these messages: CommandComplete, EmptyQueryResponse (if the portal was created from an empty query string), ErrorResponse, or PortalSuspended.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants